数字图像形态学处理

数字图像形态学处理

形态学(morphology)常应用在生物学中,研究动植物形态和结构。图像形态学即数学形态学(Mathematical morphology)是一门建立在格伦和拓扑学基础上的图像分析学科,是数学形态学图像处理的基本理论。常见图像形态学运算:腐蚀、膨胀、开运算、闭运算、形态学梯度等。
形态学处理是对灰度图像或二值图像的处理,通常用作识别银行卡号,OCR文字识别等应用的预处理,会对图像中的外形和结果做变换,例如,使物体外形变胖或变瘦,关闭物体之间的间隙或打开间隙。

OpenCV 在形态变换是一些基于图像形状的简单操作,通常在二进制图像上执行。它需要两个输入,一个是我们的原始图像,第二个是决定操作性质的结构元素或内核。两种基本的形态学算子是侵蚀和膨胀。然后,它的变体形式(如“打开”,“关闭”,“渐变”等)也开始起作用,例如侵蚀,膨胀,开运算,闭运算等。

侵蚀 erode

侵蚀的基本思想就像土壤侵蚀一样,它侵蚀前景物体的边界(尽量使前景保持白色)。它是做什么的呢?内核滑动通过图像(在2D卷积中)。原始图像中的一个像素(无论是1还是0)只有当内核下的所有像素都是1时才被认为是1,否则它就会被侵蚀(变成0)。结果是,根据内核的大小,边界附近的所有像素都会被丢弃。因此,前景物体的厚度或大小减小,或只是图像中的白色区域减小。它有助于去除小的白色噪声,分离两个连接的对象等。

dst = cv.erode(src, kernel[, anchor[, iterations[, borderType[, borderValue]]]]])

  • kernel:核,可以取None, 表示3X3矩形结构元
  • anchor:锚节点,默认是(-1,-1)
  • iterations :腐蚀次数

操作如下:读取一个蓝色石头的图片,转成灰度后才能进行二值化阀值运算,侵蚀运算必须是针对二进制图像,最后显示出原始、二值化以及侵蚀后的图像。

参考代码

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

imgColor = cv.imread('../data/blueStone.jpg')
#RGB2BGR
imgColor = imgColor[:,:,::-1]
imgGray = cv.cvtColor(imgColor, cv.COLOR_BGR2GRAY)
plt.figure(figsize=(15,5))
#二值化处理
ret,thresh1 = cv.threshold(imgGray, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
kernel = np.ones((5,5),np.uint8)
erosion = cv.erode(thresh1, kernel, iterations = 1)
plt.subplot(131),plt.imshow(imgColor),plt.title('Color Original')
plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(thresh1, plt.cm.gray),plt.title('Binary Original')
plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(erosion, plt.cm.gray),plt.title('Eroded')
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述
图 1. 原始、二值化以及侵蚀后的图像

膨胀 dilate

与侵蚀正好相反。如果内核下的至少一个像素为“ 1”,则像素元素为“ 1”。因此,它会增加图像中的白色区域或增加前景对象的大小。通常,在消除噪音的情况下,腐蚀后会膨胀。因为腐蚀会消除白噪声,但也会缩小物体。因此,我们对其进行了扩展。由于噪音消失了,它们不会回来,但是我们的目标区域增加了。在连接对象的损坏部分时也很有用。

dst = cv.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

操作如下:读取一个蓝色石头的图片,转成灰度后才能进行二值化阀值运算,膨胀运算必须是针对二进制图像,最后显示出原始、二值化以及膨胀后的图像。

参考代码

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

imgColor = cv.imread('../data/blueStone.jpg')
#RGB2BGR
imgColor = imgColor[:,:,::-1]
imgGray = cv.cvtColor(imgColor, cv.COLOR_BGR2GRAY)
plt.figure(figsize=(15,5))
#二值化处理
ret,thresh1 = cv.threshold(imgGray, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
kernel = np.ones((5,5),np.uint8)
dilation = cv.dilate(thresh1, kernel, iterations = 1)
plt.subplot(131),plt.imshow(imgColor),plt.title('Color Original')
plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(thresh1, plt.cm.gray),plt.title('Binary Original')
plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(dilation, plt.cm.gray),plt.title('Dilated')
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述
图 2. 原始、二值化以及膨胀后的图像

开运算 Open

开运算是侵蚀然后膨胀的另一个名称,它对于消除噪音很有用。开运算和闭运算等形态学处理共用同一个变换函数。

dst = cv.morphologyEx(src, op, kernel[, anchor[, iterations[, borderT [, borderV]]]]])
op: 形态学处理种类,取值见下表

op 说明
cv.MORPH_ERODE 同 erode
cv.MORPH_DILATE 同 dilate
cv.MORPH_OPEN 开运算:dst=open(src,element)=dilate(erode(src,element))
cv.MORPH_CLOSE 闭运算:dst=close(src,element)=erode(dilate(src,element))
cv.MORPH_GRADIENT 形态学梯度dst=morph_grad(src,element)=dilate(src,element)−erode(src,element)
cv.MORPH_TOPHAT 顶帽处理:dst=tophat(src,element)=src−open(src,element)
cv.MORPH_BLACKHAT 黑帽处理:dst=blackhat(src,element)=close(src,element)−src
cv.MORPH_HITMISS 击中击不中处理

顶帽运算用于在黑暗背景下显示明亮区域。顶帽运算和黑帽运算更适合用于处理灰度图像

操作如下:读取一个蓝色石头的图片,转成灰度后才能进行二值化阀值运算,进行开运算,最后显示出原始、二值化以及开运算后的图像。

参考代码

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

imgColor = cv.imread('../data/blueStone.jpg')
#RGB2BGR
imgColor = imgColor[:,:,::-1]
imgGray = cv.cvtColor(imgColor, cv.COLOR_BGR2GRAY)
plt.figure(figsize=(15,5))
#二值化处理
ret,thresh1 = cv.threshold(imgGray, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
kernel = np.ones((5,5),np.uint8)
opening = cv.morphologyEx(thresh1, cv.MORPH_OPEN, kernel)
plt.subplot(131),plt.imshow(imgColor),plt.title('Color Original')
plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(thresh1, plt.cm.gray),plt.title('Binary Original')
plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(opening, plt.cm.gray),plt.title('Opening operation')
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

图 3. 原始、二值化以及开运算后的图像

闭运算 Close

闭运算与开运算相反,先膨胀然后再侵蚀,对于关闭前景对象内部的小孔消除对象上的小黑点时很有用。

操作如下:读取一个蓝色石头的图片,转成灰度后才能进行二值化阀值运算,进行闭运算,最后显示出原始、二值化以及闭运算后的图像。

参考代码

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

imgColor = cv.imread('../data/blueStone.jpg')
#RGB2BGR
imgColor = imgColor[:,:,::-1]
imgGray = cv.cvtColor(imgColor, cv.COLOR_BGR2GRAY)
plt.figure(figsize=(15,5))
#二值化处理
ret,thresh1 = cv.threshold(imgGray, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
kernel = np.ones((5,5),np.uint8)
closing = cv.morphologyEx(thresh1, cv.MORPH_CLOSE, kernel)
plt.subplot(131),plt.imshow(imgColor),plt.title('Color Original')
plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(thresh1, plt.cm.gray),plt.title('Binary Original')
plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(closing, plt.cm.gray),plt.title('Closing operation')
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述
图 4. 原始、二值化以及闭运算后的图像

参考资料

  • OpenCV API, https://docs.opencv.org/
  • matplotlib.pyplot.subplot, https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplot.html#matplotlib.pyplot.subplot
  • matplotlib.pyplot.imshow, https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html

猜你喜欢

转载自blog.csdn.net/m0_50614038/article/details/129495096