目录
[1 制作掩膜](#1 制作掩膜)
[2 与运算](#2 与运算)
[3 颜色替换](#3 颜色替换)
[3.1 制作掩膜](#3.1 制作掩膜)
[3.2 颜色替换](#3.2 颜色替换)
1 制作掩膜
掩膜用于选择性地遮挡图像的某些部分,以实现特定任务的目标。通常是二值化图像,目标区域为1,其他区域为0,并且目标区域可以根据HSV地颜色范围进行修改。下图是制作红色掩膜的过程:
通过这个掩膜,我们就可以对掩膜中的白色区域所对应的原图中的区域进行处理与操作。
mask=cv.inRange(img,color_low,color_high)
cv2.inRange用于进行多通道图像(尤其是彩色图像)的阈值操作。
2 与运算
在图像处理中,"与"运算被用来对图像的像素值进行操作。具体来说,就是将两个图像中所有的对应像素值一一进行"与"运算,从而得到新的图像。从上面的图片我们可以看出,掩膜中有很多地方是黑色的,其像素值为0,那么在与原图像进行"与"运算的时候,得到的新图像的对应位置也是黑色的,如下图所示:
通过掩膜与原图的与运算,我们就可以提取出图像中被掩膜覆盖的区域(扣图)。
cv2.bitwise_and(src1,src2[,mask])
src1
:第一个输入数组。通常是输入的原始图像。
src2
:第二个输入数组。它可以是另一个图像、一个常数值或者与 src1
相同的图像。
当应用掩膜时,这个参数经常就是src1
本身;即对同一个图像进行操作。
如果对两个不同的图像执行按位与操作(例如,将两张图片的某些部分组合在一起),可以分别将它们作为 src1
和 src2
输入到 cv2.bitwise_and()
函数中,创建复杂的图像效果或进行图像合成。
mask
:掩膜(可选)。输入数组元素只有在该掩膜非零时才被处理。是一个8位单通道的数组,尺寸必须与src1
和src2
相同。
返回值:输出数组,应用掩膜后的图像,与输入数组大小和类型相同。
3 颜色替换
前一个实验中,我们已经能够识别到图像中的某一种颜色,那么我们就可以对识别到的颜色进行一个操作,比如将其替换成别的颜色,其原理就是在得到原图的掩膜之后,对掩膜中的白色区域所对应的原图中的区域进行一个像素值的修改即可。
3.1 制作掩膜
如下图所示,可以选择制作不同颜色的掩膜:

通过这个掩膜,我们就可以对掩膜中的白色区域所对应的原图中的区域(也就是原图中的红色区域)进行像素值的修改,从而完成颜色替换的功能。
3.2 颜色替换
由于掩膜与原图的大小相同,并且像素位置一一对应,那么我们就可以得到掩膜中白色(也就是像素值为255)区域的坐标,并将其带入到原图像中,即可得到原图中的红色区域的坐标,然后就可以修改像素值了,这样就完成了颜色的替换,如下图所示:

-
mask_image_np == 255
: 这一部分实际上是在生成一个布尔数组,其形状与mask_image_np
相同。 -
image_np[...] = (0, 255, 0)
: 这里使用了NumPy的高级索引功能。
案例:
python
import cv2 as cv
import numpy as np
# 读取图像
# img = cv.imread("./images/demo.png")
img = cv.imread('./images/fruit.jpg')
# 调整图像大小
img_np = cv.resize(img,(480,480))
# 颜色空间转为HSV
hsv_img_np = cv.cvtColor(img_np,cv.COLOR_BGR2HSV)
# 创建掩膜:cv2.inRange(img,(h,s,v)min,(h,s,v)max)
color_low = np.array([0,43,46])
color_high = np.array([10,255,255])
color_low1 = np.array([156,43,46])
color_high1 = np.array([180,255,255])
# 创建掩膜:大小和原图一致,二值化图像
mask_yellow = cv.inRange(hsv_img_np,color_low,color_high)
mask_yellow1 = cv.inRange(hsv_img_np,color_low1,color_high1)
mask_yellow = mask_yellow | mask_yellow1
# print(mask_yellow)
# 与运算:把原图和掩膜进行与运算,
color_img = cv.bitwise_and(img_np,img_np ,mask=mask_yellow)
# 替换颜色
img_np[mask_yellow==255] = (0,255,0)
"""
numpy高级索引------布尔索引
mask_yellow==255:生成一个布尔值,大小和掩膜一致,等于255的地方值域为True,否则为False
img_np[..]=(0,255,0):进行布尔索引,在方括号里放置布尔数组
筛选出原始图像中满足条件(掩膜中对应位置为255)的像素值,把该值改为(0,255,0)
"""
cv.imshow("img1",img)
# cv.imshow("img",img_np)
cv.imshow("hsv",hsv_img_np)
cv.imshow("mask",mask_yellow)
cv.imshow("color",color_img)
cv.imshow("img2",img_np)
cv.waitKey(0)
cv.destroyAllWindows()
输出:
|----------------------------------------------------------------------------|----------------------------------------------------------------------------|----------------------------------------------------------------------------|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| |
|
|
|
|
| 原图 | hsv颜色空间 | 掩膜 | 与运算 | 颜色替换 |