当前位置: 首页 > news >正文

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

相关文章:

  • Bellman_ford 算法--带负权值的单源最短路问题,边列表存储
  • 相机标定之DLT算法学习
  • [HelloCTF]PHPinclude-labs超详细WP-Level 6Level 7Level 8Level 9-php://协议
  • Java高级编程深度解析:JVM底层原理、设计模式与Java 8+新特性实战
  • 案例驱动的 IT 团队管理:创新与突破之路:第三章 项目攻坚:从流程优化到敏捷破局-3.2.1案例:传统企业敏捷转型的“阵痛期“应对
  • 【QT:网络编程】
  • 【大模型理论篇】R1-Searcher:通过强化学习激励llm的搜索能⼒
  • Linux rpm软件管理
  • HTML5扫雷游戏开发实战
  • 计算机视觉算法实战——实例分割(主页有源码)
  • React19源码系列之Hooks(useId)
  • 【设计模式】3W 学习法全面解析 7 大结构型模式:Java 实战 + 开源框架应用
  • JavaScript 函数类型详解:函数声明、函数表达式、箭头函数
  • CEF 控制台添加一函数,枚举 注册的供前端使用的CPP交互函数有哪些
  • 顺序表的C语言实现与解析
  • 如何使用 CryptoJS 实现 DES 解密
  • 面试经典问题(持续更新)
  • 特征重要性与数据偏移的交叉分析
  • 协议层攻防战:群联AI云防护为何比传统方案更精准?
  • 五、vtkFeatureEdges边过滤器
  • 多地再发网约车从业及投资风险提示:避免盲目花费大笔资金“购车”入行
  • 印称一名高级官员在巴基斯坦发动的袭击中死亡
  • 玉渊谭天丨中方为何此时同意与美方接触?出于这三个考虑
  • 协会:坚决支持司法机关依法打击涉象棋行业的违法行为
  • 蔡达峰:推动食品安全法全面有效实施,为维护人民群众身体健康提供有力法治保障
  • 胳膊一抬就疼,炒菜都成问题?警惕这种“炎症”找上门