Sub.1 图像掩膜与运算
一、核心概念⚡
- 关键词:掩膜(Mask)、与运算(bitwise_and)、颜色替换
是什么?
- 掩膜:
- 定义:一个二值化图像(黑白图),与原图尺寸相同,白色区域(255)表示“保留”,黑色区域(0)表示“屏蔽”。
- 原理:通过颜色阈值(如HSV/RGB范围)筛选目标区域,生成掩膜。
- 与运算:
- 定义:将掩膜与原图逐像素做逻辑“与”操作,保留掩膜白色区域的像素,屏蔽其他区域。
- 颜色替换:
- 定义:通过掩膜找到目标区域,修改这些区域的像素值为新颜色。
二、如何用?💐
1. 制作掩膜☘️
cv2.inRange(img, lower, upper)
- 参数:
img
:输入图像(需转换为HSV颜色空间处理颜色更稳定)lower
:颜色下限(H_min, S_min, V_min)
upper
:颜色上限(H_max, S_max, V_max)
- 返回值:二值化掩膜(目标区域为白色,其余为黑色)
颜色上下限:
2. 与运算 ☘️
cv2.bitwise_and(src1, src2, mask=None)
-
参数:
src1
,src2
:输入图像(通常用同一张图)- 应用掩膜时,两个参数都是img本身,即对同一图像进行操作
- 对不同图像:按位与操作,创建复杂的图像效果或进行图像合成
mask
:掩膜,只处理非零区域(必须和原图同尺寸)
-
返回值:新图像!掩膜区域的像素保留,其他区域变黑(不会修改原图)
3. 颜色替换 ☘️
流程:得到掩膜后 → 颜色替换掩膜区域
方法:对目标图像(本质是ndarray)→ 布尔索引,改值
4. 代码模式
Study Example 🍀
import cv2 as cv
import numpy as np
# 读取图像
img=cv.imread("images/demo.png")
# 调整图像大小
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([23,46,46])
color_high=np.array([34,255,255])
# 创建掩膜:大小和原图一致,二值化图像
mask_yellow=cv.inRange(hsv_img_np,color_low,color_high)
# 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("np",img_np)
cv.imshow("hsv",hsv_img_np)
cv.imshow("mask",mask_yellow)
cv.imshow("color",color_img)
cv.waitKey(0)
cv.destroyAllWindows()
Sub.2 ROI切割
一、核心概念⚡
- 关键词:Numpy切片;感兴趣区域;
是什么?
- 定义:ROI(Region of Interest)是图像中需要重点处理或分析的特定区域。通过截取该区域,可减少计算量并提升效率。
- 原理:图像在OpenCV中以Numpy数组形式存储,ROI切割本质是通过数组切片操作选取子区域。
为什么重要?
- 人脸识别时,只处理脸部区域,避免对全图计算。
- 医学图像中,聚焦病变部位,提升分析效率。
何时用?
- 需针对性处理图像的某部分(如目标检测、特征提取)。
- 全图处理计算量过大时,优先处理关键区域。
二、如何用?💐
1. 语法/函数☘️
roi = image[y1:y2, x1:x2]
- 参数
y1:y2
:高度方向范围(行,从上到下)x1:x2
:宽度方向范围(列,从左到右)
- 返回值:ROI区域(Numpy数组视图)
- 注意点
- 坐标顺序:
[y范围, x范围]
(先高后宽) - 边界检查:不能越界,y1,x1要小于y2,x2
- 切片范围:左闭右开
- 坐标顺序:
Sub.3 图像添加水印
一、核心概念⚡
- 关键词:掩膜(Mask);位与运算;图像融合;ROI定位
是什么?
- 定义:通过模板图像(Logo)生成掩膜,利用逻辑运算将水印嵌入目标图像指定区域。
- 原理:
- 模板输入:将水印图二值化,生成黑白掩膜(白色为水印区域)。
- 与运算:用掩膜在原图ROI区域“挖洞”(保留水印形状)。
- 图像融合:将水印颜色与挖洞后的ROI叠加。
二、如何用?💐
Study Example 🍀
import cv2 as cv
# 读入我们的logo和背景图,往背景里添加logo
bg=cv.imread("../images/bg.png")
logo=cv.imread("../images/logohq.png")
# 获取logo大小
h,w = logo.shape[:2]
# 从背景中切割出和logo一样大小的子区域
roi=bg[:h,:w]
# 将logo转灰度
gray_logo=cv.cvtColor(logo,cv.COLOR_BGR2GRAY)
# 创建掩膜:白色logo,目的是获取到logo的颜色,有logo没背景
_,white=cv.threshold(gray_logo,170,255,cv.THRESH_BINARY_INV)# 反阈值法
# 与运算,提取logo
fg1=cv.bitwise_and(logo,logo,mask=white)
# 创建掩膜:黑色的logo,目的是获取到背景颜色,有背景没logo
_,black=cv.threshold(gray_logo,170,255,cv.THRESH_BINARY)# 阈值法
# 与运算,提取背景
fg2=cv.bitwise_and(roi,roi,mask=black)
# 图像融合
# roi[:]=cv.add(fg1,fg2)
roi[:]=fg1+fg2
# 让融合后的图像赋值给切割出来的区域,这样原图中也会被修改像素值
cv.imshow("white",white)
cv.imshow("fg1",fg1)
cv.imshow("roi",roi)
cv.imshow("black",black)
cv.imshow("fg2",fg2)
cv.imshow("bg",bg)
cv.waitKey(0)
cv.destroyAllWindows()