opencv图像处理④

本文详细介绍了形态学中的腐蚀、膨胀、开闭运算、剃度运算和礼帽黑帽概念。通过实例展示了如何使用OpenCV进行腐蚀和膨胀操作去除图像毛边,并探讨了开闭运算在去噪和边缘保留中的作用。还涵盖了剃度运算和这两种特殊形态操作(礼帽和黑帽)的应用。
摘要由CSDN通过智能技术生成

目录

形态学—腐蚀操作

形态学—膨胀操作 

 开运算与闭运算

 剃度运算

 礼帽与黑帽


形态学—腐蚀操作

对于上示图像,发现有像毛一样的东西,如何去把它去掉?(erode函数)

首先我们先读取这张照片

img=cv2.imread('dige.png')

cv2.imshow('img',img)

cv2.waitKey(0)

cv2.destroyAllWindows()

#(5,5)是盒的大小

kernel=np.ones((5,5),np.uint8)

#iterations是迭代次数,即腐蚀次数

erosion=cv2.erode(img,kernel,iterations=1)

cv2.imshow('erosion',erosion)

cv2.waitKey(0)

cv2.destroyAllWindows()

 处理后的结果如下图,可以看到,毛边没有了,而且线条变细了

 

 

 形态腐蚀,即在一个盒内周围区域的颜色相同则不变,颜色不同(如圆的边缘部分的盒中有黑有白),就会将这个点腐蚀掉(变为黑色),每迭代一次就会腐蚀一次(圆越来越小)

 pie=cv2.imread('pie.png')

cv2.imshow('pie',pie)

cv2.waitKey(0)

cv2.destroyAllWindows()

kernel=np.ones((30,30),np.uint8)

erosion_1=cv2.erode(pie,kernel,iterations=1)

erosion_2=cv2.erode(pie,kernel,iterations=2)

erosion_3=cv2.erode(pie,kernel,iterations=3)

res=np.hstack((erosion_1,erosion_2,erosion_3))

cv2.imshow('res',res)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

形态学—膨胀操作 

 仍然采用迪哥图片,先读取图片,然后进行腐蚀操作,腐蚀后发现迪哥的线条变细了,然后开始进行膨胀操作。(dilate函数)

kernel =np.ones((3,3),np.uint8)

#dige_dilate为腐蚀之后的图像

dige_dilate=cv2.dilate(dige_erosion,kernel,iterations=1)

cv2.imshow('dilate',dige_dilate)

cv2.waitKey(0)

cv2.destroyAllWindows()

 膨胀操作,盒中框选到了白色,则将其置为白色,与腐蚀操作相反。

 pie=cv2.imread('pie.png')

kernel=np.ones((30,30),np.uint8)

dilate_1=cv2.dilate(pie,kernel,iterations=1)

dilate_2=cv2.dilate(pie,kernel,iterations=2)

dilate_3=cv2.dilate(pie,kernel,iterations=3)

res=np.hstack((dilate_1,dilate_2,dilate_3))

cv2.imshow('res',res)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

 开运算与闭运算

 两种参数,由下方两个指定

  • cv2.MORPH_OPEN
  • cv2.MORPH_CLOSE

#开:先腐蚀,再膨胀

img=cv2.imread('dige.png')

kernel=np.ones((5,5),np.uint8)

opening=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)

cv2.imshow('opening',opening)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

 

 

#闭:先膨胀,再腐蚀

img=cv2.imread('dige.png')

kernel=np.ones((5,5),np.uint8)

closing=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

cv2.imshow('closing',closing)

cv2.waitKey(0)

cv2.destroyAllWindows()

 先腐蚀再膨胀,可以去掉毛刺;先膨胀,再腐蚀,毛刺变的比以前还大了。

 剃度运算

剃度运算做三件事,一是对原始图像进行一个膨胀,二是对原始图像进行一个腐蚀,三是用膨胀的减去腐蚀的。(图像当中的减法)

#梯度=膨胀-腐蚀

pie=cv2.imread('pie.png')

kernel=np.ones((7,7),uint8)

dilate=cv2.dilate(pie,kernel,iterations=5)

erosion=cv2.erode(pie,kernel,iterations=5)

res=np.hstack((dilate,erosion))

 

cv2.imshow('res',res)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

 

  • cv2.MORPH_GRADIENT   梯度参数

gradient=cv2.morphologyEx(pie,cv2.MORPH_GRADIENT,kernel)

cv2.imshow('gradient',gradient)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

 

 礼帽与黑帽

  • cv2.MORPH_TOPHAT  礼帽=原始输入-开运算结果

如迪哥例子,原始输入带有毛边,开运算是先腐蚀再膨胀去掉了毛边,所以礼帽剩下的就是毛边

  • cv2.MORPH_BLACKHAT  黑帽=闭运算-原始输入 

闭运算是先膨胀再腐蚀,仍然带有毛边,减去原始输入,应剩下一个迪哥的轮廓

#礼帽

img=cv2.imread('dige.png')

tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)

 

cv2.imshow('tophat',tophat)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

 

#黑帽 

img=cv2.imread('dige.png')

blackhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)

cv2.imshow('blackhat',blackhat)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用OpenCV消除反光,可以使用开运算和闭运算两种图像形态学操作。在开运算中,先进行腐蚀操作,再进行膨胀操作,可以去除图像中的小型亮区。而闭运算则先进行膨胀操作,再进行腐蚀操作,可以填充图像中的小型暗区。通过组合使用这两种操作,可以有效消除图像中的反光。 首先,需要使用OpenCV库加载图像,并创建一个窗口来显示输入图像和输出图像。然后,使用getStructuringElement函数创建一个结构元素,该结构元素的大小和形状会影响到运算的效果。接下来,可以使用morphologyEx函数来进行开运算或闭运算操作。最后,将处理后的图像显示在输出窗口中。 以下是示例代码,演示了如何使用开运算和闭运算消除反光: ```cpp #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; void removeGlare(Mat& src, Mat& dst, int s_size, int operation) { int s = s_size * 2 + 1; Mat kernel = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1)); if (operation == 0) { morphologyEx(src, dst, MORPH_OPEN, kernel); } else if (operation == 1) { morphologyEx(src, dst, MORPH_CLOSE, kernel); } } int main() { Mat src = imread("image.jpg"); if (src.empty()) { cout << "Failed to load image." << endl; return -1; } namedWindow("Input", WINDOW_AUTOSIZE); imshow("Input", src); int s_size = 3; int operation = 0; // 0 for opening, 1 for closing createTrackbar("Structuring Element Size", "Input", &s_size, 10); createTrackbar("Operation (0: Opening, 1: Closing)", "Input", &operation, 1); Mat dst; removeGlare(src, dst, s_size, operation); namedWindow("Output", WINDOW_AUTOSIZE); imshow("Output", dst); waitKey(0); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高山仰止_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值