形态学
形态学
从图像中提取对表达和描绘区域形状有意义的图像分量
图像全局二值化
python
import cv2
import numpy as np
"""
图像全局二值化--0与255
二值化的主要目的是通过简化图像信息、增强对比度、分割目标物体、提取特征信息、去除噪声以及压缩存储和快速处理等方式,使图像更容易被计算机处理和分析
最好是灰度图
"""
img = cv2.imread('./img/cat.jpeg')
# 二值操作对灰度图像操作,先把图像变为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化 127:阈值, 255最大值, cv2.THRESH_BINARY操作类型
# 返回两个值,一个是阈值,一个是二值化处理后的图片
thresh, dst = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('cat', np.hstack((gray, dst)))
自适应阈值
python
"""
自适应阈值二值化,全局二值化在全图中只能采用一个阈值,不同的部分具有不同的亮度,阈值应该不同
"""
# 255最大值, cv2.ADAPTIVE_THRESH_GAUSSIAN_C计算阈值的方法,有两个选择,这个是最好的, cv2.THRESH_BINARY操作类型
# 3为计算阈值的区域大小 0为一个常数,阈值等于平均值或者加权平均值减去这个常数
dst1 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 3, 0)
腐蚀操作
python
"""
腐蚀操作--通过消除图像中的边界点来使图像沿着边界向内收缩。这种操作可以用于消除图像中的小型噪点、细小物体,或者断开相连的物体。
选择一个结构元素(也称为腐蚀核):结构元素是一个小的二维数组,用于定义腐蚀操作的运算方式。其大小和形状决定了腐蚀的强度和效果。
逐像素比较:将结构元素放置在图像的某个像素位置上,然后对于结构元素和图像重叠的区域,检查结构元素内的所有像素是否都与图像内的对应像素匹配。
更新像素值:如果结构元素内的所有像素都与图像内的对应像素匹配,则该像素保持不变;否则,将该像素置为背景值(通常是0或黑色)。
遍历整个图像:重复上述步骤,直到遍历完整个图像。
简单点说就是,在全黑的背景图里面有一些白色字体,如果腐蚀核在背景图中的重叠区域全是白色,则结果为白色,但只要有一点黑色,则全为黑色
所以腐蚀核的大小很重要
"""
# 腐蚀核是全1的, iterations迭代次数,即腐蚀次数,次数越多,效果越好
kernel = np.opnes((3, 3), np.uint8)
dst2 = cv2.erode(img, kernel, iterations=2)
# 但每次腐蚀核需要自己写,很麻烦,我们可以自动获取
# 获取形态学腐蚀核 cv2.MORPH_RECT:形状, MORPH_RECT长方形, MORPH_ELLIPSE椭圆, MORPH_CROSS十字架
# (5, 5)大小
kernel1 = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
膨胀
python
"""
膨胀--通过将图像中的像素值进行扩展或"增肥",使得图像的边界向外扩张
和腐蚀相反
"""
dst3 = cv2.dilate(img, kernel, iterations=1)
开运算
python
"""
开运算 = 腐蚀 + 膨胀
开运算可以去除图形外的噪点
真实使用时,注意调节核大小和迭代次数
"""
kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
dst4_1 = cv2.erode(img, kernel, iterations=1)
dst4_2 = cv2.dilate(img, kernel, iterations=1)
# OpenCV提供了开运算(cv2.MORPH_OPEN)的api, 噪声比较多的情况下,kernel选择大一点
dst4_3 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, iterations=2)
闭运算
python
"""
闭运算 = 膨胀 + 腐蚀
闭运算可以去除图形内部的噪点
这里仅展示api方法,同上
真实使用时,注意调节核大小和迭代次数
"""
dst5 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, iterations=2)
形态学梯度
python
"""
形态学梯度 = 原图 - 腐蚀
即得到腐蚀掉的部分--边缘
真实使用时,注意调节核大小和迭代次数
"""
# cv2.MORPH_GRADIENT 形态学梯度
dst6 = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel, iterations=2)
顶帽操作
python
"""
顶帽操作 = 原图 - 开运算
开运算可以去除图形外的噪点,顶帽操作得到去除的噪点
真实使用时,注意调节核大小和迭代次数
"""
# cv2.MORPH_TOPHAT 顶帽操作
dst7 = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel, iterations=2)
黑帽操作
python
"""
黑帽操作 = 原图 - 闭运算
得到图形内部的噪点
真实使用时,注意调节核大小和迭代次数
"""
dst8 = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel, iterations=2)
cv2.waitKey(0)
cv2.destroyAllWindows()