形态学变换
形态学变换是一种基于形状的图像处理技术,主要应用于二值化图像。它的核心操作包括腐蚀和膨胀,这两者是对立的基本操作。
-
核(结构化元素):核是一个小的矩阵或模板,用于在图像上进行操作。它定义了进行形态学变换时考虑的邻域范围。
-
腐蚀(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)