形态学变换
cv2.morphologyEx(需要变换的图片, 选择变换方法, 核(kernel))
形态学变换(Morphological Transformations)是一种基于形状的简单变换,它的处理对象通常是二值化图像。
1.核(kernel)
一个结构化元素,通常为3x3,5x5,7x7大小的矩阵。核拥有自己的结构,比如矩形(矩阵中元素全为1),椭圆(元素为1的构成一个椭圆,其他位置为0),十字形等,可以根据具体的需求选择。
2.腐蚀
以一个核的中心对应图像的每一个像素点,依次从左到右,从上到下遍历整个图像。在二值图像中如果核覆盖的区域(由核的大小决定)其中某一个位置的值为0,那么这个核的中心点的值,也就是该像素点的值就更改为0(黑色)。只有当核覆盖的整个区域的值都不为0时,及都为白色时,该像素点的值才为白色,如此遍历图像的每一个点。
作用:腐蚀操作能够逐步收缩目标物体边界,消除孤立的噪声像素以及细化连续的目标区域(前景区域)。
3.膨胀
与腐蚀的过程相似,但是值的变化不同,当核覆盖的区域存在一个像素点是白色的时,那么核的中心点,也就是当前遍历的像素点的值就为1(白色)。只有当核覆盖的区域全部为0(黑)时,该像素点的值才为0.
作用:膨胀操作能够逐步扩大目标物体边界,连接断裂的前景部分,并填充内部空洞,使得物体轮廓更加明显且连续。
4.开运算
先腐蚀再膨胀
作用:消除噪点,去除小的杂质,而不影响图像的主体
5.闭运算
先膨胀再腐蚀
作用:消除图像中的小坑洞,连接有细小裂缝的图像区域
6.礼帽运算
原图像与开运算结果图像之差,可以查看到开运算去除的小杂质
7.黑帽运算
原图像与闭运算结果图像之差,可以查看到原图像中的细小坑洞,裂缝等
8.形态学梯度
膨胀后图像与腐蚀后图像之差,通过比较原图像与膨胀图和腐蚀图之间的差异来突出图像边缘特征。
import cv2
import numpy as np
im = cv2.imread("./my_images/car4.png")
kernel = np.ones((5, 5), dtype=np.uint8)
# 腐蚀
im_erode = cv2.erode(im, kernel, iterations=1)
# 膨胀
im_dilate = cv2.dilate(im, kernel, iterations=1)
# 开运算
im_open = cv2.morphologyEx(im, cv2.MORPH_OPEN, kernel)
# 闭运算
im_close = cv2.morphologyEx(im, cv2.MORPH_CLOSE, kernel)
# 礼帽运算
im_tophat = cv2.morphologyEx(im, cv2.MORPH_TOPHAT, kernel)
# 黑帽运算
im_blackhat = cv2.morphologyEx(im, cv2.MORPH_BLACKHAT, kernel)
# 形态学梯度(膨胀图像与腐蚀图像之差)
im_gradient = cv2.morphologyEx(im, cv2.MORPH_GRADIENT, kernel)
cv2.imshow("im_erode", im_erode)
cv2.imshow("im_dilate", im_dilate)
cv2.imshow("im_open", im_open)
cv2.imshow("im_close", im_close)
cv2.imshow("im_tophat", im_tophat)
cv2.imshow("im_blackhat", im_blackhat)
cv2.imshow("im_gradient", im_gradient)
cv2.waitKey(0)
图像颜色识别
计算机常用的颜色空间,RGB,HSV
颜色加法
图像可以使用numpy中的矩阵加法,也可以使用opencv中的加法运算(加法和加权加法)
区别:如果超出uint8的范围,numpy采用取模的操作,而opencv则是饱和操作(超出255,视为255)
import cv2
import numpy as np
im = cv2.imread("./my_images/pig.png")
im1 = cv2.imread("./my_images/cao.png")
# numpy矩阵直接相加
im_np = im + im1
# 使用opencv中的add相加
im_add = cv2.add(im, im1)
# 加权加法
im2 = cv2.addWeighted(im, 0.3, im1, 0.7, 0)
cv2.imshow("im_np", im_np)
cv2.imshow("im_add", im_add)
cv2.imshow("im2", im2)
cv2.waitKey(0)
HSV颜色空间
HSV颜色空间使用色调(Hue)、饱和度(Saturation)和亮度(Value)三个参数来表示颜色,色调H表示颜色的种类,如红色、绿色、蓝色等;饱和度表示颜色的纯度或强度,如红色越纯,饱和度就越高;亮度表示颜色的明暗程度,如黑色比白色亮度低。
优点:
降维处理有利于计算:在图像处理中,降维处理可以减少计算的复杂性和计算量。HSV颜色空间相对于RGB颜色空间,减少了两个维度(红、绿、蓝),这有利于进行一些计算和处理任务,比如色彩分割、匹配等。
图像颜色识别替换
掩膜:一种在图像处理中常见的操作,它用于选择性地遮挡图像的某些部分,以实现特定任务的目标,通常为二值图像(黑,白)
与运算:逻辑运算的一种,例如255&221,在二进制中分别为11111111和11011101,两个数按位进行与运算,同真为真,一假具假
颜色识别:将图像转换为HSV空间,通过对像素值的范围判断,识别对应的颜色
颜色替换:通过制作掩膜,掩膜的大小与原图大小一致,元素一一对应,可以按照掩膜中的坐标对应修改像素值,从而达到替换颜色的目的
import cv2
import numpy as np
im = cv2.imread("./my_images/demo.png")
im_hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
# 制作掩膜
lower = np.array([26, 43, 46])
upper = np.array([34, 255, 255])
# 原图像进行与运算,获得识别后的图像
#im1 = cv2.bitwise_and(im, im, mask=mask)
mask = cv2.inRange(im_hsv, lower, upper)
# 颜色替换
im[mask == 255] = (0, 255, 0)
cv2.imshow("im", im)
cv2.imshow("mask", mask)
cv2.waitKey(0)
ROI切割
与numpy中数组元素的切片相同
import cv2
import numpy as np
im = cv2.imread("./my_images/1.png")
# ROI切割
im_roi = im[300:600, 300:600]
cv2.imshow("im_roi", im_roi)
cv2.waitKey(0)
numpy中数组元素的切片相同
import cv2
import numpy as np
im = cv2.imread("./my_images/1.png")
# ROI切割
im_roi = im[300:600, 300:600]
cv2.imshow("im_roi", im_roi)
cv2.waitKey(0)