OpenCV图像处理之形态学处理

原理

形态学处理又称为形态学变换(Morphological Transformations),是图像处理中一种基于形状的简单变换。它的处理对象通常是二值化图像,也即只有黑白两种颜色。通常,形态学变换有两个输入:原二值图像,卷积核;一个输出:变换后的图像。
膨胀与腐蚀是最基本的两种形态学变换方法,而除此之外的形态学处理的常规操作(开运算、闭运算、梯度运算、礼帽运算以及黑帽运算等)则是这两种方法的组合。膨胀和腐蚀是针对较亮的像素的两种相反的操作,即较亮的像素范围会膨胀扩大和被暗色腐蚀变小。
腐蚀:卷积核的中心点逐个像素扫描原始图像,被扫描到的原始图像中的像素点,只有当卷积核对应的元素全为1时,其值才为1,否则均为0。
膨胀:卷积核的中心点逐个像素扫描原始图像,被扫描到的原始图像中的像素点,当卷积核对应的元素只要有一个为1时,其值便为1,否则为0。
开运算:图像被腐蚀后,去除了噪声,但是会压缩图像。对腐蚀后的图像,进行膨胀处理,可以去除噪声,并保持原有形状。也即:开运算(image)=膨胀(腐蚀(image))。
闭运算:与开运算相反,闭运算是先膨胀,后腐蚀,它有助于关闭前景物体内部的小孔,或物体上的小黑点。也即:闭运算(image)=腐蚀(膨胀(image))
梯度运算:梯度运算即为膨胀图像减去腐蚀图像从而得到轮廓图像。也即:梯度(image)=膨胀(image)-腐蚀(image)。
礼帽运算:礼帽运算即为原始图像减去开运算的图像,得到其中的噪声图像。也即:礼帽(image)=image-开运算(image)。
黑帽运算:黑帽运算即为闭运算图像减去原始图像,得到图片内部的小孔,或前景色中的小黑点。也即:黑帽(image)=闭运算(image)-image。

OpenCV是Python中用于图像处理的一个很强大的库,在此库中,已经对图像处理所需要的函数有很完备的封装,在进行图像处理的过程中可以直接调用相应的函数即可。
具体过程如下:
(1) 导入所要用到的图像处理的OpenCV库cv2和用于生成卷积核numpy库;
(2) 以cv2.IMREAD_UNCHANGED格式读入原图像;
(3) 构造卷积核,根据实际所需设置大小,数据类型为np.uint8;
(4) 利用OpenCV封装的函数进行相应的形态学处理过程;
(5) 将原图像和处理后的结果图像进行显示并比较分析;

程序及结果

图像腐蚀

import cv2
import numpy as np
a = cv2.imread("image\\erode.bmp", cv2.IMREAD_UNCHANGED)
k = np.ones((5, 5), np.uint8)
b = cv2.erode(a, k, iterations=10)
cv2.imshow("original", a)
cv2.imshow("result", b)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
图像膨胀

import cv2
import numpy as np
a = cv2.imread("image\\dilation.bmp", cv2.IMREAD_UNCHANGED)
k = np.ones((5, 5), np.uint8)
b = cv2.dilate(a, k, iterations=5)
cv2.imshow("original", a)
cv2.imshow("result", b)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
开运算

import cv2
import numpy as np
a = cv2.imread("image\\opening.bmp", cv2.IMREAD_UNCHANGED)
k = np.ones((10, 10), np.uint8)
b = cv2.morphologyEx(a, cv2.MORPH_OPEN, k)
cv2.imshow("original", a)
cv2.imshow("result", b)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
闭运算

import cv2
import numpy as np
a = cv2.imread("image\\closing.bmp", cv2.IMREAD_UNCHANGED)
k = np.ones((10, 10), np.uint8)
b = cv2.morphologyEx(a, cv2.MORPH_CLOSE, k)
cv2.imshow("original", a)
cv2.imshow("result", b)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
梯度运算

import cv2
import numpy as np
a = cv2.imread("image\\gradient.bmp", cv2.IMREAD_UNCHANGED)
k = np.ones((10, 10), np.uint8)
b = cv2.morphologyEx(a, cv2.MORPH_GRADIENT, k)
cv2.imshow("original", a)
cv2.imshow("result", b)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
礼帽运算

import cv2
import numpy as np
a = cv2.imread("image\\tophat.bmp", cv2.IMREAD_UNCHANGED)
k = np.ones((5, 5), np.uint8)
b = cv2.morphologyEx(a, cv2.MORPH_TOPHAT, k)
cv2.imshow("original", a)
cv2.imshow("result", b)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
黑帽运算

import cv2
import numpy as np
a = cv2.imread("image\\blackhat.bmp", cv2.IMREAD_UNCHANGED)
k = np.ones((10, 10), np.uint8)
b = cv2.morphologyEx(a, cv2.MORPH_BLACKHAT, k)
cv2.imshow("original", a)
cv2.imshow("result", b)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

分析

由上面结果可以看出,腐蚀使得原图像中心亮区减少,也实现了去除边缘的噪声;膨胀使原图像中心亮区扩大;开运算和闭运算则是腐蚀和膨胀的复合结合,分别实现了去除边缘的噪声和去除内部亮区黑洞;梯度运算利用膨胀后的图像减去腐蚀后的图像从而得到了图像的边缘;礼帽运算和黑帽运算分别得到了图像边缘的噪声图像和内部亮区的黑洞图像。对比程序代码可以发现,不同的操作之间,其实真正改变的只有运算对应的函数的使用和原图像的存储路径。

猜你喜欢

转载自blog.csdn.net/qq_44628230/article/details/107015310