掌握图像处理中的颜色识别与形态学变换技术

ops/2024/11/13 21:32:31/

形态学变换

形态学变换是一种基于形状的图像处理技术,主要应用于二值化图像。它的核心操作包括腐蚀和膨胀,这两者是对立的基本操作。

  • 核(结构化元素):核是一个小的矩阵或模板,用于在图像上进行操作。它定义了进行形态学变换时考虑的邻域范围。

  • 腐蚀(Erosion):腐蚀操作会缩小图像中目标的区域。它通过将核与图像中相应部分的重叠区域进行比较,并将最小值赋给中心像素,从而减少亮区域的大小。

  • 膨胀(Dilation):膨胀操作会扩大图像中目标的区域。它通过将核与图像中相应部分的重叠区域进行比较,并将最大值赋给中心像素,从而增加亮区域的大小。

import cv2
import numpy as np
img=cv2.imread('./src/car.png')
kernel=np.ones((3,3),np.uint8)
#腐蚀(求局部最大)
img1=cv2.erode(img,kernel,iterations=1)
#膨胀(求局部最小)
img2=cv2.dilate(img,kernel,iterations=1)
#开运算(先腐蚀后膨胀)
img3=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
#闭运算(先膨胀后腐蚀)
img4=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
#礼帽运算(原图像与开运算之差)
img5=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
#黑帽运算(原图像与闭运算之差)
img6=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
#形态学梯度(膨胀图像与腐蚀图像之差)
img7=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
​
cv2.imshow("img",img)
cv2.imshow("img1",img1)
cv2.imshow("img2",img2)
cv2.imshow("img3",img3)
cv2.imshow("img4",img4)
cv2.imshow("img5",img5)
cv2.imshow("img6",img6)
cv2.imshow("img7",img7)
cv2.waitKey(0)
cv2.destroyAllWindows()

图片颜色识别

1.RGB颜色空间

RGB颜色空间是图像处理中最常见的颜色模型,用于表示和显示彩色图像。RGB代表红色(Red)、绿色(Green)和蓝色(Blue),这三种基本颜色通过不同强度的组合可以生成其他颜色。RGB模型广泛应用于电视、电脑显示屏等设备。

RGB颜色模型基于笛卡尔坐标系,其中:

  • 红色、绿色和蓝色分别位于坐标轴的三个角上。

  • 黑色位于原点(0,0,0),白色则位于坐标轴最大值的位置(255,255,255)。

  • RGB颜色空间可以产生大约1600万种颜色,几乎涵盖了所有可见颜色。

在OpenCV中,颜色是以BGR(蓝色、绿色、红色)的方式存储的,因此红色的像素值为(0,0,255),而不是(255,0,0)。

2.颜色加法,颜色加权加法

使用OpenCV的cv.add()函数或简单的NumPy操作(res = img1 + img2)可以将两幅图像相加。两幅图像需要具有相同的大小和类型。

OpenCV的加法操作是饱和加法,即像素值的总和不会超过255。NumPy的加法是模运算,会处理像素值的溢出,表现为图像混合。图像混合的公式为:

( g(x) = (1−α)f0(x) + αf1(x) )

其中,α的值在0到1之间变化,可以控制混合效果。

要将两幅图像以指定权重混合(如第一幅图像权重0.6,第二幅图像权重0.4),可以使用cv2.addWeighted()函数:

( dst = α⋅img1 + β⋅img2 + γ )

在这里,γ通常设为零。

import cv2
import numpy as np
img1=cv2.imread('./src/tu.png')
img2=cv2.imread('./src/cao.png')
t=img1+img2 #直接相加,取余
m=cv2.add(img1,img2) #颜色加法
n=cv2.addWeighted(img1,0.6,img2,0.4,0)#颜色加权加法
cv2.imshow("t",t)
cv2.imshow("m",m)
cv2.imshow("n",n)
cv2.waitKey(0)

 

3.HSV颜色空间

HSV(色调、饱和度、亮度)颜色空间是一种用于描述颜色的模型,常用于图像处理和计算机视觉中。与RGB(红、绿、蓝)模型不同,HSV将颜色分解为三个独立的分量,使得对颜色的调整和操作更加直观和方便。

HSV颜色模型是一种六角锥体模型,如下图所示:

  • 色调(Hue, H):表示颜色的类型或种类,以角度度量,范围通常为0°到360°。在HSV颜色空间中,为了与计算机处理的需要相适应,色调的范围常常被映射到0到180的范围,其中0°代表红色,120°代表绿色,240°代表蓝色,其他颜色位于这些基色之间。例如,黄色是60°,青色是180°,紫色是300°。

  • 饱和度(Saturation, S):表示颜色的纯度或强度,范围通常为0%到100%。饱和度越高,颜色越鲜艳;饱和度为0时,颜色呈现为灰色。HSV中的饱和度范围被映射到0到255之间,其中0代表无色(灰色),255代表纯色。

  • 亮度(Value, V):表示颜色的明亮程度,范围从0%(黑色)到100%(白色)。亮度越高,颜色越亮;亮度为0时,颜色为黑色。HSV中的亮度范围也被映射到0到255之间,其中0代表黑色,255代表最亮的颜色。

在实际应用中,HSV颜色空间可以使得对颜色的调整更加直观,比如在图像处理中,调整色调可以改变图像的色彩,调整饱和度可以改变颜色的鲜艳度,而调整亮度可以改变图像的明暗程度。这种表示方式在处理图像的颜色分离、色彩增强等操作时特别有用。

4.制作掩膜

掩膜(Mask)在图像处理中用于选择性地遮挡或突出图像的特定区域。它通常是一个二值图像,尺寸与原图像相同,其中目标区域标记为1(白色),其余区域标记为0(黑色)。掩膜可以基于HSV颜色范围进行调整,以便对图像的特定颜色区域进行处理或分析。

import  cv2
import numpy as np
img1=cv2.imread("./src/demo.png")
tm=cv2.cvtColor(img1,cv2.COLOR_BGR2HSV)
low=np.array([26,43,46])
hight=np.array([34,255,255])
mask=cv2.inRange(tm,low,hight) #制作掩膜
cv2.imshow("img1",img1)
cv2.imshow("mask",mask)
cv2.waitKey(0)

与运算、图片颜色替换

在图像处理中,“与”运算用于对图像的像素值进行操作。具体而言,它将两个图像中对应的像素值进行“与”运算,生成一个新图像。掩膜(Mask)是一种常见的操作工具,通常是一个二值图像,与原图像尺寸相同,其中目标区域标记为1(白色),其他区域标记为0(黑色)。在处理图像时,可以通过掩膜选择性地修改图像的部分区域。例如,如果掩膜中白色区域表示需要处理的部分,我们可以用它来对原图像中的这些区域进行像素值的修改,从而实现颜色的替换或其他操作。

import  cv2
import numpy as np
img1=cv2.imread("./src/demo.png")
hsv=cv2.cvtColor(img1,cv2.COLOR_BGR2HSV)
low=np.array([26,43,46])
hight=np.array([34,255,255])
mask=cv2.inRange(hsv,low,hight)  #制作掩膜
cl=cv2.bitwise_and(img1,img1,mask=mask) #与运算
img1[mask==255]=(0,255,0) #颜色替换
cv2.imshow("img1",img1)
cv2.imshow("mask",mask)
cv2.imshow("cl",cl)
cv2.waitKey(0)

ROI切割

ROI(Region of Interest)是图像处理中的一个重要概念,它指的是我们关注的图像区域。例如,如果我们要检测眼睛,通常只关心脸部区域,因此可以将脸部提取出来,以减少计算量并提高效率。

在使用OpenCV读取图像时,图像数据会被存储为Numpy数组,其中图像的高度、宽度和颜色通道分别对应数组的第一个、第二和第三维度。通过Numpy的切片操作,我们可以指定要提取的ROI区域的坐标,从而仅获取感兴趣区域的像素值。这种方法可以显著减少数据处理和存储的负担。

import cv2
img=cv2.imread("./src/b.png")
img2=img[130:220,100:224]
cv2.imshow("img",img)
cv2.imshow("img2",img2)
cv2.waitKey(0)

 

添加水印

添加水印通常涉及将一个图像(水印)叠加到另一张图像上。以下是一个使用OpenCV和Numpy在Python中添加水印的简单示例:

import cv2
import numpy as np
img=cv2.imread("./src/cat.png")
logo=cv2.imread("./src/logohq.png")
​
# 获取 logo 的尺寸
h, w, _ = logo.shape
# 将 logo 转换到 HSV 颜色空间
hsvlogo = cv2.cvtColor(logo, cv2.COLOR_BGR2HSV)
#提取红色范围
lower1 = np.array([0, 43, 46])
upper1 = np.array([10, 255, 255])
#提取灰色范围
lower2 = np.array([0, 0, 46])
upper2= np.array([180, 43, 220])
# 创建掩膜
mask1 = cv2.inRange(hsvlogo, lower1, upper1)
mask2 = cv2.inRange(hsvlogo, lower2, upper2)
mask3=mask1+mask2
#膨胀操作
kernel = np.ones((3,3), np.uint8)
mask=cv2.dilate(mask3,kernel,iterations=1)
# 显示掩膜
cv2.imshow("mask", mask)
# 提取与 logo 大小相同的背景区域
img2 = img[:h, :w]
# 使用掩膜提取文字区域
text_bool = (mask == 255)
# 将文字部分融合到背景图像中
img2[text_bool] = logo[text_bool]
cv2.imshow("img", img)
cv2.imshow("logo", logo)
cv2.waitKey(0)

 


http://www.ppmy.cn/ops/94085.html

相关文章

Python的反射以及应⽤用场景

Python中的反射(Reflection)是一种强大的机制,它允许程序在运行时(runtime)检查、修改其自身的结构和行为。这种机制通过内置的函数和模块实现,使得程序能够动态地访问对象的属性和方法。在Python中&#x…

WordPress原创插件:Keyword-ranking-seo 1.0 关键词排名插件 有利于seo

WordPress原创插件:Keyword-ranking-seo 1.0 关键词排名插件 有利于seo 当用户访问网站时,该链接会随机选择一个关键词,并使用选定的搜索引擎进行搜索。 插件下载链接 https://download.csdn.net/download/huayula/89632792

SpringBoot项目启动直接结束--已解决

点击启动类&#xff0c;项目启动了&#xff0c;但是却直接停止了。遇到这个问题如何解决呢&#xff1f; 想要项目一直启动是要部署在tomcat服务器上面了&#xff0c;说明现在项目没有运行在tomcat服务器上面。 解决方案: 添加springweb的starter依赖。 <dependency><…

第一篇:fiddler学习日记配置抓取https和http

Fiddler主要功能及实践 1、分析http请求/响应数据 2、设置断点&#xff0c;调试线上错误 3、设置档板服务器&#xff0c;自动返回各种响应 4、过滤会话&#xff0c;看自己想看的 案例&#xff1a; 1、分析http请求/响应数据 分析http协议请求和响应内容 查看登陆请求是否加密。…

ZK Rollup 的Sequencer

目录 ZK Rollup 的Sequencer 1. Sequence(Sequencer)的角色 2. Sequence的工作流程 3. Sequencer的重要性 4. 与其他角色的关系 ZK Rollup 的Sequencer 在ZK Rollup(也称为ZK Rollups)中,Sequence(或Sequencer)是一个关键的角色和过程,它对于实现高效的二层扩容…

[Qt][多元素控件]详细讲解

目录 0.前言1.List Widget2.Table Widget3.Tree Widget 0.前言 Qt中提供的多元素控件有&#xff1a; 列表&#xff1a; QListWidgetQListView 表格&#xff1a; QTableWidgetQTableView 树形&#xff1a; QTreeWidgetQTreeView Widget和View之间的区别&#xff0c;以QTableWi…

JDK动态代理和CGLIB动态代理案例分析

JDK动态代理和CGLIB动态代理案例分析 JDK动态代理和CGLIB动态代理的实现原理如下&#xff1a; JDK动态代理的实现原理&#xff1a; JDK动态代理是基于Java的反射机制实现的实现一个继承InvocationHandler接口的对象&#xff0c;重写invoke方法&#xff0c;invoke方法中可以在目…

ios app包应用签名证书指纹SHA256值

获取应用签名证书的指纹&#xff0c;首先要获取给app签名的证书&#xff0c;然后从证书里面获取SHA256签名&#xff0c;具体步骤如下 1 获取iOS app签名证书指纹SHA256值2 导出p12文件3 获取证书指纹SHA256值4 完成 操作步骤及代码 步骤1&#xff1a;首先&#xff0c;你需要…