OpenCV基本图像处理操作(一)——图像基本操作与形态学操作

news2024/9/22 1:04:09

环境配置地址

图像显示

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
img=cv2.imread('cat.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img_gray.shape
cv2.imshow("img_gray", img_gray)
cv2.waitKey(0)    
cv2.destroyAllWindows() 

在这里插入图片描述

转hsv图像

颜色表示为三个组成部分:色调(Hue)、饱和度(Saturation)和亮度(Value)。常用于图像处理中,因为它允许调整颜色的感知特性,如色彩和亮度,这些在RGB颜色模型中不那么直观。
HSV模型特别适用于任务如图像分割和对象追踪,因为它可以更好地处理光照变化的影响。

hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

cv2.imshow("hsv", hsv)
cv2.waitKey(0)    
cv2.destroyAllWindows()

在这里插入图片描述

图像阈值

ret, dst = cv2.threshold(src, thresh, maxval, type)
  • src: 输入图,只能输入单通道图像,通常来说为灰度图

  • dst: 输出图

  • thresh: 阈值

  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值

  • type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

  • cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0

  • cv2.THRESH_BINARY_INV THRESH_BINARY的反转

  • cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变

  • cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0

  • cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转

ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)

titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
    plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

滤波操作

# 均值滤波
# 简单的平均卷积操作
blur = cv2.blur(img, (3, 3))

在这里插入图片描述

简单滤波
blur = cv2.blur(img, (3, 3))
cv2.imshow('blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

局部平均滤波

cv2.boxFilter 用于对图像进行框滤波处理,也就是局部平均滤波。函数会计算图像中每个像素的邻域像素的平均值,并用这个平均值替换中心像素。这种滤波方法可以用于去噪和图像平滑处理。

这里是使用 cv2.boxFilter 的基本语法:

dst = cv2.boxFilter(src, ddepth, ksize, anchor=(-1, -1), normalize=True, borderType=cv2.BORDER_DEFAULT)
  • src: 输入图像。
  • ddepth: 输出图像的所需深度(数据类型),如果为 -1,则输出和输入有相同的深度。
  • ksize: 核的大小,表示滤波器窗口的宽度和高度。
  • anchor: 核的锚点位置,默认值为核中心。
  • normalize: 如果设置为 True,则函数计算像素的平均值;如果为 False,则进行求和(可能会导致数值溢出)。
  • borderType: 边界像素的插值方式。

这种滤波器对于简单的图像平滑效果较好,但可能不适用于需要保留边缘信息的应用场景。

box = cv2.boxFilter(img,-1,(3,3), normalize=True)  

cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

# 方框滤波
# 基本和均值一样,可以选择归一化,容易越界
box = cv2.boxFilter(img,-1,(3,3), normalize=False)  

cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

中值滤波

cv2.medianBlur OpenCV 库中用于实现中值滤波的函数。中值滤波是一种非线性滤波技术,通常用于去除图像中的椒盐噪声(即随机出现的黑点和白点噪声),同时保持图像边缘的清晰度。

中值滤波的原理是用图像中每个像素点的邻域像素的中值来替换该像素点的值。这种方法特别有效于去除噪声点,因为噪声点通常会在其像素值上与周围像素差异很大。

下面是使用 cv2.medianBlur 的基本语法:

dst = cv2.medianBlur(src, ksize)
  • src: 输入图像。
  • ksize: 滤波器的大小,它是一个大于 1 的奇数,表示滤波器窗口的宽度和高度。在这个例子中,ksize 是 5,所以滤波窗口为 5x5。

中值滤波特别适用于去除图像的椒盐噪声,而不会使图像边缘过分模糊,因此它在图像预处理中非常有用。

# 中值滤波
# 相当于用中值代替
median = cv2.medianBlur(img, 5)  # 中值滤波

cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

高斯滤波

cv2.GaussianBlur 是 OpenCV 库中用于实现高斯模糊的函数。高斯模糊是一种图像滤波技术,用于减少图像的细节和噪声,通过这种方式可以在图像处理中实现去噪和平滑效果。

高斯模糊的工作原理是每个像素点的值被替换为其周围像素的加权平均值,权重由高斯函数决定,高斯函数以当前像素为中心,且其形状由标准差σ控制。

以下是使用 cv2.GaussianBlur 函数的基本语法:

dst = cv2.GaussianBlur(src, ksize, sigmaX)
  • src: 输入图像。
  • ksize: 滤波器的大小,必须是正数和奇数。在这个例子中,ksize 是 (5, 5),表示滤波器窗口的宽度为 5,高度也为 5。
  • sigmaX: 高斯核的标准差在 X 方向上。在此例中为 1。如果 sigmaX 为 0,它将从 ksize 计算得出。

高斯模糊被广泛用于图像处理中的边缘平滑和噪声减少,其效果较为自然。

# 高斯滤波
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
aussian = cv2.GaussianBlur(img, (5, 5), 1)  

cv2.imshow('aussian', aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

均值,中值,高斯滤波对比
# 展示所有的
res = np.hstack((blur,aussian,median))
#print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

形态学操作

原图
在这里插入图片描述

腐蚀操操作

cv2.erode 是 OpenCV 库中用于执行图像的腐蚀操作的函数。腐蚀是一种图像处理技术,通常用于减小图像中的前景对象。它主要用于去除小的白色噪点、分离两个连接在一起的对象等。

在腐蚀操作中,将一个结构元素(kernel)滑动过原始图像(src),只有当结构元素内的所有像素值都为 1 时,原始图像的中心像素才会被保留,否则该像素将被抹去(设为 0)。这样,只有当前景对象的区域足够大,才能在腐蚀操作后仍然存在。

cv2.erode 的基本语法如下:

dst = cv2.erode(src, kernel, iterations=1)
  • src: 输入图像。
  • kernel: 用于腐蚀操作的结构元素。可以使用 cv2.getStructuringElement 函数定义不同形状的结构元素。
  • iterations: 腐蚀操作的次数。在此例中,腐蚀操作执行一次。

此函数通常用于图像预处理,如去除细小噪声和分隔接触物体等,使图像的结构特征更加明显。

img = cv2.imread('images/dige.png')
kernel = np.ones((3,3),np.uint8) 
erosion = cv2.erode(img,kernel,iterations = 1)

cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

不同腐蚀次数下情况对比

在这里插入图片描述

kernel = np.ones((30,30),np.uint8) 
erosion_1 = cv2.erode(pie,kernel,iterations = 1)
erosion_2 = cv2.erode(pie,kernel,iterations = 2)
erosion_3 = cv2.erode(pie,kernel,iterations = 3)
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

膨胀操作

cv2.dilate 是 OpenCV 库中用于执行图像的膨胀操作的函数。膨胀是一种图像处理技术,通常用于增加图像中前景对象的大小。它主要用于填补前景物体中的小洞、连接邻近的对象等。

在膨胀操作中,将一个结构元素(kernel)滑动过原始图像(src),只要结构元素与原始图像的任何一个像素值相交(即至少一个为 1),原始图像的中心像素就会被设为 1。这样,前景对象在膨胀后通常会变得更大。

cv2.dilate 的基本语法如下:

dst = cv2.dilate(src, kernel, iterations=1)
  • src: 输入图像。
  • kernel: 用于膨胀操作的结构元素。可以使用 cv2.getStructuringElement 函数定义不同形状的结构元素。
  • iterations: 膨胀操作的次数。在此例中,膨胀操作执行一次。

此函数通常与腐蚀操作结合使用,在去除噪声的同时保持物体的尺寸和形状,或用于填充物体内部的小孔和缝隙。

img = cv2.imread('images/dige.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
kernel = np.ones((3,3),np.uint8) 
dige_erosion = cv2.erode(img,kernel,iterations = 1)
# 腐蚀结果
cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 膨胀结果
kernel = np.ones((3,3),np.uint8) 
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)

cv2.imshow('dilate', dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

膨胀前
在这里插入图片描述

膨胀后
在这里插入图片描述

不同膨胀结果显示
pie = cv2.imread('images/pie.png')

kernel = np.ones((30,30),np.uint8) 
dilate_1 = cv2.dilate(pie,kernel,iterations = 1)
dilate_2 = cv2.dilate(pie,kernel,iterations = 2)
dilate_3 = cv2.dilate(pie,kernel,iterations = 3)
res = np.hstack((dilate_1,dilate_2,dilate_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

开运算

开运算(Opening)和闭运算(Closing)是图像处理中常用的形态学操作,用于去除小对象、平滑边界,同时保持图像的基本形状不变。这两种操作都使用 cv2.morphologyEx 函数实现,但具体的行为取决于所使用的特定操作类型。

开运算(Opening)

开运算首先进行腐蚀操作,然后进行膨胀操作。这个顺序很重要,因为首先通过腐蚀去掉小的噪声点,然后通过膨胀恢复腐蚀的对象的大小。它常用于去除小的白噪声(前景噪声)。

在 OpenCV 中,开运算可以通过下面的代码实现:

opened_img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
  • img: 原始图像。
  • cv2.MORPH_OPEN: 指定使用开运算。
  • kernel: 结构元素,定义了操作的性质。

闭运算(Closing)

闭运算先进行膨胀操作,后进行腐蚀操作。这种操作顺序用于填充前景物体内部的小洞,或小黑点,同时可以连接靠近的对象。闭运算常用于关闭前景物体中的小孔和缝隙。

在 OpenCV 中,闭运算可以通过下面的代码实现:

closed_img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
  • img: 原始图像。
  • cv2.MORPH_CLOSE: 指定使用闭运算。
  • kernel: 结构元素,定义了操作的性质。

这两种操作非常适用于图像预处理,如在进行目标检测和轮廓分析之前,用于改善图像的质量。

# 开:先腐蚀,再膨胀
img = cv2.imread('images/dige.png')

kernel = np.ones((5,5),np.uint8) 
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

闭运算

在这里插入图片描述

梯度运算

cv2.morphologyEx函数在OpenCV中用于执行形态学操作,其中cv2.MORPH_GRADIENT是指定的操作类型之一,代表形态学梯度。

形态学梯度的原理基于图像膨胀和腐蚀的概念。简单来说:

  • 膨胀操作会扩大图像中的亮区域,通过用结构元素探测并取代中心像素的最大值来实现。
  • 腐蚀操作会缩小图像中的亮区域,通过用结构元素探测并取代中心像素的最小值来实现。

梯度操作则计算膨胀图像和腐蚀图像之间的差异。这种差异突出了图像中的高亮边缘,这是因为边缘附近的像素在膨胀时会增加其亮度,而在腐蚀时亮度会减少。因此,梯度操作能有效地捕捉到物体的边界和纹理变化,这对于图像分析和处理中的边缘检测等应用非常有用。

在代码中,kernel参数是一个结构元素,定义了膨胀和腐蚀操作的形状和大小,影响最终梯度的计算结果。

gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)

cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

礼帽操作

顶帽操作,也称为“白帽”操作,是一种形态学变换,主要用于突出比邻近区域亮的小对象或细节。它通过原始图像与开运算结果的差值来实现:

  1. 开运算:先执行腐蚀操作,然后进行膨胀。这个过程平滑了图像的外部边界,断开了狭窄的连接并消除了细小的突出部分。
  2. 顶帽操作:计算原始图像与开运算结果的差值。这个差值揭示了那些在开运算中被移除的亮部分,因此顶帽操作能够突出显示图像中比周围区域亮的小物体或细节。

cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)中的kernel参数定义了进行腐蚀和膨胀时使用的结构元素的形状和大小,从而影响操作的具体效果。顶帽操作常用于增强图像中的亮区域或用于提取具有特定形状特征的物体。

#礼帽
img = cv2.imread('dige.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

黑帽

黑帽操作,也称为“黑帽”操作,是一种形态学变换,主要用于突出比邻近区域暗的小对象或细节。它通过闭运算结果与原始图像的差值来实现:

  1. 闭运算:先进行膨胀操作,然后执行腐蚀。这个过程有助于填充前景物体中的小洞,连接邻近的对象,并保持前景物体的总体形状。
  2. 黑帽操作:计算闭运算的结果与原始图像的差值。这个差值揭示了那些在闭运算中新增的暗部分,因此黑帽操作能够突出显示图像中比周围区域暗的小物体或细节。
    cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)中的kernel参数定义了进行膨胀和腐蚀时使用的结构元素的形状和大小,从而影响操作的具体效果。黑帽操作常用于分析图像中的暗区域或检测亮背景中的暗物体。
#黑帽
img = cv2.imread('dige.png')
blackhat  = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat ', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

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

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

相关文章

【详解算法流程+程序】DBSCAN基于密度的聚类算法+源码-用K-means和DBSCAN算法对银行数据进行聚类并完成用户画像数据分析课设源码资料包

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。 与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇, 并可在噪声的空间数据…

使用webpack5+TypeScript+npm发布组件库

一、前言 作为一只前端攻城狮,没有一个属于自己的组件库,那岂不是狮子没有了牙齿,士兵没有了武器,姑娘没有了大宝SOD蜜,你没有了我.... 言归正传,下面将给大家介绍如何通过webpack5编译一个TS组件发布到NPM…

zabbix监控服务

一、监控软件的作用 作为一个运维,需要会使用监控系统查看服务器状态以及网站流量指标,利用监控系统的数据去了解上线发布的结果和网站的健康状态 利用一个优秀的监控软件,我们可以: 对系统不间断实时监控实时反馈系统当前状态保…

进程地址空间(PAS)

"进程地址空间" "虚拟地址空间" "地址空间"; "进程内存" ≠ "虚拟内存"; 32位系统虚拟地址空间为4GB,一般使用不完,用户和内核都使用不完; 前言:一个…

HarmonyOS实战开发-拼图、如何实现获取图片,以及图片裁剪分割的功能。

介绍 该示例通过ohos.multimedia.image和ohos.multimedia.mediaLibrary接口实现获取图片,以及图片裁剪分割的功能。 效果预览 使用说明: 使用预置相机拍照后启动应用,应用首页会读取设备内的图片文件并展示获取到的第一个图片,…

古月·ROS2入门21讲——学习笔记(一)核心概念部分1-14讲

讲解视频地址:1.ROS和ROS2是什么_哔哩哔哩_bilibili 笔记分为上篇核心概念部分和下篇常用工具部分 下篇:古月ROS2入门21讲——学习笔记(二)常用工具部分15-21讲-CSDN博客 目录 第一讲:ROS/ROS2是什么 1. ROS的诞生…

numpy学习笔记(5),其他实用函数

8. 更多函数 8.1 随机数 8.1.1 常用随机数 8.1.1.1 numpy.random.rand(d0, d1, …, dn) 返回[0.0, 1.0)随机浮点数,即大于等于0.0,小于1.0。d0, d1, …, dn:返回的数组形状 # 使用numpy.random.rand函数 import numpy as np np.random.r…

09 Php学习:超级全局变量

超级全局变量 PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 PHP 超级全局变量列表: $GLOBALS$_SERVER$_REQUEST$_POST$_GET$_FILES$_ENV$_COOKIE$_SESSION $GLOBALS $GLOBALS 是 PHP 中的…

javaee初阶———多线程(三)

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 此篇文章与大家分享多线程专题第三篇,关于线程安全方面的内容 如果有不足的或者错误的请您指出! 目录 八、线程安全问题(重点)1.一个典型的线程不安全的例子2.出现线程不安全的原因3.解决线程不安…

【Entity Framework】聊一聊EF中继承关系

【Entity Framework】聊一聊EF中继承关系 文章目录 【Entity Framework】聊一聊EF中继承关系一、概述二、实体类型层次结构映射三、每个层次结构一张表和鉴别器配置四、共享列五、每个类型一张表配置六、每个具体类型一张表配置七、TPC数据库架构八、总结 一、概述 Entity Fra…

高清4路HDMI编码器JR-3214HD

产品简介: JR-3214HD四路高清HDMI编码器是专业的高清音视频编码产品,该产品具有支持4路高清HDMI音视频采集功能,4路3.5MM独立外接音频输入,编码输出双码流H.264格式,音频MP3/AAC格式。编码码率可调,画面质…

盒子模型+响应式布局 + 原型链与继承

盒子模型 是什么 css布局基础,规定了元素在页面上如何呈现,以及元素之间的空间关系 由content paddingbordermargin四部分组成 为什么 盒子模型分为 标准盒子模型: 元素的宽度与高度 只包括content IE盒子模型: 元素的宽度与高度 包括content,padding,border 在实际操作中…

【数据结构】【C++】AVL树的模拟实现(插入、判断、旋转)

文章目录 1 概念2 实现2.1 AVL树结点的定义2.2 AVL树的插入2.2.1 AVL树的插入规则2.2.2 旋转2.2.2.1 左单旋2.2.2.2 右单旋2.2.2.3 左右双旋2.2.2.4 右左双旋 2.2.3 总结 3 平衡判断4 删除5 源码 1 概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二…

软件测试/测试开发丨接口测试学习笔记分享

一、Mock 测试 1、Mock 测试的场景 前后端数据交互第三方系统数据交互硬件设备解耦 2、Mock 测试的价值与意义 不依赖第三方数据节省工作量节省联调 3、Mock 核心要素 匹配规则:mock的接口,改哪些接口,接口哪里的数据模拟响应 4、mock实…

【每日刷题】Day15

【每日刷题】Day15 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 目录 1. 141. 环形链表 - 力扣(LeetCode) 2. 142. 环形链表 II - 力扣(LeetCode) 3. 143. 重…

基于Python的微博舆论分析,微博评论情感分析可视化系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

IDEA 本地库引入了依赖但编译时找不到

在使用 IDEA 开发 Maven 项目的过程中,有时会遇到本地库引入了依赖,但编译时报找不到这个依赖,可以使用命令处理。 打开 Terminal。 执行清理命令。 mvn clean install -Dmaven.test.skiptrue执行更新命令。 mvn -U idea:idea

YOLO-World——S

文章目录 Abstract成果 MethodPre-training Formulation: Region-Text PairsModel ArchitectureYOLO DetectorText EncoderText Contrastive HeadTraining with Online VocabularyInference with Offline Vocabulary Re-parameterizable Vision-Language PANText-guided CSPLay…

string类——常用函数模拟(C++)

本篇中,将会详细的介绍 Cpp 中 string 的使用,以及 string 类常用函数的模拟实现。对于 string 的内置函数来说,存在很多很冗余的用法,很多函数都有很多种用法,本篇将会讲解常用内置函数的常用用法,模拟函数…

Pytest小技巧:高效获取自动化测试结果

自动化测试用例在执行完成后,我们想要很清楚的查看到测试用例的执行结果,我们可以通过Pytest中的Hooks来进行获取吗? 其中Pytest中存在多个Hooks的函数,小编今天先简单介绍其中一种,通过pytest_runtest_makereport 获…