图片的开操作

图片的开操作

  • 开 = 腐蚀 + 膨胀
  • 用于保留原结构, 去除干扰块
    opencv中有相关的API
CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst,
                                int op, InputArray kernel,
                                Point anchor = Point(-1,-1), int iterations = 1,
                                int borderType = BORDER_CONSTANT,
                                const Scalar& borderValue = morphologyDefaultBorderValue() );

当op参数为 MORPH_OPEN 就是一次开操作

For instance, an opening operation (#MORPH_OPEN) with two iterations is equivalent to apply
successively: erode -> erode -> dilate -> dilate (and not erode -> dilate -> erode -> dilate)

我自定义了一次:erode -> dilate

void morphologyOpenDemo(Mat& original, int shape, cv::Size size, cv::Point anchor);
void morphologyOpenDemo(Mat& original,int shape,cv::Size size,cv::Point anchor) 
{	
	if (original.empty()) 
	{
		cout << " can`t get this ph" << endl;
	}
	namedWindow("open_source_win",WINDOW_FREERATIO);
	imshow("open_source_win",original);
	Mat kernel = getStructuringElement(shape, size, anchor);
	Mat erode_result;
	erode(original, erode_result, kernel);
	Mat dst;
	dilate(erode_result, dst, kernel);
	namedWindow("open_dst_win", WINDOW_FREERATIO);
	imshow("open_dst_win", dst);
}

实验效果:

图片前后结构基本不变,画框部分干扰部分已经去除。

直接调用的结果示意图:

这里我迭代了两次,干扰部分基本完全消失。

        Mat dst;
	morphologyEx(src,dst,MORPH_OPEN,kernel,Point(-1,-1),2);
	imshow("open_dst", dst);

开操作 提取细节(顶帽)

  • 细节 = 原图 -开操作
	Mat tophat;
	morphologyEx(src, tophat, MORPH_TOPHAT, kernel);
	imshow("tophat_win", tophat);
	Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
	Mat dst;
	morphologyEx(src,dst,MORPH_OPEN,kernel,Point(-1,-1),2);
	imshow("open_dst", dst);

	Mat detail;
	subtract(src,dst,detail);
	imshow("open_detail", detail);

开操作去除干扰

先二值化然后开操作,这里二值化可以随意选择Canny之类,类梯度都可以。

	Mat gray, binary;
	cvtColor(src, gray, COLOR_BGR2GRAY);
	threshold(gray,binary,0,255,THRESH_BINARY_INV|THRESH_OTSU);
	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	imshow("binary_win", binary);
	Mat dst;
	morphologyEx(binary, dst, MORPH_OPEN, kernel, Point(-1, -1), 1);
	imshow("dst_win",dst);

实验效果:



本节代码地址:https://github.com/cyssmile/openCV_learning_notes/blob/master/opencv_test/opencv_036/opencv_036.cpp

posted @ 2020-03-31 14:08  cyssmile  阅读(285)  评论(0编辑  收藏  举报