一、开运算
开运算就是对图像先进行腐蚀操作, 然后进行膨胀操作。开运算可以去除二值化图中的小的噪点,并分离相连的物体。
其主要目的就是消除那些小白点
在开运算组件中,有一个叫做kernel的参数,指的是核的大小,通常为3x3、5x5、7x7
二、制作掩膜
掩膜(Mask)是一种在图像处理中常见的操作,它用于选择性地遮挡图像的某些部分,以实现特定任务 的目标。掩膜通常是一个二值化图像,并且与原图像的大小相同,其中目标区域被设置为1(或白色), 而其他区域被设置为0(或黑色),并且目标区域则可以根据HSV的颜色范围进行修改,如下图所示,可 以选择制作不同颜色的掩膜:
三、颜色替换
由于掩膜与原图的大小相同,并且像素位置一一对应,那么我们就可以得到掩膜中白色(也就是像素值 为255)区域的坐标,并将其带入到原图像中,即可得到原图中的红色区域的坐标,然后就可以修改像 素值了,这样就完成了颜色的替换。
导入模块
import cv2
import numpy as np
输入图像
img=cv2.imread('red_green_blue_yello.png')
GBR到HSV转换
img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
创造掩膜
lowerb=np.array([0,43,46])
upperb=np.array([10,255,255])
img_mask=cv2.inRange(img_hsv,lowerb,upperb)
构建核
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
开运算
img_open=cv2.morphologyEx(img_mask,cv2.MORPH_OPEN,kernel)
颜色替换
for i in range(img_open.shape[0]):
for j in range(img_open.shape[1]):
if img_open[i,j]==255:
img[i,j]=(255,0,0)
或
img[img_open==255]=(255,0,0)
输出图像
cv2.imshow('img',img)
cv2.waitKey(0)
完整代码
import cv2 # 导入OpenCV库
import numpy as np # 导入NumPy库,用于数组处理
# 读取图像
img = cv2.imread('red_green_blue_yello.png')
# 将BGR图像转换为HSV颜色空间
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 定义HSV颜色空间的阈值范围,以识别特定颜色(例如,红色)
lowerb = np.array([0, 43, 46]) # HSV下界
upperb = np.array([10, 255, 255]) # HSV上界
# 创建掩膜,提取在指定HSV范围内的颜色区域
img_mask = cv2.inRange(img_hsv, lowerb, upperb)
# 创建一个3x3的矩形结构元素(用于形态学操作)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
# 对掩膜进行开运算,去除小噪声
img_open = cv2.morphologyEx(img_mask, cv2.MORPH_OPEN, kernel)
# for i in range(img_open.shape[0]):
# for j in range(img_open.shape[1]):
# if img_open[i,j]==255:
# img[i,j]=(255,0,0)
# 将开运算后掩膜中白色区域对应的原图像区域更改为蓝色
# img[i,j]=(255,0,0) 是将白色区域设置为蓝色 (OpenCV中的BGR格式)
img[img_open == 255] = (255, 0, 0)
# 显示处理后的图像
cv2.imshow('img', img)
# 等待用户按键后关闭窗口
cv2.waitKey(0)
四、库函数
morphologyEx()
cv.morphologyEx( src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] ) -> dst
方法 | 描述 |
---|---|
src | 源图像。通道数可以是任意的。深度应为 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F 之一。 |
dst | 与源图像大小和类型相同的目标图像。 |
op | 形态作的类型请参见 MorphTypes |
kernel | Structuring 元素。可以使用 getStructuringElement 创建它。 |
anchor | 内核的锚点位置。负值表示锚点位于内核中心。 |
iterations | 应用侵蚀和扩张的次数。 |
borderType | 像素外插方法,请参阅 BorderTypes。不支持BORDER_WRAP。 |
borderValue | border 值(如果边界为常量)。默认值具有特殊含义。 |