形态学变换
形态学变换是图像处理和计算机视觉中的一种技术,它基于图像的几何结构进行操作。这些变换通常用于图像的分割、特征提取、噪声去除等任务。形态学变换主要有两种类型:膨胀(dilation)和腐蚀(erosion),以及它们的变体:开运算(opening)和闭运算(closing)。
核(kernel)
用于在形态学变换中与图像进行卷积操作。核可以有不同的形状和大小。
腐蚀(erosion)
-
定义结构元素(核):选择或创建一个结构元素,这通常是一个具有特定形状(如矩形、十字形、椭圆形)和大小的矩阵。
-
准备图像:读取或获取你想要处理的图像,并根据需要将其转换为灰度图像,因为形态学操作通常在单通道图像上执行。
-
应用腐蚀操作:使用结构元素对图像进行腐蚀。腐蚀操作会根据结构元素的形状和位置减少图像中亮区域的边界。
-
迭代腐蚀:如果需要更强烈的腐蚀效果,可以多次迭代腐蚀操作。
-
后处理:根据应用需求,可能需要对腐蚀后的图像进行进一步的处理,例如滤波、阈值化等。
-
分析或显示结果:分析腐蚀后的图像以提取所需信息,或将其显示出来进行视觉检查。
膨胀
-
定义结构元素(核):选择或创建一个结构元素,这通常是一个具有特定形状(如矩形、十字形、椭圆形)和大小的矩阵。
-
准备图像:读取或获取你想要处理的图像,并根据需要将其转换为灰度图像,因为形态学操作通常在单通道图像上执行。
-
应用膨胀算法:将结构元素的中心放置在图像的每个像素上,如果结构元素完全覆盖在非零像素上,则将中心像素的值(通常是255或白色)赋予原像素位置。
-
迭代过程:膨胀操作可以迭代多次,每次迭代都会使膨胀效果更加明显。
-
边界处理:在膨胀过程中,需要注意图像边界。一些实现可能会在图像边缘补充零值像素,以避免边界效应。
-
分析膨胀效果:膨胀后,分析图像以确定是否达到了预期的效果。如果没有,可能需要调整结构元素的大小或形状,或增加迭代次数。
-
后处理:根据需要,膨胀后的图像可能需要进一步处理,如滤波、阈值化或形态学闭运算等。
-
结果应用:使用膨胀后的图像进行进一步的图像分析或将其用于计算机视觉任务。
-
结果评估:最后,评估膨胀操作对图像的影响,确定是否满足特定应用的需求。
开运算
先腐蚀后膨胀,开运算的目的是通过去除小的物体或细节以及分离接近的物体来改善图像的质量。
闭运算
先膨胀后腐蚀,填充图像中小的空洞和缝隙,以及去除小的突出部分,从而实现物体的平滑和连接分离的物体。
礼帽运算
通过从图像中减去开运算的结果来实现的。这将突出比周围环境更亮的小特征。
黑帽运算
通过从闭运算的结果中减去原始图像来实现的。这将突出比周围环境更暗的小特征。
形态学梯度
用于突出显示图像中的边缘或边界。它通过形态学操作来增强图像中的对比度,特别是物体的轮廓。
import cv2
import numpy as np
kernel = np.ones((5, 5), np.uint8)
data = cv2.imread('./src/car.png')
cv2.imshow('car', data)
# 腐蚀
data1 = cv2.erode(data, kernel, iterations=1)
cv2.imshow('car1', data1)
# 膨胀
data2 = cv2.dilate(data, kernel, iterations=1)
cv2.imshow('car2', data2)
# 开运算(先腐蚀后膨胀)
data3 = cv2.morphologyEx(data, cv2.MORPH_OPEN, kernel)
cv2.imshow('car3', data3)
# 闭运算(先膨胀后腐蚀)
data4 = cv2.morphologyEx(data, cv2.MORPH_CLOSE, kernel)
cv2.imshow('car4', data4)
# 礼帽运算
data5 = cv2.morphologyEx(data, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('car5', data5)
# 黑帽运算
data6 = cv2.morphologyEx(data, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('car6', data6)
#形态学梯度
data7 = cv2.morphologyEx(data,cv2.MORPH_GRADIENT, kernel)
cv2.imshow('car7', data7)
cv2.waitKey(0)
图片颜色识别
RGB颜色空间
RGB颜色空间(Red-Green-Blue Color Space)是一种用于感知设备(如电视、显示器、相机等)的颜色表示方法。它基于人类视觉系统中三种不同类型的视锥细胞,这些细胞分别对红色、绿色和蓝色光敏感。
HSV颜色空间
HSV颜色空间(Hue-Saturation-Value Color Space),也称作HSB(Hue-Saturation-Brightness)颜色空间,是一种将颜色表示为三个维度的模型:色调(Hue)、饱和度(Saturation)和亮度(Value或Brightness)。HSV颜色空间更适合于人类对颜色的感知,并且在进行颜色选择和操作时更为直观。
颜色加法
OpenCV的加法是饱和操作
颜色加权加法
不同于颜色加法,可以实现透明感。
import cv2
data1 = cv2.imread("./src/pig.png")
data2 = cv2.imread("./src/cao.png")
#颜色加法
data3 = cv2.add(data1,data2)
data4 = data1+data2
cv2.imshow("data3",data3)
cv2.imshow("data4",data4)
#颜色加权加法
data5 = cv2.addWeighted(data1,0.8,data2,0.4,30)
cv2.imshow("data5",data5)
cv2.waitKey(0)
掩膜(Mask)
对图像的特定区域应用操作,同时保留其他区域不变。
与运算
掩膜和原图进行与运算。只显示掩膜下的内容(抠图!)
颜色替换
既然抠图了,能否将扣出的内容替换捏!
import cv2
import numpy as np
data = cv2.imread('./src/bg.png')
data = cv2.resize(data,(800,500))
data1 = cv2.cvtColor(data, cv2.COLOR_BGR2HSV)
color_low = np.array([0, 43, 46])
color_high = np.array([10, 255, 255])
#掩膜
data_np = cv2.inRange(data1, color_low, color_high)
cv2.imshow('data', data)
cv2.imshow('data_np', data_np)
#与运算(抠图?)
data2 = cv2.bitwise_and(data, data, mask=data_np)
cv2.imshow('data2', data2)
#颜色替换
data[data_np == 255] = (0,255,0)
cv2.imshow('data11', data)
cv2.waitKey(0)
ROI
ROI 是 "Region of Interest" 的缩写,意为“感兴趣区域”。在图像处理、计算机视觉和相关领域中,ROI 是指图像中用户或算法特别关注的特定部分或区域。
通过 cv2.rectangle()
函数绘制的矩形框定义了一个 ROI,然后使用这个矩形框的坐标来提取原始图像 image_np
中的一个子区域
import cv2
data = cv2.imread('./src/bg.png')
(w, h, _) = data.shape
x_min, x_max = 100, 600
y_min, y_max = 500, 900
#画出切割范围
cv2.rectangle(data, (x_min - 2, y_min - 2), (x_max + 2, y_max + 2), (0, 0, 255), 2)
#切
ROI_bg = data[y_min:y_max, x_min:x_max, :]
cv2.imshow("data", data)
cv2.imshow('ROI', ROI_bg)
cv2.waitKey(0)
练习:水印练习
思路:1、先将logo扣出来2、写入图片
import cv2
import numpy as np
# 读取图像
lo_go = cv2.imread('./src/logohq.png')
data = cv2.imread('./src/cao.png')
# 处理水印
kernel = np.ones((2, 2), np.uint8)
logo = cv2.cvtColor(lo_go, cv2.COLOR_BGR2GRAY)
_, logo_arr = cv2.threshold(logo, 127, 255, cv2.THRESH_TOZERO)
logo = cv2.merge((logo, logo, logo))
logo = cv2.cvtColor(logo, cv2.COLOR_BGR2HSV)
color_low = np.array([0, 0, 46])
color_high = np.array([180, 30, 220])
logo_np = cv2.inRange(logo, color_low, color_high)
# 扣水印
logo111 = cv2.bitwise_and(lo_go, lo_go, mask=logo_np)
logo111 = cv2.morphologyEx(logo111, cv2.MORPH_OPEN, kernel)
# 水印位置
x_offset = 50 # 水印在x轴的起始位置
y_offset = 50 # 水印在y轴的起始位置
# 计算水印区域
h, w = logo111.shape[:2]
roi = data[y_offset:y_offset + h, x_offset:x_offset + w]
# 合并水印和ROI
masked_logo = cv2.addWeighted(roi, 1, logo111, 1, 0)
# 将合成的区域放回到原图
data[y_offset:y_offset + h, x_offset:x_offset + w] = masked_logo
# 显示结果
cv2.imshow('Watermarked Image', data)
cv2.waitKey(0)
cv2.destroyAllWindows()