【图像掩膜】——图像预处理(OpenCV)

目录

[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本身;即对同一个图像进行操作。

如果对两个不同的图像执行按位与操作(例如,将两张图片的某些部分组合在一起),可以分别将它们作为 src1src2 输入到 cv2.bitwise_and() 函数中,创建复杂的图像效果或进行图像合成。

mask:掩膜(可选)。输入数组元素只有在该掩膜非零时才被处理。是一个8位单通道的数组,尺寸必须与src1src2相同。

返回值:输出数组,应用掩膜后的图像,与输入数组大小和类型相同。

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颜色空间 | 掩膜 | 与运算 | 颜色替换 |

相关推荐
白熊1884 小时前
【大模型LLM】梯度累积(Gradient Accumulation)原理详解
人工智能·大模型·llm
愚戏师4 小时前
机器学习(重学版)基础篇(算法与模型一)
人工智能·算法·机器学习
F_D_Z5 小时前
【PyTorch】图像多分类项目部署
人工智能·pytorch·python·深度学习·分类
音视频牛哥6 小时前
打通视频到AI的第一公里:轻量RTSP服务如何重塑边缘感知入口?
人工智能·计算机视觉·音视频·大牛直播sdk·机器视觉·轻量级rtsp服务·ai人工智能
Wendy14417 小时前
【灰度实验】——图像预处理(OpenCV)
人工智能·opencv·计算机视觉
中杯可乐多加冰7 小时前
五大低代码平台横向深度测评:smardaten 2.0领衔AI原型设计
人工智能
无线图像传输研究探索8 小时前
单兵图传终端:移动场景中的 “实时感知神经”
网络·人工智能·5g·无线图传·5g单兵图传
zzywxc7879 小时前
AI在编程、测试、数据分析等领域的前沿应用(技术报告)
人工智能·深度学习·机器学习·数据挖掘·数据分析·自动化·ai编程
铭keny9 小时前
YOLOv8 基于RTSP流目标检测
人工智能·yolo·目标检测
墨尘游子9 小时前
11-大语言模型—Transformer 盖楼,BERT 装修,RoBERTa 直接 “拎包入住”|预训练白话指南
人工智能·语言模型·自然语言处理