形态学转换
形态学操作时根据图像形状进行的简单操作。对 二值化 图像进行的操作
准备工作:
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,那么
中心元素就保持原来的像素值,否则就变为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)
# 膨胀
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)
# 开运算
# 开:先腐蚀,再膨胀
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)
# 闭运算
# 闭: 先膨胀,再腐蚀
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)
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)
# 礼帽
# 礼帽 = 原始输入 - 开运算结果
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)
# 黑帽
# 黑帽 = 闭运算 - 原始输入
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)
# 结构化元素
'''
在前面我们使用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]]
今天写了不少啊! 很棒,继续加油。