文章目录
- 🧡🧡实验流程🧡🧡
- 1.图像膨胀
- 2.图像腐蚀
- 3.膨胀与腐蚀的综合使用
- 4.对下面二值图像的目标提取骨架,并分析骨架结构。
- 🧡🧡全部代码🧡🧡
🧡🧡实验流程🧡🧡
1.图像膨胀
膨胀原理:设置一个3x3的矩阵,遍历每个像素点,该像素点的值等于以该像素点为中心的3*3范围内的最大值。由于是二值图像(要么0黑,要么255白),所以只要包含周围白(255)的部分,就变为白的。如下,字的外轮廓变粗。
2.图像腐蚀
腐蚀原理:与膨胀相反,设置一个3x3的矩阵,遍历每个像素点,该像素点的值等于以该像素点为中心的3*3范围内的最小值。由于是二值图像(要么0黑,要么255白),所以只要包含周围黑(0)的部分,就变为黑的。如下,腐蚀后,减少了一些毛刺,并且字体外形向内凹陷变瘦。
3.膨胀与腐蚀的综合使用
开操作原理:在上述腐蚀操作中,虽然能去除毛刺,但是会对原字体有影响(轮廓变细了),因此再补上膨胀操作,使得字体加粗,即进行先腐蚀后膨胀的操作。如下图,“开”字的毛刺去除了,同时字体轮廓粗细跟原来一样。
闭操作原理:与开操作相反,即进行先膨胀后腐蚀的操作。相当于先放大所有细节(这样子一些缺陷就可以闭合),然后腐蚀缩小到原字体粗细。如下,“闭”字几个封口闭合了。
4.对下面二值图像的目标提取骨架,并分析骨架结构。
梯度计算原理:膨胀图像-腐蚀图像,用大一圈的图像减去小一圈的图像正好就是边缘的信息
🧡🧡全部代码🧡🧡
import cv2
import numpy as np
import matplotlib.pyplot as plt
def cv_show(img):
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
"""
2-1 膨胀操作
"""
ori = cv2.imread('img/test1_dilate.png') # 注意不要有中文
kernel = np.ones((3, 3), dtype=np.uint8)
dilate = cv2.dilate(ori, kernel, iterations=1) # 1:迭代次数,也就是执行几次膨胀操作
res = np.hstack((ori, dilate)) # 拼接在一起
cv_show(res)
"""
2-2 腐蚀操作
"""
ori = cv2.imread('img/test1_erode.png')
kernel = np.ones((3, 3), dtype=np.uint8)
erosion = cv2.erode(ori, kernel, iterations=1)
res = np.hstack((ori, erosion))
cv_show(res)
"""
2-3 开闭运算
"""
ori = cv2.imread('img/test1_open_close.png')
kernel = np.ones((5, 5), dtype=np.uint8)
opening = cv2.morphologyEx(ori, cv2.MORPH_OPEN, kernel, 1)
res = np.hstack((ori, opening))
cv_show(res)
closing = cv2.morphologyEx(ori, cv2.MORPH_CLOSE, kernel, 1) # 有缺陷,填补缺陷
res = np.hstack((ori, closing))
cv_show(res)
"""
2-4 梯度计算 -- 提取骨架
"""
ori = cv2.imread('img/test1_morph.png')
kernel = np.ones((3, 3), dtype=np.uint8)
gradient = cv2.morphologyEx(ori, cv2.MORPH_GRADIENT, kernel)
cv_show(gradient)