形态学转换

                                形态学转换

文章目录

  • 1.腐蚀
  • 2.膨胀
  • 3.开运算
  • 4.闭运算
  • 5.形态学梯度
  • 6.礼帽
  • 7.黑帽
  • 8.结构化元素

形态学操作时根据图像形状进行的简单操作。对 二值化 图像进行的操作
准备工作:

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

# 显示函数
def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

1.腐蚀

# 腐蚀
'''
这个操作会把前景物体的边界腐蚀掉。
卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是1,那么
中心元素就保持原来的像素值,否则就变为0
'''
img = cv2.imread('dige.png')

kernel = np.ones((3, 3), np.uint8)
erosion = cv2.erode(img, kernel, iterations=1)
'''
kernel:腐蚀盒子的大小
interations:腐蚀的迭代次数
'''
res = np.hstack((img, erosion))
cv_show('res', res)

输出结果:
形态学转换_第1张图片

2.膨胀

# 膨胀
img = cv2.imread('dige.png')
kernel = np.ones((5, 5), np.uint8)
dige_dilate = cv2.dilate(img, kernel, iterations=1)
'''
kernel:腐蚀盒子的大小
interations:腐蚀的迭代次数
'''
res = np.hstack((img, dige_dilate))
cv_show('res', res)

输出结果:
形态学转换_第2张图片

3.开运算

# 开运算
# 开:先腐蚀,再膨胀
img = cv2.imread('dige.png')
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
'''
morphologyEx(src,op, kernel, anchor,iterations,borderType,orderValue)
src: 操作图像
op: 操作的类型
    MORPH_ERODE      腐蚀
    MORPH_DILATE     膨胀
    MORPH_OPEN       开操作
    MORPH_CLOSE      闭操作
    MORPH_GRADIENT   梯度操作
    MORPH_TOPHAT     顶帽操作
    MORPH_BLACKHAT   黑帽操作
    MORPH_HITMISS   
kernel: 用于操作的结构元素
anchor: 参考点,其默认值是(-1,-1)说明位于kernel的中心位置
iterations: 迭代次数
borderType: 边缘类型  默认为BORDER_CONSTANT
orderValue: 边缘值 默认即可
'''
res = np.hstack((img, opening))
cv_show('res', res)

输出结果:
形态学转换_第3张图片

4.闭运算

# 闭运算
# 闭: 先膨胀,再腐蚀
img = cv2.imread('dige.png')
kernel = np.ones((3, 3), np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
res = np.hstack((img, closing))
cv_show('res', res)

输出结果:
形态学转换_第4张图片

5.形态学梯度

img = cv2.imread('pie.png')
kernel = np.ones((7, 7), np.uint8)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
res = np.hstack((img, gradient))
cv_show('res', res)

输出结果:
形态学转换_第5张图片

6.礼帽

# 礼帽
# 礼帽 = 原始输入 - 开运算结果
img = cv2.imread('dige.png')
kernel = np.ones((7, 7), np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
res = np.hstack((img, tophat))
cv_show('res', res)

输出结果:
形态学转换_第6张图片

7.黑帽

# 黑帽
# 黑帽 = 闭运算 - 原始输入
img = cv2.imread('dige.png')
kernel = np.ones((7, 7), np.uint8)
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
res = np.hstack((img, blackhat))
cv_show('res', res)

输出结果:
形态学转换_第7张图片

8.结构化元素

# 结构化元素
'''
在前面我们使用numpy构建了结构化元素,它是正方形的。但有时我们需要构建
一个椭圆形/圆形的核。我们使用cv2.getStructuringElement()
只需要告诉它你需要的核的形状和大小
cv2.getStructuringElement(para1,para2,para3)
para1: 表示内核的形状
      MORPH_RECT  矩形
      MORPH_CROSS 交叉形
      MORPH_ELLIPSE 椭圆形
para2: 内核的尺寸
para3: 锚点的位置
'''
rect = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
print("矩形:\n", rect)
cross = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
print("交叉形:\n", cross)
ellipse = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
print("圆形:\n", ellipse)

输出结果:

矩形:
[[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]]
交叉形:
[[0 0 1 0 0]
[0 0 1 0 0]
[1 1 1 1 1]
[0 0 1 0 0]
[0 0 1 0 0]]
圆形:
[[0 0 1 0 0]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[0 0 1 0 0]]

今天写了不少啊! 很棒,继续加油。

你可能感兴趣的:(OpenCV)