欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > Python----计算机视觉处理(Opencv:形态学变换)

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

2025/3/19 5:01:36 来源:https://blog.csdn.net/weixin_64110589/article/details/146008323  浏览:    关键词:Python----计算机视觉处理(Opencv:形态学变换)

一、形态学变化

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

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

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

二、核

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

2.1、矩形

2.2、椭圆形

2.3、十字形

三、腐蚀

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

 导入模块

import cv2

 读取图片

img=cv2.imread('img.png')

 灰度化

img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

 二值化

ret,img_threshold=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)

 创建核

kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(15,15))

 腐蚀

img_erode=cv2.erode(img_threshold,kernel)

 显示图片

cv2.imshow('img_gray',img_gray)
cv2.imshow('img_erode',img_erode)
cv2.waitKey(0)

 完整代码

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)。这样做的结果就是会将二值化图像中的白色部 分尽可能的扩张,如下图所示,该图经过腐蚀之后,“变胖”了。

导入模块

import cv2

 读取图片

img=cv2.imread('img.png')

 灰度化

img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

 二值化

ret,img_threshold=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)

 创建核

kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(15,15))

 膨胀

img_dilate=cv2.dilate(img_threshold,kernel)

 显示图片

cv2.imshow('img_dilate',img_dilate)
cv2.waitKey(0)

完整代码 

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()

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()

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。
borderValueborder 值(如果边界为常量)
BorderTypes
BORDER_CONSTANT
Python:cv.BORDER_CONSTANT

iiiiii|abcdefgh|iiiiiii并指定一些i

BORDER_REPLICATE
Python:cv.BORDER_REPLICATE

aaaaaa|abcdefgh|hhhhhhh

BORDER_REFLECT
Python:cv.BORDER_REFLECT

fedcba|abcdefgh|hgfedcb

BORDER_REFLECT_101
Python:cv.BORDER_REFLECT_101

gfedcb|abcdefgh|gfedcba

BORDER_TRANSPARENT
Python:cv.BORDER_TRANSPARENT

uvwxyz|abcdefgh|ijklmno- 将离群值视为透明值。

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()

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。
borderValueborder 值(如果边界为常量)
BorderTypes
BORDER_CONSTANT
Python:cv.BORDER_CONSTANT

iiiiii|abcdefgh|iiiiiii并指定一些i

BORDER_REPLICATE
Python:cv.BORDER_REPLICATE

aaaaaa|abcdefgh|hhhhhhh

BORDER_REFLECT
Python:cv.BORDER_REFLECT

fedcba|abcdefgh|hgfedcb

BORDER_REFLECT_101
Python:cv.BORDER_REFLECT_101

gfedcb|abcdefgh|gfedcba

BORDER_TRANSPARENT
Python:cv.BORDER_TRANSPARENT

uvwxyz|abcdefgh|ijklmno- 将离群值视为透明值。

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 边界内。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词