当前位置: 首页 > news >正文

OpenCV---图像预处理(四)

OpenCV—图像预处理(四)


文章目录

  • OpenCV---图像预处理(四)
  • 九,图像掩膜
    • 9.1 制作掩膜
    • 9.2 与运算
    • 9.3 颜色替换
      • 9.3.1
      • 9.3.2 颜色替换
  • 十,ROI切割
  • 十 一,图像添加水印
    • 11.1模板输入
    • 11.2 与运算
    • 11.3 图像融合(图像位与操作)


九,图像掩膜

9.1 制作掩膜

掩膜(Mask)是一种在图像处理中常见的操作,它用于选择性地遮挡图像的某些部分,以实现特定任务的目标。掩膜通常是一个二值化图像,并且与原图像的大小相同,其中目标区域被设置为1(或白色),而其他区域被设置为0(或黑色),并且目标区域可以根据HSV的颜色范围进行修改,如下图就是制作红色掩膜的过程:

mask=cv.inRange(img,color_low,color_high)

9.2 与运算

我们在高中时学过逻辑运算中的“与”运算,其规则是当两个命题都是真时,其结果才为真。而在图像处理中,“与”运算被用来对图像的像素值进行操作。具体来说,就是将两个图像中所有的对应像素值一一进行“与”运算,从而得到新的图像。从上面的图片我们可以看出,掩膜中有很多地方是黑色的,其像素值为0,那么在与原图像进行“与”运算的时候,得到的新图像的对应位置也是黑色的
在这里插入图片描述
通过掩膜与原图的与运算,我们就可以提取出图像中被掩膜覆盖的区域(扣图)。

cv2.bitwise_and(src1,src2[,mask])

9.3 颜色替换

颜色替换其原理就是在得到原图的掩膜之后,对掩膜中的白色区域所对应的原图中的区域进行一个像素值的修改即可。

9.3.1

由于掩膜与原图的大小相同,并且像素位置一一对应,那么我们就可以得到掩膜中白色(也就是像素值为255)区域的坐标,并将其带入到原图像中,即可得到原图中的红色区域的坐标,然后就可以修改像素值了,这样就完成了颜色的替换
在这里插入图片描述

9.3.2 颜色替换

由于掩膜与原图的大小相同,并且像素位置一一对应,那么我们就可以得到掩膜中白色(也就是像素值为255)区域的坐标,并将其带入到原图像中,即可得到原图中的红色区域的坐标,然后就可以修改像素值了,这样就完成了颜色的替换
在这里插入图片描述

  • 实际练习
import cv2 as cv
import numpy as np
#图像掩膜
img = cv.imread('txycl/images/demo.png')
img_r =cv.resize(img,(450,350))
#颜色空间转换hsv
hsv = cv.cvtColor(img_r,cv.COLOR_BGR2HSV)
#创建掩膜cv.inRange(src,lowerb,upperb,dst)
color_low = np.array([23,46,46])
color_high = np.array([34,255,255])
#创建掩膜,大小和原图一样
mask_yellow = cv.inRange(hsv,color_low,color_high)
print(mask_yellow)
#与运算
res = cv.bitwise_and(img_r,img_r,mask=mask_yellow)#替换颜色
img_r[mask_yellow==255] = [0,255,0]
#numpy的高级索引,布尔索引
#mask_yellow = 255生成布尔数组,大小和掩膜,等于255的地方为ture,否则false
#img_np[    ]= [0,255,0]进行布尔索引,筛选处为true的元素替换为[0,255,0]# cv.imshow('img',img_r)
# cv.imshow('hsv',hsv)
cv.imshow('mask',mask_yellow)
cv.imshow('res',res)
cv.imshow('img_np',img_r)
cv.waitKey(0)
cv.destroyAllWindows()

创建掩膜
在这里插入图片描述
进行与运算
在这里插入图片描述
替换颜色
在这里插入图片描述

十,ROI切割

ROI:Region of Interest,翻译过来就是感兴趣的区域。什么意思呢?比如对于一个人的照片,假如我们要检测眼睛,因为眼睛肯定在脸上,所以我们感兴趣的只有脸这部分,其他都不care,所以可以单独把脸截取出来,这样就可以大大节省计算量,提高运行速度。
在计算机视觉中,当我们使用OpenCV读取RGB三通道图像时,它会被转换成一个三维的Numpy数组。这个数组里的每个元素值都表示图像的一个像素值。这个三维数组的第一个维度(即轴0)通常代表图像的高度,第二个维度(即轴1)代表图像的宽度,而第三个维度(即轴2)代表图像的三个颜色通道(B、G、R,OpenCV读取到的图像以BGR的方式存储)所对应的像素值。

因此,我们可以通过指定切片的范围来选择特定的高度和宽度区域。这样,我们就能够获取这个区域内的所有像素值,即得到了这个区域的图像块,通过Numpy的切片操作,我们就完成了ROI切割的操作。这种提取ROI的方法允许我们仅获取感兴趣区域内的像素,而忽略其他不相关的部分,从而大大减少数据处理和存储的负担。


#ROI切割
#(363,238)(480,348)(x,y)
img = cv.imread('txycl/images/cat1.png')
#使用numpy数组进行切片
img_roi = img[238:363,348:480]
img_roi[:]=[0,0,255]
cv.imshow('img',img)
# cv.imshow('img',img_roi)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

十 一,图像添加水印

添加水印的概念其实可以理解为将一张图片中的某个物体或者图案提取出来,然后叠加到另一张图片上。具体的操作思想是通过将原始图片转换成灰度图,并进行二值化处理,去除背景部分,得到一个类似掩膜的图像。然后将这个二值化图像与另一张图片中要添加水印的区域进行“与”运算,使得目标物体的形状出现在要添加水印的区域。最后,将得到的目标物体图像与要添加水印的区域进行相加,就完成了添加水印的操作。这样可以实现将一个图像中的某个物体或图案叠加到另一个图像上,从而实现添加水印的效果。就本实验而言,会用到两个新的组件,一个是模板输入,一个是图像融合。

11.1模板输入

其实,该组件起到的就是图片输入的功能,只不过使用模板输入所输入的图片其实是作为要添加的水印,有了水印的彩色图之后,我们需要用它来制作一个掩模,这就用到了灰度化和二值化,即先灰度化后二值化,这就得到了带有水印图案的掩模。
在这里插入图片描述

11.2 与运算

有了模板的掩膜之后(也就是二值化图),我们就可以在要添加水印的图像中,根据掩膜的大小切割出一个ROI区域,也就是我们要添加水印的区域,之后让其与模板的掩膜进行与运算,我们知道,与运算的过程中,只要有黑色像素,那么得到的结果图中的对应位置也会是黑色像素。由于模板的掩膜中目标物体的像素值为黑色,所以经过与运算后,就会在ROI区域中得到模板图的形状。
在这里插入图片描述

11.3 图像融合(图像位与操作)

将模板的形状添加到水印区域之后,就可以将该图像与原始的模板图进行图像融合。该组件的目的就是将图像对应的数组中的对应元素进行相加(一定要注意这里的两个数组是规格相同的,也就是说要么都是灰度图,要么都是彩图)
在这里插入图片描述
因此就可以让原始的模板图与添加模板图形状的ROI区域进行图像融合,得到添加水印的ROI区域
在这里插入图片描述

  • 示例

#图像添加水印
#logo图片
img_logo = cv.imread('txycl/images/baolong.png')
#背景图片
img_bg = cv.imread('txycl/images/bg.png')
#获取logo的大小
h,w,_ = img_logo.shape
#从背景中切割出和logo一样的大小的区域
img_bg_roi = img_bg[0:h,0:w]
#logo进行灰度处理,并二值化
img_logo_gray = cv.cvtColor(img_logo,cv.COLOR_BGR2GRAY)#创建白色logo的掩膜,目的是获取logo的颜色,有logo没背景(反阈值法)
_,white = cv.threshold(img_logo_gray,170,255,cv.THRESH_BINARY_INV)
fg1 = cv.bitwise_and(img_logo,img_logo,mask=white)
#创建黑色logo的掩膜,目的是获取到背景颜色,有背景没logo(阈值法)
_,black = cv.threshold(img_logo_gray,170,255,cv.THRESH_BINARY)
fg2 = cv.bitwise_and(img_bg_roi,img_bg_roi,mask=black)
#图像融合
img_bg_roi[:]=fg1+fg2
#让融合后的图像赋值到背景中,这样原图也修改#运行
cv.imshow('img_logo',img_logo)#logo
cv.imshow('img_bg_roi',img_bg_roi)#背景
cv.imshow('img_logo_gray',img_logo_gray)#logo灰度图
cv.imshow('fg1',fg1)#logo二值化
cv.imshow('fg2',fg2)#logo二值化
#cv.imshow('fg',fg)#融合
cv.imshow('img_bg',img_bg)#背景+logo
cv.waitKey(0)
cv.destroyAllWindows()
  • 运行
    分别为原图,roi切割图,白色掩膜,黑色掩膜图
    在这里插入图片描述
    原图水印图
    在这里插入图片描述

相关文章:

  • 使用 Flutter 遇坑小计
  • Uniapp:pages.json页面路由
  • ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(显示输出类外设之IS31FL3216)
  • 【无人机】无人机的电调校准,ESC Calibration,PX4使用手册电调校准详细步骤
  • 超详细实现单链表的基础增删改查——基于C语言实现
  • 基于 FFmpeg 的音视频处理基础原理与实验探究
  • 运维概述(linux 系统)
  • 《解锁增强型上下文学习,打造你的专属智能助手》
  • 徐州服务器租用:虚拟主机的应用场景
  • Spring AI MCP
  • Linux之信号
  • Linux——系统安全及应用
  • 2025年pta团队设计天梯赛题解
  • 【软件工程】 适配器模式
  • C#接口开发异常:System.Web.HttpRequestValidationException
  • 怎么建立自然语言领域的评价标准
  • 人工智能在智能家居中的应用与发展
  • ubuntu20.04安装安装x11vnc服务基于gdm3或lightdm这两种主流的显示管理器。
  • PyTorch深度学习框架60天进阶学习计划 - 第47天:模型压缩蒸馏技术(一)
  • Java面试(2025)—— Spring MVC
  • 印度空军计划增购40架法制“阵风”战机,此前已购买36架
  • 田野调查|“心青年”的日常秩序与归属之地
  • 牛市早报|国常会:要持续稳定股市,4月LPR今日公布
  • 海南医科大学继续开展部门正职竞聘上岗,致力营造“谁有本事谁来”
  • 学者建议:引入退休教师、青少年宫参与课后服务,为教师“减负”
  • 申花迎来中超三连胜,这一次终于零封对手了