目录
1 形态学操作
形态学(morphology)一词通常表示生物学的一个分支,该分支主要研究动植物的形态和结构。这里,我们使用同一词语表示数学形态学的内容,将数学形态学作为工具从图像中提取表达和描绘区域形状的有用图像分量,如边界、骨架和凸壳等。
形态学处理主要针对的是二值图像(0或1)。
形态学通常使用图像腐蚀和图像膨胀两个操作,这些操作是形态学处理的基础。
2 图像腐蚀
作为中的集合
和
,表示为
的
对
的腐蚀定义为:
上式表示图像用卷积模板
来进行腐蚀处理,通过模板
与图像
进行卷积计算,得出
覆盖区域的像素点最小值,并用这个最小值来替代参考点的像素值。如图所示,将左边的原始图像
腐蚀处理为右边的效果图
图像腐蚀的效果如下图所示:
图像腐蚀类似于“邻域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。其主要包括两个输入对象:
(1) 二值图像
(2 )卷积核
卷积核是腐蚀中的关键数组,采用numpy库可以生成。卷积核的中心点逐个像素扫描原始图像,腐蚀的过程如下图所示:
被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为1时,其值才为1,否则其值修改为0。换句话说,遍历到的黄色点位置,其周围全部是白色,保留白色,否则变为黑色,图像腐蚀变小。如下图所示:
图像腐蚀主要使用的函数为 erode(),其函数形式如下:
dst = cv2.erode(src, kernel, iterations)
其中,参数:
dst 表示处理的结果;
src 表示原图像;
kernel 表示卷积核;
iterations 表示迭代次数。
注:迭代次数默认是1,表示进行一次腐蚀,也可以根据需要进行多次迭代,进行多次腐蚀。
例如:下图表示5
5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。
(1)卷积核大小为55 ,迭代次数为1
代码如下所示:
#encoding:utf-8
import cv2
import numpy as np
#读取图片
src = cv2.imread('test1.bmp', cv2.IMREAD_UNCHANGED)
#设置卷积核
kernel = np.ones((5,5), np.uint8)
#图像腐蚀处理
erosion = cv2.erode(src, kernel)
#显示图像
cv2.imshow("src", src)
cv2.imshow("result", erosion)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下图所示:
(2)卷积核大小为55,迭代次数为9
代码如下所示:
#encoding:utf-8
import cv2
import numpy as np
#读取图片
src = cv2.imread('test1.bmp', cv2.IMREAD_UNCHANGED)
#设置卷积核
kernel = np.ones((5,5), np.uint8)
#图像腐蚀处理
erosion = cv2.erode(src, kernel,iterations=10)
#显示图像
cv2.imshow("src", src)
cv2.imshow("result", erosion)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下图所示:
(2)卷积核大小为3939,迭代次数为1
代码如下所示:
#encoding:utf-8
import cv2
import numpy as np
#读取图片
src = cv2.imread('test1.bmp', cv2.IMREAD_UNCHANGED)
#设置卷积核
kernel = np.ones((39,39), np.uint8)
#图像腐蚀处理
erosion = cv2.erode(src, kernel)
#显示图像
cv2.imshow("src", src)
cv2.imshow("result", erosion)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下图所示:
3 图像膨胀
作为中的集合
和
,表示为
的
对
的膨胀定义为:
图像膨胀是腐蚀操作的逆操作,类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大,线条变粗了,主要用于去噪。
(1) 图像被腐蚀后,去除了噪声,但是会压缩图像。
(2) 对腐蚀过的图像,进行膨胀处理,可以去除噪声,并且保持原有形状。
它也包括两个输入对象:
(1)二值图像或原始图像
(2)卷积核
图像膨胀的效果如下图所示:
卷积核是腐蚀中的关键数组,采用numpy库可以生成。卷积核的中心点逐个像素扫描原始图像,如下图所示:
被扫描到的原始图像中的像素点,当卷积核对应的元素值只要有一个为1时,其值就为1,否则为0。
图像膨胀主要使用的函数为 dilate(),其函数用法如下所示:
dst = cv2.dilate(src, kernel, iterations)
其中,参数:
dst 表示处理的结果;
src 表示原始图像;
kernel 表示卷积核;
iterations 表示迭代次数。
注:迭代次数默认是1,表示进行一次膨胀,也可根据需要进行多次迭代,进行多次膨胀。通常进行1次膨胀即可。
例如,下图表示5
5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。
(1)卷积核大小为33 ,迭代次数为1
代码如下所示:
#encoding:utf-8
import cv2
import numpy as np
#读取图片
src = cv2.imread('test2.bmp', cv2.IMREAD_UNCHANGED)
#设置卷积核
kernel = np.ones((3,3), np.uint8)
#图像膨胀处理
erosion = cv2.dilate(src, kernel)
#显示图像
cv2.imshow("src", src)
cv2.imshow("result", erosion)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下图所示:
(1)卷积核大小为55 ,迭代次数为1
代码如下所示:
#encoding:utf-8
import cv2
import numpy as np
#读取图片
src = cv2.imread('test2.bmp', cv2.IMREAD_UNCHANGED)
#设置卷积核
kernel = np.ones((5,5), np.uint8)
#图像膨胀处理
erosion = cv2.dilate(src, kernel)
#显示图像
cv2.imshow("src", src)
cv2.imshow("result", erosion)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下图所示:
参考资料
[1] https://blog.csdn.net/Eastmount/article/details/83581277