Python----计算机视觉处理(Opencv:形态学变换)

一、形态学变化

形态学变换(Morphological Transformations)是一种基于形状的图像处理技术,主要处理的对象为二值化图像。

形态学变换有两个输入和一个输出:输入为原始图像和核(即结构化元素),输出为经过形态学变换后的图像。

其基本操作包括腐蚀(Erosion)和膨胀(Dilation),这两种操作互为反向过程,分别对图像中的亮度值产生不同的影响。

二、核

核,或称结构化元素,是用于形态学变换的一个小的二值图像,通常呈现为简单的几何形状,例如矩形、椭圆形或十字形等。结构化元素的大小和形状直接影响腐蚀和膨胀操作的效果。

2.1、矩形

2.2、椭圆形

2.3、十字形

三、腐蚀

腐蚀操作就是使用核在原图(二值化图)上进行从左到右、从上到下的滑动(也就是从图像的左上角开 始,滑动到图像的右下角)。在滑动过程中,令核值为1的区域与被核覆盖的对应区域进行相乘,得到其 最小值,该最小值就是卷积核覆盖区域的中心像素点的新像素值,接着继续滑动。由于操作图像为二值 图,所以不是黑就是白,这就意味着,在被核值为1覆盖的区域内,只要有黑色(像素值为0),那么该 区域的中心像素点必定为黑色(0)。这样做的结果就是会将二值化图像中的白色部分尽可能的压缩,如 下图所示,该图经过腐蚀之后,"变瘦"了。

导入模块

python 复制代码
import cv2

读取图片

python 复制代码
img=cv2.imread('img.png')

灰度化

python 复制代码
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

二值化

python 复制代码
ret,img_threshold=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)

创建核

python 复制代码
kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(15,15))

腐蚀

python 复制代码
img_erode=cv2.erode(img_threshold,kernel)

显示图片

python 复制代码
cv2.imshow('img_gray',img_gray)
cv2.imshow('img_erode',img_erode)
cv2.waitKey(0)

完整代码

python 复制代码
import cv2  # 导入OpenCV库  

# 读取图像  
img = cv2.imread('img.png')  

# 将图像转换为灰度图  
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  

# 对灰度图像应用阈值处理,以获得二值图像  
# ret: 用于输出阈值值,img_threshold: 阈值处理后的图像  
ret, img_threshold = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)  

# 创建一个15x15的十字形结构元素(腐蚀操作所用的卷积核)  
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (15, 15))  

# 对阈值处理后的图像进行腐蚀操作  
img_erode = cv2.erode(img_threshold, kernel)  

# 显示腐蚀处理后的图像  
cv2.imshow('img_erode', img_erode)  

# 等待用户按键后关闭窗口  
cv2.waitKey(0)  

四、膨胀

膨胀与腐蚀刚好相反,膨胀操作就是使用核在原图(二值化图)上进行从左到右、从上到下的滑动(也 就是从图像的左上角开始,滑动到图像的右下角),在滑动过程中,令核值为1的区域与被核覆盖的对应 区域进行相乘,得到其最大值,该最大值就是核覆盖区域的中心像素点的新像素值,接着继续滑动。由 于操作图像为二值图,所以不是黑就是白,这就意味着,在卷积核覆盖的区域内,只要有白色(像素值 为255),那么该区域的中心像素点必定为白色(255)。这样做的结果就是会将二值化图像中的白色部 分尽可能的扩张,如下图所示,该图经过腐蚀之后,"变胖"了。

导入模块

python 复制代码
import cv2

读取图片

python 复制代码
img=cv2.imread('img.png')

灰度化

python 复制代码
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

二值化

python 复制代码
ret,img_threshold=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)

创建核

python 复制代码
kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(15,15))

膨胀

python 复制代码
img_dilate=cv2.dilate(img_threshold,kernel)

显示图片

python 复制代码
cv2.imshow('img_dilate',img_dilate)
cv2.waitKey(0)

完整代码

python 复制代码
import cv2  # 导入OpenCV库  

# 读取图像  
img = cv2.imread('img.png')  

# 将图像转换为灰度图  
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  

# 对灰度图像应用阈值处理,以获得二值图像  
# ret: 用于输出阈值值,img_threshold: 阈值处理后的图像  
ret, img_threshold = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)  

# 创建一个15x15的十字形结构元素(膨胀操作所用的卷积核)  
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (15, 15))  

# 对阈值处理后的图像进行膨胀操作  
# 膨胀会增强图像中亮区域的大小  
img_dilate = cv2.dilate(img_threshold, kernel)  

# 显示膨胀处理后的图像  
cv2.imshow('img_dilate', img_dilate)  

# 等待用户按键后关闭窗口  
cv2.waitKey(0)  

五、库函数

5.1、getStructuringElement()

python 复制代码
cv.getStructuringElement(	shape, ksize[, anchor]	) ->	retval
方法 描述
shape 可以是 MorphShapes 之一
ksize 结构元素的大小。
anchor 元素内的锚点位置。默认值(−1,−1)表示锚点位于中心。请注意,只有十字形元素的形状取决于锚点位置。在其他情况下,锚点只是调节形态作的结果偏移了多少

|---------------------------------------|-------------------------------------------------------------------------------------|
| MorphShapes | |
| MORPH_RECT Python:cv.MORPH_RECT | 矩形结构元素: |
| MORPH_CROSS Python:cv.MORPH_CROSS | 十字形结构元件: |
| MORPH_ELLIPSE Python:cv.MORPH_ELLIPSE | 椭圆结构元素,即内接到矩形 Rect(0, 0, esize.width, esize.height) 中的填充椭圆 |

5.2、erode()

python 复制代码
cv.erode(	src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]	) ->	dst

| 方法 | 描述 |
| src | 输入图像;通道数可以是任意的,但深度应该是 CV_8U、 CV_16U、 CV_16S、 CV_32F 或 CV_64F 之一。 |
| dst | 输出图像的大小和类型与 src 相同。 |
| kernel | 用于侵蚀的结构元件;如果 ,则使用矩形结构元素。可以使用 getStructuringElement 创建 Kernel。element=Mat()``3 x 3 |
| anchor | 锚点在元素中的位置;默认值 (-1, -1) 表示锚点位于元素中心。 |
| iterations | 应用 腐蚀的次数。 |
| borderType | 像素外插方法,请参阅 BorderTypes。不支持BORDER_WRAP。 |

borderValue border 值(如果边界为常量)
BorderTypes
BORDER_CONSTANT Python:cv.BORDER_CONSTANT `iiiiii
BORDER_REPLICATE Python:cv.BORDER_REPLICATE `aaaaaa
BORDER_REFLECT Python:cv.BORDER_REFLECT `fedcba
BORDER_REFLECT_101 Python:cv.BORDER_REFLECT_101 `gfedcb
BORDER_TRANSPARENT Python:cv.BORDER_TRANSPARENT `uvwxyz
BORDER_REFLECT101 Python:cv.BORDER_REFLECT101 与 BORDER_REFLECT_101 相同
BORDER_DEFAULT Python:cv.BORDER_DEFAULT 与 BORDER_REFLECT_101 相同
BORDER_ISOLATED Python:cv.BORDER_ISOLATED 插值限制在 ROI 边界内。

5.3、 dilate()

python 复制代码
cv.dilate(	src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]	) ->	dst

| 方法 | 描述 |
| src | 输入图像;通道数可以是任意的,但深度应该是 CV_8U、 CV_16U、 CV_16S、 CV_32F 或 CV_64F 之一。 |
| dst | 输出图像的大小和类型与 src 相同。 |
| kernel | 用于扩张的结构元件;如果 element=Mat(),则使用 3 x 3 矩形结构元素。可以使用 getStructuringElement 创建 Kernel |
| anchor | 锚点在元素中的位置;默认值 (-1, -1) 表示锚点位于元素中心。 |
| iterations | 应用扩张的次数。 |
| borderType | 像素外插方法,请参阅 BorderTypes。不支持BORDER_WRAP。 |

borderValue border 值(如果边界为常量)
BorderTypes
BORDER_CONSTANT Python:cv.BORDER_CONSTANT `iiiiii
BORDER_REPLICATE Python:cv.BORDER_REPLICATE `aaaaaa
BORDER_REFLECT Python:cv.BORDER_REFLECT `fedcba
BORDER_REFLECT_101 Python:cv.BORDER_REFLECT_101 `gfedcb
BORDER_TRANSPARENT Python:cv.BORDER_TRANSPARENT `uvwxyz
BORDER_REFLECT101 Python:cv.BORDER_REFLECT101 与 BORDER_REFLECT_101 相同
BORDER_DEFAULT Python:cv.BORDER_DEFAULT 与 BORDER_REFLECT_101 相同
BORDER_ISOLATED Python:cv.BORDER_ISOLATED 插值限制在 ROI 边界内。
相关推荐
玩电脑的辣条哥3 分钟前
简单描述一下,大型语言模型简史
人工智能·语言模型·自然语言处理
独行soc6 分钟前
2025年渗透测试面试题总结- shopee-安全工程师(题目+回答)
java·网络·python·科技·面试·职场和发展·红蓝攻防
index_all35 分钟前
虾皮(Shopee)商品ID获取商品详情请求示例
数据库·python·搜索引擎
遇健李的幸运36 分钟前
智能Agent如何改造传统工作流:从搜索到全能助手
人工智能
pzx_0011 小时前
【深度学习】训练集、测试集、验证集、过拟合、欠拟合详解
人工智能·深度学习·神经网络
果冻人工智能1 小时前
为什么欧洲的 AI 未来不在汽车,而在芯片上
人工智能
啥都鼓捣的小yao1 小时前
实战3. 利用Pytorch预写好ResNet-18预测电视剧《辛普森一家》中的人物——图像分类
人工智能·pytorch·python·深度学习·分类
Chaos_Wang_1 小时前
NLP高频面试题(八)——GPT三个版本的区别
人工智能·gpt·自然语言处理
张琪杭1 小时前
机器学习-基于KNN算法手动实现kd树
人工智能·算法·机器学习