1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > python+OpenCv笔记(七):图像的形态学操作(腐蚀与膨胀 开闭运算 礼帽与黑帽)

python+OpenCv笔记(七):图像的形态学操作(腐蚀与膨胀 开闭运算 礼帽与黑帽)

时间:2022-05-09 01:52:09

相关推荐

python+OpenCv笔记(七):图像的形态学操作(腐蚀与膨胀 开闭运算 礼帽与黑帽)

一、腐蚀与膨胀

腐蚀就是原图中高亮的部分被蚕食,效果图拥有比原图更小的高亮区域。

腐蚀的作用是:消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点。

膨胀就是使原图中高亮的部分扩张,效果图拥有比原图更大的高亮区域。

膨胀的作用是:将与物体接触的所有背景点合并到物体中,使目标增大,可填补目标中的孔洞。

OpenCv API:

cv2.erode(src, kernel, iterations) # 腐蚀cv2.dilate(src, kernel, iterations) # 膨胀

参数:

1. img:要处理的图像

2. kernel:核结构

3. iterations:腐蚀/膨胀的次数,默认为1

原理:

(见文末)

代码编写

import numpy as npimport cv2 as cvimport matplotlib.pyplot as pltsrc = cv.imread("E:\\view2.jpg")img = src.copy()# 创建核结构kernel = np.ones((5, 5), np.uint8)# 腐蚀与膨胀img_erode = cv.erode(img, kernel) # 腐蚀img_dilate = cv.dilate(img, kernel) # 膨胀# 显示图像fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(10, 8), dpi=100)axes[0].imshow(img[:, :, ::-1])axes[0].set_title("原图")axes[1].imshow(img_erode[:, :, ::-1])axes[1].set_title("绝对尺寸")axes[2].imshow(img_dilate[:, :, ::-1])axes[2].set_title("相对尺寸")plt.show()

二、开闭运算

开运算是先腐蚀后膨胀,其作用是∶分离物体,消除小区域。

特点︰消除噪点,去除小的干扰块,而不影响原来的图像(消除噪声)。

闭运算与开运算相反,是先膨胀后腐蚀,作用是消除/"闭合"物体里面的孔洞。

特点︰可以填充闭合区域(填充孔洞)。

OpenCv API:

cv2.morphologyEx(src, op, kernel)

参数:

src:要处理的图像op:处理方式。若进行开运算,则为cv2.MORPH_OPEN,

若进行闭运算,则为cv2.MORPH_CLOSEkernel:核结构

原理:

(见文末)

注意:开闭运算是不可逆的,即先开后闭并不能得到原图像

代码编写:

import numpy as npimport cv2 as cvimport matplotlib.pyplot as pltsrc = cv.imread("E:\\01(3).png")src2 = cv.imread("E:\\01(4).png")img = src.copy()img2 = src2.copy()# 创建核结构kernel = np.ones((10, 10), np.uint8)# 图像的开闭运算img_open = cv.morphologyEx(img, cv.MORPH_OPEN, kernel) # 开运算img2_close = cv.morphologyEx(img2, cv.MORPH_CLOSE, kernel) # 闭运算# 显示图像fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8), dpi=100)axes[0][0].imshow(img[:, :, ::-1])axes[0][0].set_title("原图1")axes[0][1].imshow(img_open[:, :, ::-1])axes[0][1].set_title("(原图1)开运算")axes[1][0].imshow(img2[:, :, ::-1])axes[1][0].set_title("原图2")axes[1][1].imshow(img2_close[:, :, ::-1])axes[1][1].set_title("(原图2)闭运算")plt.show()

三、礼帽和黑帽

礼帽运算:

原图像与“开运算”结果图的差

数学表达式:dst = tophat(src,element) = src - open(src,element)

因为开运算的结果是放大了裂缝或者局部低亮度的区域,因此,原图减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域(这一操作与核的的选择有关)

礼帽运算用来分离比临近点亮一些的斑块儿,当一幅图像具有大幅背景的时候,而微小物品比较有规律的情况下可使用礼帽运算进行背景提取。

黑帽运算:

“闭运算”的结果图与原图像之差

数学表达式:dst = blackhat(src, element) = close(src, element) - src

黑帽运算的效果图突出了比原图轮廓周围的区域更暗的区域(这一操作与核的选择有关)

黑帽运算用来分离比邻近点暗一些的斑块

OpenCv API:

cv2.morphologyEx(src, op, kernel)

参数:同上

其中,

import numpy as npimport cv2 as cvimport matplotlib.pyplot as pltsrc = cv.imread("E:\\01(3).png")src2 = cv.imread("E:\\01(4).png")img = src.copy()img2 = src2.copy()# 创建核结构kernel = np.ones((10, 10), np.uint8)# 图像的礼帽与黑帽运算img_tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)img2_blackhat = cv.morphologyEx(img2, cv.MORPH_BLACKHAT, kernel)# 显示图像fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8), dpi=100)axes[0][0].imshow(img[:, :, ::-1])axes[0][0].set_title("原图1")axes[0][1].imshow(img_tophat[:, :, ::-1])axes[0][1].set_title("(原图1)礼帽运算")axes[1][0].imshow(img2[:, :, ::-1])axes[1][0].set_title("原图2")axes[1][1].imshow(img2_blackhat[:, :, ::-1])axes[1][1].set_title("(原图2)黑帽运算")plt.show()

四、总结(morphologyEX函数)

morphologyEx函数可以执行各种形态学运算。对于本文中的膨胀与腐蚀,开闭运算,礼帽与黑帽等都可以用morphologyEx函数完成。

其中,膨胀与腐蚀既可以直接用erode函数和dilate函数完成,也可以用morphologyEx函数完成(第二个参数op设置为cv2.MORPH_ERODE或者cv2.MORPH_DILATE即可),开闭运算,礼帽与黑帽都用morphologyEx函数完成。

形态学操作的原理:

1.腐蚀与膨胀

腐蚀的具体操作是∶用一个结构元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做"与"操作,如果都为1,则该像素为1,否则为0。如下图所示,结构A被结构B腐蚀后∶

例如,对于结构A中的(2,4)单元格,用结构B扫描有

因为(2,4)为非高亮(即非红色),所以最终腐蚀后仍然为非高亮

例如,对于结构A中的(4,2)单元格,用结构B扫描有

因为仍有未完全覆盖的部分,所以腐蚀后(2,4)仍为非高亮

--------------------------------------------------------------------------------------------------------------------------------------

膨胀的具体操作是︰用一个结构元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为0,则该像素为0,否则为1。如下图所示,结构A被结构B膨胀后:

原理与腐蚀类似 (只要结构B的覆盖区域中有高亮红色,则进行膨胀)

2.开闭运算

.开运算是先腐蚀后膨胀,如图所示:

闭运算是先膨胀后腐蚀,如图所示:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。