图像预处理
膨胀腐蚀概述
两个基本的形态学操作是腐 和膨胀。他们 的变体构成了开运算 ,闭运算, 梯度等。
根据卷积核的大小前景的所有像素会腐 掉 变为 0 ,所以前景物体会变小整幅图像的白色区域会减少。
对于去除白噪声很有用 也可以用来断开两个 在一块的物体等。
函数原型:
cv2.dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
⚫src: 输入原图像(建议为二值图)
⚫dst: 输出图像要求和src一样的尺寸和类型
⚫kernel: 膨胀操作的核, 当为NULL时, 表示使用参考点位于中心的3x3的核
⚫anchor: 锚的位置, 默认值Point(-1,-1), 表示位于中心
⚫interations: 膨胀的次数
⚫borderType: 边界模式, 一般采用默认值
⚫borderValue: 边界值, 一般采用默认值
代码示例:
import cv2
import numpy as np
img = cv2.imread(‘…/datas/snowqueen.png’, 0)
cv2.imshow(‘j.png’, img)
print(img.shape)
kernel = np.ones((7, 7), np.uint8)
kernel17 = np.ones((1, 7), np.uint8)
kernel71 = np.ones((7, 1), np.uint8)
dilation = cv2.dilate(img, kernel, iterations=1)
dilation17 = cv2.dilate(img, kernel17, iterations=1)
dilation71 = cv2.dilate(img, kernel71, iterations=1)
cv2.imshow(‘dilation’, np.hstack([img, dilation, dilation17, dilation71]))
cv2.moveWindow(‘dilation’, x=img.shape[1], y=0)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
img = cv2.imread('../datas/snowqueen.png', 0)
cv2.imshow('j.png', img)
print(img.shape)
kernel = np.ones((7, 7), np.uint8)
kernel17 = np.ones((1, 7), np.uint8)
kernel71 = np.ones((7, 1), np.uint8)
dilation = cv2.dilate(img, kernel, iterations=1)
dilation17 = cv2.dilate(img, kernel17, iterations=1)
dilation71 = cv2.dilate(img, kernel71, iterations=1)
cv2.imshow('dilation', np.hstack([img, dilation, dilation17, dilation71]))
cv2.moveWindow('dilation', x=img.shape[1], y=0)
cv2.waitKey(0)
cv2.destroyAllWindows()
原图:
效果图:
2)腐蚀—cv2.erode()
与腐蚀相反 与卷积核对应的原图像的像素值中只有一个是 1 中心元 素的像素值就是 1。所以 该操作会增加图像中的白色区域 前景 。一般在去噪声时先用腐再用膨胀。因为腐在去掉白噪声的同时 也会使前景对变小。所以我们再对他 膨胀。 时噪声已经 去 了 不会再回来了 但是 前景 在并会增加。膨胀也可以用来 接两个分开的物体。
函数原型:
cv2.erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
代码示例:
import cv2
import numpy as np
img = cv2.imread(‘…/datas/snowqueen.png’, 0)
cv2.imshow(‘j.png’, img)
print(img.shape)
#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
kernel = np.ones((5, 5), np.uint8)
#cv2.getStructuringElement(shape, ksize)
erosion = cv2.erode(img, kernel, iterations=1)
dilation = cv2.dilate(img, kernel, iterations=1)
print(img.shape, erosion.shape, dilation.shape)
cv2.imshow(‘erode’, np.hstack([img, erosion, dilation]))
cv2.moveWindow(‘erode’, x=img.shape[1], y=0)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
img = cv2.imread('../datas/snowqueen.png', 0)
cv2.imshow('j.png', img)
print(img.shape)
#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
kernel = np.ones((5, 5), np.uint8)
# cv2.getStructuringElement(shape, ksize)
erosion = cv2.erode(img, kernel, iterations=1)
dilation = cv2.dilate(img, kernel, iterations=1)
print(img.shape, erosion.shape, dilation.shape)
cv2.imshow('erode', np.hstack([img, erosion, dilation]))
cv2.moveWindow('erode', x=img.shape[1], y=0)
cv2.waitKey(0)
cv2.destroyAllWindows()
形态学其他操作:
开运算、闭运算、顶帽、黒帽、形态学梯度
核心函数:
cv2.morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
⚫src: 输入原图像
⚫dst: 输出图像要求和src一样的尺寸和类型
⚫op: 表示形态学运算的类型, 可以取如下值:
CV2 .MORPH DILATE
CV2 .MORPH OPEN # 开运算
CV2 .MORPH_ TOPHAT #顶帽
CV2 .MORPH_ ERODE
CV2.MORPH CLOSE #闭运算
CV2 .MORPH BLACKHAT #黒帽
CV2.MORPH_ GRADIENT #形态学梯度
⚫kernel: 形态学运算内核, 若为NULL, 表示使用参考点位于中心的3x3内核, 一般使用getStruecuringElement函数获得
⚫anchor: 锚的位置, 默认值Point(-1,-1), 表示位于中心
⚫interations: 迭代使用函数的次数, 默认为1
⚫borderType: 边界模式, 一般采用默认值
⚫borderValue: 边界值, 一般采用默认值
1)开运算(open)
基于膨胀腐蚀基础, 利用cv2.morphologyEx()函数进行操作
开运算是先腐蚀后膨胀的过程, 开运算可以用来消除小物体, 在纤细点处分离物体, 并在平滑较大物体边界的同时不明显的改变其面积。
2)闭运算(close)
闭运算是先膨胀后腐蚀的过程, 闭运算可以用来消除小型黑洞(黑色区域)。
3)形态学梯度(Gradient)
形态学梯度是膨胀图与腐蚀图之差, 对二值图可以将团块(blob)边缘凸显出来, 可以用其来保留边缘轮廓。
4)顶帽(Top Hat)
顶帽运算也被称为”礼帽”, 是开运算结果和原图像做差的结果, 可以用来分离比邻近点亮一些的斑块。
5)黒帽(Black Hat)
黑帽运算是原图像和开运算做差的结果, 可以用来分离比邻近点暗一些的斑块。