一 基础知识
图像的膨胀(dilation)和腐蚀(erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域.
其中膨胀类似与 '领域扩张' ,将图像的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大.
腐蚀类似 '领域被蚕食' ,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小.
二 图像膨胀
膨胀的运算符是“⊕”,其定义如下:
该公式表示用B来对图像A进行膨胀处理,其中B是一个卷积模板或卷积核,其形状可以为正方形或圆形,通过模板B与图像A进行卷积计算,扫描图像中的每一个像素点,用模板元素与二值图像元素做“与”运算,如果都为0,那么目标像素点为0,否则为1。从而计算B覆盖区域的像素点最大值,并用该值替换参考点的像素值实现膨胀。下图是将左边的原始图像A膨胀处理为右边的效果图A⊕B。
图像中的高亮区(黑点增多)
三 图像腐蚀
腐蚀的运算符是“-”,其定义如下:
该公式表示图像A用卷积模板B来进行腐蚀处理,通过模板B与图像A进行卷积计算,得出B覆盖区域的像素点最小值,并用这个最小值来替代参考点的像素值。如图所示,将左边的原始图像A腐蚀处理为右边的效果图A-B。
处理结果如下图所示:
高亮区减少(白色区域减少)
四. 图像腐蚀代码实现
1.基础理论
形态学转换主要针对的是二值图像(0或1)。图像腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。其主要包括两个输入对象:
(1)二值图像
(2)卷积核
卷积核是腐蚀中的关键数组,采用numpy库可以生成。卷积核的中心点逐个像素扫描原始图像,如下图所示:
被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为1时,其值才为1,否则其值修改为0。换句话说,遍历到的黄色点位置,其周围全部是白色,保留白色,否则变为黑色,图像腐蚀变小。
2.函数原型
图像腐蚀主要使用的函数为erode,其原型如下:
dst = cv2.erode(src, kernel, iterations)
参数
- dst表示处理的结果,
- src表示原图像,kernel表示卷积核,
- iterations表示迭代次数。
下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。
注意:迭代次数默认是1,表示进行一次腐蚀,也可以根据需要进行多次迭代,进行多次腐蚀。
3.代码实现
完整代码如下所示:
输出结果如下图所示:
由图可见,干扰的细线被进行了清洗,但仍然有些轮廓,此时可设置迭代次数进行腐蚀。
erosion = cv2.erode(src, kernel,iterations=9)
输出结果如下图所示:
三. 图像膨胀代码实现
1.基础理论
图像膨胀是腐蚀操作的逆操作,类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大,线条变粗了,主要用于去噪。
(1) 图像被腐蚀后,去除了噪声,但是会压缩图像。
(2) 对腐蚀过的图像,进行膨胀处理,可以去除噪声,并且保持原有形状。
它也包括两个输入对象:
(1)二值图像或原始图像
(2)卷积核
卷积核是腐蚀中的关键数组,采用numpy库可以生成。卷积核的中心点逐个像素扫描原始图像,如下图所示:
被扫描到的原始图像中的像素点,当卷积核对应的元素值只要有一个为1时,其值就为1,否则为0。
2.函数原型
图像膨胀主要使用的函数为dilate,其原型如下:
dst = cv2.dilate(src, kernel, iterations)
参数
dst表示处理的结果,
src表示原图像,
kernel表示卷积核,
iterations表示迭代次数。
下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。
注意:迭代次数默认是1,表示进行一次膨胀,也可以根据需要进行多次迭代,进行多次膨胀。通常进行1次膨胀即可。
3.代码实现
完整代码如下所示:
输出结果如下所示:
图像去噪通常需要先腐蚀后膨胀,这又称为开运算.
erosion = cv2.erode(src, kernel)
result = cv2.dilate(erosion, kernel)
四 黑帽、顶帽
代码层面
import cv2 as cv import numpy as np def top_hat_demo(image): '顶帽' gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY) #构建形态学元素 提高内核矩阵(10,10)可以提取更多元素 kernel=cv.getStructuringElement(cv.MORPH_RECT,(10,10)) #黑帽处理 dst=cv.morphologyEx(gray,cv.MORPH_TOPHAT,kernel) #如果图像较黑可以用图像增强看看效果 cimage=np.array(gray.shape,np.uint8) cimage=50 dst=cv.add(dst,cimage) cv.imshow('top_hat',dst) def black_hat_demo(image): '黑帽' gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY) #构建形态学元素 提高内核矩阵(10,10)可以提取更多元素 kernel=cv.getStructuringElement(cv.MORPH_RECT,(10,10)) #黑帽处理 dst=cv.morphologyEx(gray,cv.MORPH_BLACKHAT,kernel) #如果图像较黑可以用图像增强看看效果 cimage=np.array(gray.shape,np.uint8) cimage=50 dst=cv.add(dst,cimage) cv.imshow('black_hat',dst) src = cv.imread("girl.jpg") cv.imshow("原来", src) # black_hat_demo(src) top_hat_demo(src) cv.waitKey(0) cv.destroyAllWindows()
效果展示
五 图像顶帽运算
1.基本原理
图像顶帽(或图像礼帽)运算是原始图像减去图像开运算的结果,得到图像的噪声。如下图所示:
2.函数原型
图像开运算主要使用的函数morphologyEx,它是形态学扩展的一组函数,其参数
dst = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
参数
dst表示处理的结果,
src表示原图像,
cv2.MORPH_TOPHAT表示顶帽运算,
kernel表示卷积核。
下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。
卷积如下图所示:
3.代码实现
完整代码如下所示:
#encoding:utf-8 import cv2 import numpy as np #读取图片 src = cv2.imread('test01.png', cv2.IMREAD_UNCHANGED) #设置卷积核 kernel = np.ones((5,5), np.uint8) #图像顶帽运算 result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel) #显示图像 cv2.imshow("src", src) cv2.imshow("result", result) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果如下图所示,可以看到外部噪声被提取出来。
如果想获取更多的细节,可以将卷积设置为10*10,如下图所示:
kernel = np.ones((10,10), np.uint8)
result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
二. 图像黑帽运算
1.基本原理
图像黑帽运算是图像闭运算操作减去原始图像的结果,得到图像内部的小孔,或者前景色中的小黑点。如下图所示:
2.函数原型
图像开运算主要使用的函数morphologyEx,它是形态学扩展的一组函数,其参数cv2.MORPH_BLACKHAT对应开运算。其原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)
参数
- dst表示处理的结果,
- src表示原图像,
- cv2.MORPH_BLACKHAT表示黑帽运算,
- kernel表示卷积核。
下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。
3.代码实现
完整代码如下所示:
import cv2 import numpy as np #读取图片 src = cv2.imread('test02.png', cv2.IMREAD_UNCHANGED) #设置卷积核 kernel = np.ones((5,5), np.uint8) #图像黑帽运算 result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel) #显示图像 cv2.imshow("src", src) cv2.imshow("result", result) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果如下图所示,可以看到图像内部黑点被提取出来。
但内部比较大的四个黑点没有被提取,如果想获取更多的细节,可以将卷积设置为10*10,如下图所示:
kernel = np.ones((10,10), np.uint8)
result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)
转载:
https://blog.csdn.net/Eastmount/article/details/83692456