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

一、腐蚀与膨胀


腐蚀就是原图中高亮的部分被蚕食,效果图拥有比原图更小的高亮区域。
腐蚀的作用是:消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点。

膨胀就是使原图中高亮的部分扩张,效果图拥有比原图更大的高亮区域。
膨胀的作用是:将与物体接触的所有背景点合并到物体中,使目标增大,可填补目标中的孔洞。

OpenCv API:

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

参数:
 1. img:要处理的图像
 2. kernel:核结构
 3. iterations:腐蚀/膨胀的次数,默认为1

原理:

(见文末)


代码编写

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

src = 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)

参数:

  1. src:要处理的图像
  2. op:处理方式。若进行开运算,则为cv2.MORPH_OPEN,  
                              若进行闭运算,则为cv2.MORPH_CLOSE
  3. kernel:核结构

原理:       

        (见文末)      

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

代码编写:  

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

src = 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)

 参数:同上

            其中,

参数功能
cv2.MORPH_OPEN开运算
cv2.MORPH_CLOSE闭运算
cv2.MORPH_TOPHAT礼帽运算
cv2.MORPH_BLACKHAT黑帽运算
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

src = 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.开闭运算

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值