13 opencv 形态学转换 开运算 闭运算 形态学梯度

形态学转换 开运算 闭运算 形态学梯度

  • 形态学操作是根据图像形状进行的简单操作.
  • 一般情况下对二值化图像进行的操作

腐蚀

  • 根据卷积核的大小靠近前景的所有像素都会被腐蚀掉(变为 0)
  • 所以前景物体会变小,整幅图像的白色区域会减少。
  • 这对于去除白噪声很有用,也可以用来断开两个连在一块的物体等。

erosion = cv2.erode(img,kernel,iterations = 1)

膨胀

  • 与腐蚀相反,与卷积核对应的原图像的像素值中只要有一个是 1,中心元素的像素值就是 1。
  • 所以这个操作会增加图像中的白色区域(前景)。
  • 一般在去噪声时先用腐蚀再用膨胀。因为腐蚀在去掉白噪声的同时,也会使前景对象变小。所以我们再对他进行膨胀。
  • 噪声已经被去除了,不会再回来了,但是前景还在并会增加。膨胀也可以用来连接两个分开的物体。

dilation = cv2.dilate(img,kernel,iterations = 1)

开运算

  • 先进性腐蚀再进行膨胀就叫做开运算。就像我们上面介绍的那样,它被用来去除噪声。

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

闭运算

  • 先膨胀再腐蚀。它经常被用来填充前景物体中的小洞,或者前景物体上的小黑点。

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

形态学梯度

  • 其实就是一幅图像膨胀与腐蚀的差别。
  • 结果看上去就像前景物体的轮廓。

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

礼帽

  • 原始图像与进行开运算之后得到的图像的差。

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

黑帽

  • 进行闭运算之后得到的图像与原始图像的差。

blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

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


fig = plt.figure(figsize=(16, 9))
img = cv2.imread('hei.jpg', -1)
ret, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
kernel = np.ones((5, 5),dtype = np.uint8)

erosion = cv2.erode(img, kernel, iterations = 1)
dilation = cv2.dilate(img,kernel,iterations = 1)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

plt.subplot(241),plt.imshow(img),plt.title('Original', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.subplot(242),plt.imshow(erosion),plt.title('erosion', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.subplot(243),plt.imshow(dilation),plt.title('dilation', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.subplot(244),plt.imshow(opening),plt.title('opening', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.subplot(245),plt.imshow(closing),plt.title('closing', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.subplot(246),plt.imshow(gradient),plt.title('gradient', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.subplot(247),plt.imshow(tophat),plt.title('tophat', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.subplot(248),plt.imshow(blackhat),plt.title('blackhat', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.show()

13 opencv 形态学转换 开运算 闭运算 形态学梯度_第1张图片

你可能感兴趣的:(opencv_python,opencv,python)