[OpenCV] EP8_掩膜操作图像区域

Sub.1 图像掩膜与运算

一、核心概念⚡

  • 关键词:掩膜(Mask)、与运算(bitwise_and)、颜色替换

是什么?

  • 掩膜
    • 定义:一个二值化图像(黑白图),与原图尺寸相同,白色区域(255)表示“保留”,黑色区域(0)表示“屏蔽”。
    • 原理:通过颜色阈值(如HSV/RGB范围)筛选目标区域,生成掩膜。
  • 与运算
    • 定义:将掩膜与原图逐像素做逻辑“与”操作,保留掩膜白色区域的像素,屏蔽其他区域。
  • 颜色替换
    • 定义:通过掩膜找到目标区域,修改这些区域的像素值为新颜色。

 

二、如何用?💐

1. 制作掩膜☘️

cv2.inRange(img, lower, upper)

  1. 参数
    • img:输入图像(需转换为HSV颜色空间处理颜色更稳定)
    • lower:颜色下限 (H_min, S_min, V_min)
    • upper:颜色上限 (H_max, S_max, V_max)
  2. 返回值:二值化掩膜(目标区域为白色,其余为黑色)

颜色上下限:

2. 与运算 ☘️

cv2.bitwise_and(src1, src2, mask=None)

  1. 参数

    • src1,src2:输入图像(通常用同一张图)
      • 应用掩膜时,两个参数都是img本身,即对同一图像进行操作
      • 对不同图像:按位与操作,创建复杂的图像效果或进行图像合成
    • mask:掩膜,只处理非零区域(必须和原图同尺寸)
  2. 返回值:新图像!掩膜区域的像素保留,其他区域变黑(不会修改原图)

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. 需针对性处理图像的某部分(如目标检测、特征提取)。
  2. 全图处理计算量过大时,优先处理关键区域。

二、如何用?💐

1. 语法/函数☘️

roi = image[y1:y2, x1:x2] 

  1. 参数
    • y1:y2:高度方向范围(行,从上到下)
    • x1:x2:宽度方向范围(列,从左到右)
  2. 返回值:ROI区域(Numpy数组视图)
  3. 注意点
    • 坐标顺序:[y范围, x范围](先高后宽)
    • 边界检查:不能越界,y1,x1要小于y2,x2
    • 切片范围:左闭右开

Sub.3 图像添加水印

一、核心概念⚡

  • 关键词:掩膜(Mask);位与运算;图像融合;ROI定位

是什么?

  • 定义:通过模板图像(Logo)生成掩膜,利用逻辑运算将水印嵌入目标图像指定区域。
  • 原理
    1. 模板输入:将水印图二值化,生成黑白掩膜(白色为水印区域)。
    2. 与运算:用掩膜在原图ROI区域“挖洞”(保留水印形状)。
    3. 图像融合:将水印颜色与挖洞后的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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值