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

news2025/3/20 3:08:46

一、形态学变化

        形态学变换(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 边界内。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2318107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv中stitch图像融合

openv版本: opencv249 vs &#xff1a;2010 qt : 4.85 #include "quanjing.h"#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <open…

matlab R2024b下载教程及安装教程(附安装包)

文章目录 前言一、matlab R2024b安装包下载二、matlab R2024b安装教程 前言 为帮助大家顺利安装该版本软件&#xff0c;特准备matlab R2024b下载教程及安装教程&#xff0c;它将以简洁明了的步骤&#xff0c;指导你轻松完成安装&#xff0c;开启 MATLAB R2024 的强大功能之旅。…

游戏引擎学习第167天

回顾和今天的计划 我们不使用引擎&#xff0c;也不依赖库&#xff0c;只有我们自己和我们的小手指在敲击代码。 今天我们会继续进行一些工作。首先&#xff0c;我们会清理昨天留下的一些问题&#xff0c;这些问题我们当时没有深入探讨。除了这些&#xff0c;我觉得我们在资产…

JS逆向案例-HIKVISION-视频监控的前端密码加密分析

免责声明 本文仅为技术研究与渗透测试思路分享,旨在帮助安全从业人员更好地理解相关技术原理和防御措施。任何个人或组织不得利用本文内容从事非法活动或攻击他人系统。 如果任何人因违反法律法规或不当使用本文内容而导致任何法律后果,本文作者概不负责。 请务必遵守法律…

STM32---FreeRTOS内存管理实验

一、简介 1、FreeRTOS内存管理简介 2、FreeRTOS提供的内存管理算法 1、heap_1内存管理算法 2、heap_2内存管理算法 4、heap_4内存管理算法 5、heap_5内存管理算法 二、FreeRTOS内存管理相关API函数介绍 三、 FreeRTOS内存管理实验 1、代码 main.c #include "st…

STC89C52单片机学习——第25节: [11-1]蜂鸣器

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.03.18 51单片机学习——第25节: [11-1]蜂鸣器 前言开发板说明引用解答和科普一、蜂鸣器…

音视频入门基础:RTP专题(19)——FFmpeg源码中,获取RTP的音频信息的实现(下)

本文接着《音视频入门基础&#xff1a;RTP专题&#xff08;18&#xff09;——FFmpeg源码中&#xff0c;获取RTP的音频信息的实现&#xff08;上&#xff09;》&#xff0c;继续讲解FFmpeg获取SDP描述的RTP流的音频信息到底是从哪个地方获取的。本文的一级标题从“四”开始。 四…

卷积神经网络 - 卷积的变种、数学性质

本文我们来学习卷积的变种和相关的数学性质&#xff0c;为后面学习卷积神经网络做准备&#xff0c;有些概念可能不好理解&#xff0c;可以先了解其概念&#xff0c;然后慢慢理解、逐步深入。 在卷积的标准定义基础上&#xff0c;还可以引入卷积核的滑动步长和零填充来增加卷积…

BLIP论文阅读

目录 现存的视觉语言预训练存在两个不足&#xff1a; 任务领域 数据集领域 相关研究 知识蒸馏 Method 单模态编码器&#xff1a; 基于图像的文本编码器&#xff1a; 基于图像的文本解码器&#xff1a; 三重目标优化 图像文本对比损失&#xff1a;让匹配的图像文本更加…

[动手学习深度学习]26. 网络中的网络 NiN

前面的LeNet、AlexNet、VGG在设计上的共同之处在于&#xff1a;先以卷积层构成的模块充分抽取空间特征&#xff0c;再以全连接层构成的模块来输出分类结果 其中AlexNet和VGG对LeNet的改进主要在于如何对这两个模块价款&#xff08;增加通道数&#xff09;和加深 这一节的NiN提出…

碰一碰发视频saas系统技术源头一站式开发文档

碰一碰发视频系统技术源头一站式开发文档 一、引言 在数字化信息传播高速发展的当下&#xff0c;如何让视频分享更便捷、高效&#xff0c;成为商家和开发者们关注的焦点。“碰一碰发视频”系统以其独特的交互方式和强大的功能优势&#xff0c;为视频分享领域带来了革命性变革。…

Linux目录理解

前言 最近在复习linux&#xff0c;发现有些目录总是忘记内容&#xff0c;发现有些还是得从原义和实际例子去理解会记忆深刻些。以下是个人的一些理解 Linux目录 常见的Linux下的目录如下&#xff1a; 1. 根目录 / (Root Directory) 英文含义&#xff1a;/ 是文件系统的根…

可视化图解算法:链表中倒数(最后)k个结点

1. 题目 描述 输入一个长度为 n 的链表&#xff0c;设链表中的元素的值为ai &#xff0c;返回该链表中倒数第k个节点。 如果该链表长度小于k&#xff0c;请返回一个长度为 0 的链表。 数据范围&#xff1a;0≤n≤105&#xff0c;0 ≤ai≤109&#xff0c;0 ≤k≤109 要求&am…

Swift 并发中的任务让步(Yielding)和防抖(Debouncing)

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

HW基本的sql流量分析和wireshark 的基本使用

前言 HW初级的主要任务就是看监控&#xff08;流量&#xff09; 这个时候就需要我们 了解各种漏洞流量数据包的信息 还有就是我们守护的是内网环境 所以很多的攻击都是 sql注入 和 webshell上传 &#xff08;我们不管对面是怎么拿到网站的最高权限的 我们是需要指出它是…

docker-compose install nginx(解决fastgpt跨区域)

CORS前言 CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种安全措施,它允许或拒绝来自不同源(协议、域名、端口任一不同即为不同源)的网页访问另一源中的资源。它的主要作用如下: 同源策略限制:Web 浏览器的同源策略限制了从一个源加载的文档或脚本如何与另一…

设计模式(创建型)-单例模式

摘要 在软件开发的世界里&#xff0c;设计模式是开发者们智慧的结晶&#xff0c;它们为解决常见问题提供了经过验证的通用方案。单例模式作为一种基础且常用的设计模式&#xff0c;在许多场景中发挥着关键作用。本文将深入探讨单例模式的定义、实现方式、应用场景以及可…

鸿蒙NEXT开发问题大全(不断更新中.....)

目录 问题1&#xff1a;鸿蒙NEXT获取华为手机的udid ​问题2&#xff1a;[Fail]ExecuteCommand need connect-key? 问题3&#xff1a;测试时如何安装app包 问题1&#xff1a;鸿蒙NEXT开发获取华为手机的udid hdc -t "设备的序列号" shell bm get --udid 问题2&…

TI的Doppler-Azimuth架构(TI文档)

TI在AWR2944平台上推出新的算法架构&#xff0c;原先的处理方式是做完二维FFT后在RD图上做CFAR检测&#xff0c;然后提取各个通道数据做测角。 Doppler-Azimuth架构则是做完二维FFT后&#xff0c;再做角度维FFT&#xff0c;生成Doppler-Azimuth频谱图&#xff0c;然后在该频谱图…

「自动驾驶的数学交响曲:线性代数、微积分与优化理论的深度共舞」—— 解析人工智能背后的高阶数学工具链

引言 自动驾驶系统是数学工具链的集大成者。从传感器数据的多维空间映射到控制指令的生成,每一步都隐藏着线性代数、微积分、概率论和优化理论的精妙配合。本文将构建一个数学模型完整的自动驾驶案例,结合Python代码实现,揭示以下核心数学工具: 线性代数:张量运算与特征空…