0%

opencv_8_形态学操作

  • 形态学,即数学形态学,是图像处理过程中一个非常重要的研究方向。形态学主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要意义,通常是图像理解时所使用的最本质的形状特征。例如:在识别手写数字时,能够通过形态学运算得到其骨架信息,在具体识别时,仅针对其骨架运算即可。形态学处理在视觉检测、文字识别、医学图像处理、图像压缩编码等领域有非常重要的应用。

  • 形态学操作主要包含:

  1. 腐蚀
  2. 膨胀
  3. 开运算
  4. 闭运算
  5. 形态学梯度运算
  6. 顶帽运算(礼帽运算)
  7. 黑帽运算
  • 腐蚀操作和膨胀操作是形态运算的基础,将腐蚀和膨胀操作进行结合,就可以实现开运算、闭运算、形态学梯度运算、顶帽运算、黑帽运算、击中击不中等部同形式的运算。

腐蚀

  • dst=cv2.erode(src, kernel, [,anchor[,iterations[,borderType[,borderValue]]]])
  • 式中:
  • dst:是腐蚀后所输出的目标图像,该图像和原始图像具有同样的类型和大小
  • src:是需要进行腐蚀的原始图像,图像的通道数可以是任意的。
  • kernel:代表腐蚀操作时所采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
  • anchor:代表element结构中锚点的位置。该值默认为(-1,-1),在核中心位置
  • iterations:是腐蚀操作迭代的次数,默认为1。
  • borderType:代表边界样式。
  • borderValue:代表边界值。
1
2
3
4
5
6
7
8
import cv2
import numpy as np
from get_show_img import get_show

img = cv2.imread('data/fs.png')
kernel = np.ones((5,5), np.uint8)
erosion=cv2.erode(img, kernel, iterations=5) # iterations:表示腐蚀次数
get_show(img, erosion)


8output_2_0

膨胀

  • dst=cv2.dilate(src, kernel[,anchor[,iterations[,borderType[,borderValue]]]])
  • 式中:
  • dst:代表膨胀后所输出的目标图像,该图像和原始图像具有同样的类型和大小。
  • src:代表需要进行膨胀操作的原始图像。
  • element:代表膨胀操作所采用的结构类型。它可以自定义生成,也可以自定义生成,也可以通过函数cv2.getStructringElement()生成。
1
2
3
4
5
6
7
8
import cv2
import numpy as np
from get_show_img import get_show

img = cv2.imread('data/pz.jpg')
kernel = np.ones((5,5), np.uint8) # 剪辑和
erosion=cv2.dilate(img, kernel, iterations=9) # iterations:表示膨胀次数
get_show(img, erosion)

8output_4_0

通用形态学函数

  • dst=cv2.morphologyEx(src,op,kernel[,anchor[,iterations[,borderType[,borderValue]]]])
  • dst:代表经过形态学操作所输出的图像
  • src:代表需要进行形态学操作的原始图像。
  • op:代表操作类型。
  • op类型选择:
    81

腐蚀

1
2
3
4
5
6
7
import cv2
import numpy as np

img = cv2.imread('data/fs.png')
kernel = np.ones([5,5], dtype=np.uint8)
rst = cv2.morphologyEx(img, cv2.MORPH_ERODE, kernel, iterations=2)
get_show(img, rst)


8output_7_0

膨胀

1
2
3
4
5
6
7
import cv2
import numpy as np

img = cv2.imread('data/fs.png')
kernel = np.ones([5,5], dtype=np.uint8)
rst = cv2.morphologyEx(img, cv2.MORPH_DILATE, kernel, iterations=2)
get_show(img, rst)


8output_9_0

开运算

  • 先腐蚀再膨胀,可用于去噪、计数等。
1
2
3
4
5
6
7
import cv2
import numpy as np

img = cv2.imread('data/fs.png')
kernel = np.ones([5,5], dtype=np.uint8)
rst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, iterations=2)
get_show(img, rst)

8output_11_0

闭运算

  • 先膨胀再腐蚀,有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同前景图像进行连接
1
2
3
4
5
6
7
import cv2
import numpy as np

img = cv2.imread('data/fs.png')
kernel = np.ones([5,5], dtype=np.uint8)
rst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, iterations=2)
get_show(img, rst)

8output_13_0

形态学梯度运算

  • 膨胀图减去腐蚀图,可以获取原始图像中前景图像的边缘
1
2
3
4
5
6
7
import cv2
import numpy as np

img = cv2.imread('data/fs.png')
kernel = np.ones([5,5], dtype=np.uint8)
rst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
get_show(img, rst)

8output_15_0

顶帽运算(礼帽运算)

  • 原始图像减去开运算所得图像,能够获取图像的噪声信息
1
2
3
4
5
6
7
import cv2
import numpy as np

img = cv2.imread('data/fs.png')
kernel = np.ones([5,5], dtype=np.uint8)
rst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
get_show(img, rst)

8output_17_0

黑帽运算

  • 闭运算所得图像减去原始图像
1
2
3
4
5
6
7
import cv2
import numpy as np

img = cv2.imread('data/fs.png')
kernel = np.ones([5,5], dtype=np.uint8)
rst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel, iterations=5)
get_show(img, rst)

8output_19_0

击中击不中

  • 前景背景腐蚀运算的交集,仅支持CV_8UC1二进制图像
1
2
3
4
5
6
7
8
import cv2
import numpy as np

img = cv2.imread('data/fs.png', 0)
kernel = np.ones([5,5], dtype=np.uint8)
# rst = cv2.morphologyEx(img_8, cv2.MORPH_HITMISS, kernel)
rst = cv2.morphologyEx(img, cv2.MORPH_HITMISS, kernel, iterations=5)
get_show(img, rst)

8output_21_0

核函数

使用cv2.getStructuringElement()生成不同结构的核

1
import cv2

矩形核

1
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10))
1
get_show(kernel1)

8output_27_0

十字形核

1
kernel2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (10, 10))
1
get_show(kernel2)

8output_30_0

椭圆核

1
kernel3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (1000, 1000))
1
get_show(kernel3)

8output_33_0

-------------本文结束感谢您的阅读-------------