opencv c++ 图像形态学操作

1、图像的形态学操作

        包括图像的腐蚀膨胀形态学梯度、顶帽、黑帽、分支主题、结构元素等操作。

        具体概念参考:(41条消息) 图像处理-形态学处理_Good@dz的博客-CSDN博客_图像处理 形态学

1.1、膨胀

        用3×3的核去扫描二值图像,当核与图像中的前景像素(值为1的像素)有交集时,则将二值图像中对应的卷积核中心位置的像素值置为1。

        拓展:卷积核可以为任意形状(除1×1),且重置点可以选用卷积核中的任意位置,有‘交集‘就对重置点位置像素置1。

        

 1.2、腐蚀

        用3×3的核去扫描二值图像,仅当核的与前景像素有完全重合区域时,将二值图像中对应的卷积核中心位置的像素保留,其余情况下,将中心位置的像素置0。

         拓展:卷积核可以为任意形状,且重置点可以选用卷积核中的任意位置。

        

         膨胀与腐蚀的区别:膨胀只要有交集就触发,而腐蚀必须是重置点与前景像素有完全重合区域才保留

1.3、开与闭

        开:腐蚀再膨胀,去除微小干扰块。

       

        闭:膨胀再腐蚀,填充闭合区域。

        

1.4、形态学梯度

        基本梯度:膨胀图 - 腐蚀图

        内梯度:原图 - 腐蚀图

        外梯度:膨胀图 - 原图

        这里opencv只能直接实现基本梯度,在使用API:morphologyEx  时,调用MORPH_GRADIENT方法即可。

        内梯度、外梯度没有直接的API,一般通过已有API间接实现

1.5、其余形态学操作

        顶帽:原图 - 开操作后的图

        黑帽:闭操作后的图 - 原图

        注:顶帽和黑帽操作用于获取图像中的微小细节

        击中击不中: 通过特定模板,仅当输入的图像中,有与模板一模一样的块时,被击中的输入图像区域才会被保留。

        使用API:morphologyEx  时,分别调用MORPH_TOPHAT 、MORPH_BLACKHAT、MORPH_HITMISS方法即可实现。

2、API

        定义核形状


Mat cv::getStructuringElement	(	int 	shape,
                                    Size 	ksize,
                                    Point 	anchor = Point(-1,-1) 
                                    )		


shape——核的形状,可以定义矩形,十字形等形状,如下:


ksize——大小
anchor ——锚定点,即前文中的重置点。

 注:当设计到保留横线或竖线时,可以将核定义成1×n或者n×1的形状,从而去除其余形状的线。

Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 1), Point(-1, -1));

        腐蚀:

void cv::erode	(	InputArray 	src,
                    OutputArray 	dst,
                    InputArray 	kernel,
                    Point 	anchor = Point(-1,-1),
                    int 	iterations = 1,
                    int 	borderType = BORDER_CONSTANT,
                    const Scalar & 	borderValue = morphologyDefaultBorderValue() 
                    )	

         膨胀:


void cv::dilate	(	InputArray 	src,
                    OutputArray 	dst,
                    InputArray 	kernel,
                    Point 	anchor = Point(-1,-1),
                    int 	iterations = 1,
                    int 	borderType = BORDER_CONSTANT,
                    const Scalar & 	borderValue = morphologyDefaultBorderValue() 
                    )	

        通用:

void cv::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 ——形态学操作选用,如下:


iterations——重复腐蚀和膨胀的次数。
borderType ——边界类型
borderValue ——Border value in case of a constant border. The default value has a special meaning. 

3、代码

3.1、腐蚀膨胀代码:

void erode_dilate(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	Mat binary;
	threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
	namedWindow("THRESH_OTSU", WINDOW_FREERATIO);
	imshow("THRESH_OTSU", binary);

	Mat dst1, dst2;
	//定义核
	int kernel_size = 5;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));
	//腐蚀
	erode(binary, dst1, kernel);
	namedWindow("erode", WINDOW_FREERATIO);
	imshow("erode", dst1);

	//膨胀
	dilate(binary, dst2, kernel);
	namedWindow("dilate", WINDOW_FREERATIO);
	imshow("dilate", dst2);
}

3.2、开闭:

void QuickDemo::open_close(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	Mat binary;
	threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
	namedWindow("THRESH_OTSU", WINDOW_FREERATIO);
	imshow("THRESH_OTSU", binary);

	Mat dst1, dst2;
	//定义核
	int kernel_size = 5;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));
	//开
	morphologyEx(binary, dst1, MORPH_OPEN, kernel, Point(-1, -1), 1, 0);
	namedWindow("MORPH_OPEN", WINDOW_FREERATIO);
	imshow("MORPH_OPEN", dst1);

	//闭、
	morphologyEx(binary, dst2, MORPH_CLOSE, kernel, Point(-1, -1), 1, 0);
	namedWindow("MORPH_CLOSE", WINDOW_FREERATIO);
	imshow("MORPH_CLOSE", dst2);
}

 3.3、形态学梯度

注:在边缘提取应用中,梯度边缘后,会再进行二值化,从而获取更好的边缘图像。

void QuickDemo::shape_gradient(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);

	Mat g1, g2, g3;
	Mat dst1, dst2;
	int kernel_size = 7;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));
	
	//基本梯度
	morphologyEx(gray, g1, MORPH_GRADIENT, kernel, Point(-1, -1), 1, 0);

	//膨胀
	morphologyEx(gray, dst1, MORPH_DILATE, kernel, Point(-1, -1), 1, 0);

	//腐蚀
	morphologyEx(gray, dst2, MORPH_ERODE, kernel, Point(-1, -1), 1, 0);

	//外梯度
	subtract(dst1, gray, g2);
	//内梯度
	subtract(gray, dst2, g3);

	namedWindow("基本梯度", WINDOW_FREERATIO);
	imshow("基本梯度", g1);

	namedWindow("外梯度", WINDOW_FREERATIO);
	imshow("外梯度", g2);

	namedWindow("内梯度", WINDOW_FREERATIO);
	imshow("内梯度", g3);

	//最后再进行二值化,获取更好的边缘图像,选用基本梯度示例
	Mat binary;
	threshold(g1, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
	namedWindow("二值化", WINDOW_FREERATIO);
	imshow("二值化", binary);
}

3.4、其余形态学操作(顶帽、黑帽、击中击不中)

         

void QuickDemo::other_method(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	Mat binary;
	threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
	namedWindow("二值化", WINDOW_FREERATIO);
	imshow("二值化", binary);

	Mat dst1, dst2, dst3;
	int kernel_size = 5;
	Mat kernel_1 = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));

	//顶帽
	morphologyEx(binary, dst1, MORPH_TOPHAT, kernel_1, Point(-1, -1), 1, 0);
	namedWindow("顶帽", WINDOW_FREERATIO);
	imshow("顶帽", dst1);
	//黑帽
	morphologyEx(binary, dst2, MORPH_BLACKHAT, kernel_1, Point(-1, -1), 1, 0);
	namedWindow("黑帽", WINDOW_FREERATIO);
	imshow("黑帽", dst2);

	//击中击不中
	Mat kernel_2 = getStructuringElement(MORPH_CROSS, Size(kernel_size, kernel_size), Point(-1, -1));
	morphologyEx(binary, dst3, MORPH_HITMISS, kernel_2, Point(-1, -1), 1, 0);
	namedWindow("击中击不中", WINDOW_FREERATIO);
	imshow("击中击不中", dst3);
}

 

 

 

C++ OpenCV中,形态学操作是一种图像处理技术,用于改变图像的形状和结构。形态学操作通常用于图像分割、去噪、边缘检测等应用中。 在进行形态学操作之前,我们需要获取图像的结构元素。结构元素类似于卷积核,它定义了形态学操作的形状和大小。在OpenCV中,我们可以使用getStructuringElement()函数来获取特定形状和大小的结构元素\[2\]。 getStructuringElement()函数的使用方式如下: ``` Mat element = getStructuringElement(shape, size); ``` 其中,shape参数指定结构元素的形状,可以是矩形、椭圆或十字形。size参数指定结构元素的大小。 获取到结构元素后,我们可以将其用于后续的形态学操作,例如腐蚀、膨胀、开运算、闭运算等。这些操作可以通过调用morphologyEx()函数来实现\[3\]。 morphologyEx()函数的使用方式如下: ``` morphologyEx(src, dst, op, kernel, anchor, iterations, borderType, borderValue); ``` 其中,src参数是输入图像,dst参数是输出图像,op参数指定形态学操作的类型,kernel参数是结构元素,anchor参数是结构元素的锚点,iterations参数是操作的迭代次数,borderType参数是边界处理方式,borderValue参数是边界像素的值。 通过使用getStructuringElement()函数获取结构元素,并结合morphologyEx()函数进行形态学操作,我们可以实现各种图像处理任务。 #### 引用[.reference_title] - *1* *2* [C++ opencv 图像形态学、膨胀、腐蚀、闭、开、顶帽、黑帽](https://blog.csdn.net/HWWH520/article/details/125015959)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [opencv c++ 图像形态学操作](https://blog.csdn.net/lucust/article/details/128207799)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值