OpenCV图像认知(二)

形态学变换:

核:

核(kernel)其实就是一个小区域,通常为3*3、5*5、7*7大小,有着其自己的结构,比如矩形结构、椭圆结构、十字形结构,如下图所示。通过不同的结构可以对不同特征的图像进行形态学操作的处理。

腐蚀:

腐蚀操作就是使用核在原图(二值化图)上进行从左到右、从上到下的滑动(也就是从图像的左上角开始,滑动到图像的右下角)。在滑动过程中,令核值为1的区域与被核覆盖的对应区域进行相乘,得到其最小值,该最小值就是卷积核覆盖区域的中心像素点的新像素值,接着继续滑动。由于操作图像为二值图,所以不是黑就是白,这就意味着,在被核值为1覆盖的区域内,只要有黑色(像素值为0),那么该区域的中心像素点必定为黑色(0)。这样做的结果就是会将二值化图像中的白色部分尽可能的压缩,如下图所示,该图经过腐蚀之后,“变瘦”了。

代码:

import cv2
import numpy as np

image = cv2.imread(图片路径)
k = np.ones((3,3),np.uint8)#设置核值
#iterations:表示腐蚀次数
e_img = cv2.erode(image, k, iterations=2)#进行腐蚀操作
cv2.imshow('image',image)
cv2.imshow('e_img',e_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

作用:

去除噪声:腐蚀可以消除小的噪声点。

分离物体:能够分离接触的物体。

缩小目标:使目标区域变小,边界向内收缩。

膨胀:

膨胀与腐蚀刚好相反,膨胀操作就是使用核在原图(二值化图)上进行从左到右、从上到下的滑动(也就是从图像的左上角开始,滑动到图像的右下角),在滑动过程中,令核值为1的区域与被核覆盖的对应区域进行相乘,得到其最大值,该最大值就是核覆盖区域的中心像素点的新像素值,接着继续滑动。由于操作图像为二值图,所以不是黑就是白,这就意味着,在卷积核覆盖的区域内,只要有白色(像素值为255),那么该区域的中心像素点必定为白色(255)。这样做的结果就是会将二值化图像中的白色部分尽可能的扩张,如下图所示,该图经过膨胀之后,“变胖”了。

代码:

import cv2
import numpy as np

image = cv2.imread(图片路径)
k = np.ones((5,5),np.uint8)#设置核值
#iterations:进行膨胀操作的次数
d_img = cv2.dilate(image, k, iterations=2)#进行膨胀操作
cv2.imshow('d_img',d_img)
cv2.imshow('image',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 作用:

填补空洞:膨胀可以填补目标区域中的小孔或断裂。

扩展边界:使目标区域的边界向外扩展。

连接物体:能够连接接近但不接触的物体。

开运算:

图像开运算是图像依次经过腐蚀、膨胀处理后的过程。

代码:

import cv2
import numpy as np

image = cv2.imread('图片路径')
k = np.ones((7,7),np.uint8)
#开运算:先腐蚀 后膨胀
k_img = cv2.morphologyEx(image, cv2.MORPH_OPEN, k)
cv2.imshow('image',image)
cv2.imshow('k_img',k_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

作用:

分离物体,消除小区域

消除噪点,去除小的干扰块,而不影响原来的图像

闭运算:

闭运算与开运算相反,是先膨胀后腐蚀。

代码:

import cv2
import numpy as np

image = cv2.imread('图片路径')
k = np.ones((7,7),np.uint8)
#闭运算:先膨胀 后腐蚀
b_img = cv2.morphologyEx(image, cv2.MORPH_CLOSE, k)
cv2.imshow('image',image)
cv2.imshow('b_img',b_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

作用: 

消除/“闭合”物体里面的孔洞

可以填充闭合区域

礼帽运算:

原图像与“开运算“的结果图之差。

代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread("图片路径")
# 定义结构元素
kernel = np.ones((7, 7), np.uint8)
# 执行腐蚀操作
eroded = cv2.morphologyEx(img, cv2.MORPH_TOPHAT,kernel)
# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Eroded Image', eroded)
cv2.waitKey(0)
cv2.destroyAllWindows()

作用:

分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用礼帽运算进行背景提取

黑帽运算:

”闭运算“的结果图与原图像之差。

代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread("图片路径")
# 定义结构元素
kernel = np.ones((7, 7), np.uint8)
# 执行黑帽操作
eroded = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT,kernel)
# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Eroded Image', eroded)
cv2.waitKey(0)
cv2.destroyAllWindows()

作用: 

分离比邻近点暗一些的斑块。

形态学梯度:

形态学梯度是一个基于结构元素的图像处理方法,它通过比较原图像与膨胀图和腐蚀图之间的差异来突出图像边缘特征。具体来说,对于图像中的每个像素点,其形态学梯度值是该像素点在膨胀后的图像值与其在腐蚀后的图像值之差。这样得到的结果通常能够强化图像的边缘信息,并且对噪声有一定的抑制作用。

代码:

import cv2
import numpy as np

image = cv2.imread('图片路径')
k = np.ones((9,9), np.uint8)
t_img = cv2.morphologyEx(image, cv2.MORPH_GRADIENT, k)
cv2.imshow('image', image)
cv2.imshow('t_img', t_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图片颜色识别:

RGB颜色空间:

RGB颜色空间是最常用的一种颜色表示方法,它基于人类视觉系统的三色理论,通过红(Red)、绿(Green)、蓝(Blue)三种基本颜色的不同组合来表示各种颜色。这三种颜色可以通过不同强度的光的组合来创建其他颜色。

RGB颜色空间可以产生大约1600万种颜色,几乎包括了世界上的所有颜色,也就是说可以使用RGB颜色空间来生成任意一种颜色。

注意:在OpenCV中,颜色是以BGR的方式进行存储的,而不是RGB,这也是上面红色的像素值是(0,0,255)而不是(255,0,0)的原因。

颜色加法:

两个图像具有相同的大小和类型,可以使用OpenCV的add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res = img1 + img2。

OpenCV加法和Numpy加法之间存在差异。

OpenCV的加法是饱和操作:

x = np.uint8([250])
y = np.uint8([10])
print( cv.add(x,y) ) # 250+10 = 260 => 255

Numpy添加是模运算:

x = np.uint8([250])
y = np.uint8([10])
print( x+y )        # 250+10 = 260 % 256 = 4

颜色加权加法:

颜色加法的一种,按照两幅图比重的不同,给人一种混合和透明的感觉。

混合加法公式:

dst=\alpha \cdot img1+\beta \cdot img2+\gamma

dst:输出图像,α,β分别为img1和img2的权重(大小0-1之间),γ为添加到每个和的标量值(亮度调节)

代码:

import cv2

image1 = cv2.imread('../src/pig.png')
image2 = cv2.imread('../src/cao.png')
image3 = cv2.addWeighted(image1,0.7, image2,0.3,0)
cv2.imshow('image1',image1)
cv2.imshow('image2',image2)
cv2.imshow('img',image3)
cv2.waitKey(0)
cv2.destroyAllWindows()

 HSV颜色空间:

HSV颜色空间指的是HSV颜色模型,这是一种与RGB颜色模型并列的颜色空间表示法。HSV颜色空间使用色调(Hue)、饱和度(Saturation)和亮度(Value)三个参数来表示颜色,色调H表示颜色的种类,如红色、绿色、蓝色等;饱和度表示颜色的纯度或强度,如红色越纯,饱和度就越高;亮度表示颜色的明暗程度,如黑色比白色亮度低。

为什么有了RGB颜色空间我们还是需要转换成HSV颜色空间来进行图像处理呢?

RGB颜色空间虽然直接对应设备的颜色显示方式,但在实际图像处理中我们常转换为HSV空间,主要因为HSV更符合人类对颜色(色调、饱和度、明度)的直观感知,使颜色调整更直观高效。HSV将颜色信息集中在H和S通道,与亮度(V通道)分离,不仅对光照变化更具鲁棒性,还能简化计算处理(如颜色检测只需处理两个维度)。相比RGB需要同时调整三个通道的复杂操作,HSV允许单独调整颜色属性(如只改变色调或饱和度),在颜色分割、特征提取等任务中表现更优,因此成为计算机视觉中颜色处理的首选空间。

在进行图片颜色识别时,我们会将RGB图像转换到HSV颜色空间,然后根据颜色区间来识别目标颜色。

制作掩膜:

掩膜(Mask)是一种在图像处理中常见的操作,它用于选择性地遮挡图像的某些部分,以实现特定任务的目标。

掩膜通常是一个二值化图像,并且与原图像的大小相同,其中目标区域被设置为1(或白色),而其他区域被设置为0(或黑色),并且目标区域则可以根据HSV的颜色范围进行修改。

代码:

import cv2
import numpy as np

image = cv2.imread('car.png')
#转换成HSV图像
hsv_img = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
#定义取色区间(比如蓝色)
low = np.array([100,100,100])
up = np.array([140,255,255])
#inRange函数创建掩膜
img = cv2.inRange(hsv_img,low,up)
cv2.imshow('img',img)
cv2.imshow('image',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

将原图像转换为hsv图像,然后定义一个选色区间制作掩膜。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值