OpenCV基本功 之 图像的掩模、运算 合并专题 -小啾带学【Python-Open_CV系列(七)】

article/2025/9/30 22:02:21

OpenCV图像的掩模、运算 与 合并专题 【Python-Open_CV系列(七)】

文章目录

  • 1.图像的掩模
  • 2.图像的运算
    • 2.1 图像的加法运算
      • 2.1.1 “+”方法
      • 2.1.2 cv2.add()方法
      • 2.1.3 使用掩模遮盖相加结果
    • 2.2 图像的位运算
      • 2.2.1 按位与 cv2.bitwise_and()
      • 2.2.2 按位或 cv2.bitwise_or()
      • 2.2.3 按位取反 cv2.bitwise_not()
      • 2.2.4 按位异或 cv2.bitwise_xor()
    • 2.3 图像加密
  • 3.图像的合并
    • 3.1加权合并
    • 3.2 覆盖合并


ʚʕ̯•͡˔•̯᷅ʔɞ
🍹欢迎各路大佬来到小啾主页指点☀️欢迎大家前来学习OpenCV基本功 之 图像的掩模、运算 & 合并专题 -小啾带学, Python-Open_CV系列博文第七篇,我是博主侯小啾。
我的博客主页:云雀编程小窝 🌹꧔ꦿ
🌹꧔ꦿ博文内容如对您有所帮助,还请给个点赞 + 关注 + 收藏

                请添加图片描述请添加图片描述请添加图片描述
🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ

如有疑问欢迎随时在评论区交流。☀️


1.图像的掩模

掩模,即掩码(mask)。用计算机处理图像时,常常是有的内容需要处理,有的内容不需要处理。通过掩模,可以实现将我们不需要处理的部分暂时“遮住”,以保证其保持不变。而仅仅操作其暴露出来的部分。整个操作过程就像做手术时医生使用的“手术洞巾”。

掩模过程通常使用二值图像表示,像素值0表示纯黑色,其区域表示我们不需要操作的部分。像素值为255的纯白色部分表示我们想要操作的部分。(某些情况也可以用0,1作为掩模值)。掩模对象通过操作numpy数组创建,没有专有方法。

以下边这幅名画《思考的男人》为例,我们对其进行掩模操作测试。

在这里插入图片描述

此图片长1080,高810,途中正在饭桌上思考的男人,名叫莱纳。
我们的目的是尽可能地覆盖莱纳上半身之外的大多部分,下边界以右边瓶子瓶口为界限。
在莱纳所坐位置用一个矩形将其框出,该矩形四个点的坐标大致为
A.(568, 28)   B.(1044, 28)
C.(568, 430)   D.(1044, 430)

(坐标可以通过画图工具估计。)
在这里插入图片描述

掩码代码如下:

import cv2
import numpy as npmask = np.zeros((810, 1080, 1), np.uint8)
mask[28:430, 568:1044, :] = 255
cv2.imshow("mas", mask)
cv2.waitKey()
cv2.destroyAllWindows()

程序执行效果如下:

此即该图片的掩模图像
        在这里插入图片描述


2.图像的运算


2.1 图像的加法运算

两幅图像相加即相同位置的像素值之间一 一相加。图像的相加通常有两种方法,一种是使用“+”符号连接两个数组,另一种则是使用add() 方法。

2.1.1 “+”方法

使用“+”这种方法我们在做图像处理时通常不会采用,因为相加后的像素值精彩会出现大于255的情况。而大于255的像素值,则会取该值除以255后的余数,即取模。因此原图中白色的衣服,经过加法运算后反而颜色变暗了。

import cv2
img = cv2.imread("pic.jpg")
result_pic = img + img
cv2.imshow("+", result_pic)
cv2.waitKey()
cv2.destroyAllWindows()

        在这里插入图片描述


2.1.2 cv2.add()方法

cv2.add()相加得到的图像,如果存在像素值大于255,取255。 这一点相比使用加号要好得多,明显更利于我们的图像处理。

使用cv2.add()方法,该方法语法如下:

add(src1, src2, mask=None, dtype=None)

  • src1 与 src2 即需要相加的两幅图像
  • mask是可选参数,掩模对象。默认没有
  • dtype 图像深度。
import cv2
img = cv2.imread("trump.jpg")
result_pic = cv2.add(img, img)
cv2.imshow("add", result_pic)
cv2.waitKey()
cv2.destroyAllWindows()

         在这里插入图片描述

2.1.3 使用掩模遮盖相加结果

图像相加时,可以讲掩模图像也作为参数传进去,对相加结果进行掩模。

import cv2
import numpy as np
img = cv2.imread("pic.jpg")# 细节
m = np.zeros((810, 1080, 1), np.uint8)
m[28:430, 568:1044, :] = 255
image5 = cv2.add(img, img, mask=m)
cv2.imshow("use mask", image5)
cv2.waitKey()
cv2.destroyAllWindows()

图像处理结果:
在这里插入图片描述
值得注意的是,这里有一个非非非非非非非非非常重要的细节,很多人都会在这里被卡壳(很显然博主也被卡了)。就是掩模对象是灰度图像,不是说看起来是灰度图像,而是数组要是灰度图像的数组,即创建的到时候m = np.zeros((a, b, 1), np.uint8)中 (a, b, 1)最后一个数字是1,不能顺手写成3。 否者就会有下面的报错:

image5 = cv2.add(img, img, mask=m)
cv2.error: OpenCV(4.5.5) D:\a\opencv-python\opencv-python\opencv\modules\core\src\arithm.cpp:706: error: (-215:Assertion failed) (mtype == CV_8UC1 || mtype == CV_8SC1) && _mask.sameSize(*psrc1) in function ‘cv::arithm_op’

意思是mask的size有问题。


2.2 图像的位运算

位运算是二进制数字特有的运算,图像的像素数组中的十进制数字也可以转化为二进制数字,然后就可以进行位运算了。

OpenCV提供了以下位运算方法

  • cv2.bitwise_and()  按位与
  • cv2.bitwise_or()  按位或
  • cv2.bitwise_not()  按位取反
  • cv2.bitwise_xor()  按位异或

其中
cvbitwise_and() 与 bitwise_or() 方法都有三个参数,scr1,scr2,mask,即图像1,图像2与掩码

cv2.bitwise_not() 与 cv2.bitwise_xor()方法都有两个参数,scr与mask,即图像与掩码。


2.2.1 按位与 cv2.bitwise_and()

让掩模与目标图像做与运算,同样可以达到掩模遮盖图像的处理效果。
这里做一个十字掩模为例。

import cv2
import numpy as npimg1 = cv2.imread("pic.jpg")
mask = np.zeros(img1.shape, np.uint8)
# 横着的白色区域
mask[490:600, :, :] = 255
# 竖着的白色区域
mask[:, 470:545, :] = 255
img2 = cv2.bitwise_and(img1, mask)
cv2.imshow("img", img2)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述


2.2.2 按位或 cv2.bitwise_or()

使用按位或运算对图像操作可以取得与按位与相反的处理结果。

import cv2
import numpy as npimg1 = cv2.imread("pic.jpg")
mask = np.zeros(img1.shape, np.uint8)
# 横着的白色区域
mask[490:600, :, :] = 255
# 竖着的白色区域
mask[:, 470:545, :] = 255
img2 = cv2.bitwise_or(img1, mask)
cv2.imshow("img", img2)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述


2.2.3 按位取反 cv2.bitwise_not()

按位取反是仅对一个图像做的操作,根据二进制,如果某位置上数值为0,则改为1;如果为1则该为0。

import cv2img1 = cv2.imread("pic.jpg")
img2 = cv2.bitwise_not(img1)
cv2.imshow("img", img2)
cv2.waitKey()
cv2.destroyAllWindows()

处理结果如下图所示:
在这里插入图片描述


2.2.4 按位异或 cv2.bitwise_xor()

对二进制位进行判断,如果两个运算数的同一位上的数字相同,则运算结果的相同位数字取0,否则取1。
这个描述有些抽象。可以简单理解为,催掩码匹配到的区域做取反运算,掩码匹配不到的区域保持图像原状。具体见下方图像:

import cv2
import numpy as npimg1 = cv2.imread("pic.jpg")
mask = np.zeros(img1.shape, np.uint8)
# 横着的白色区域
mask[490:600, :, :] = 255
# 竖着的白色区域
mask[:, 470:545, :] = 255
img = cv2.bitwise_xor(img1, mask)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

效果呈现:
在这里插入图片描述

2.3 图像加密

通过按位异或运算,还可以实现对图像的加密。使用numpy创建随机数组的方法,创建一个随机像素值图像作为密匙,进而实现对原图像的加密和解密。结果因图片过大不再展示。

import cv2
import numpy as np# 定义加密、解密方法
def encode_img(img, img_key):result = img = cv2.bitwise_xor(img, img_key)return result# 原图
img = cv2.imread("pic.jpg")
rows, colmns, channel = img.shape
# 创建大小相等的密钥图像
img_key = np.random.randint(0, 256, (rows, colmns, 3), np.uint8)
cv2.imshow("img", img)
cv2.imshow("img_key", img_key)
Encryption_result = encode_img(img, img_key)
cv2.imshow("After Encryption", Encryption_result)
Decryption_result = encode_img(Encryption_result, img_key)
cv2.imshow("After Decryption", Decryption_result)
cv2.waitKey()
cv2.destroyAllWindows()

3.图像的合并

图像合并也是图像处理的一种常用操作,图像合并可以分为加权合并和覆盖合并。

再找一张与pic.jpg相同尺寸、名为“pic2.jpg”的图片如下图所示:

在这里插入图片描述

将该图片与pic.jpg分别按照0.2和0.8的权重进行合并,代码即执行效果如下:

3.1加权合并

import cv2
img1 = cv2.imread("pic.jpg")
img2 = cv2.imread("pic2.jpg")
rows, colmns, channel = img1.shape
img3 = cv2.resize(img2, (colmns, rows))
img = cv2.addWeighted(img1, 0.8, img3, 0.2, 0)
cv2.imshow("new_pic", img)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

3.2 覆盖合并

OpenCV没有直接提供覆盖操作的方法,因此要实现覆盖还需要自己动手。

以下边这张金底白字的标签图片为例(pic3.png),

             在这里插入图片描述
将其贴在pic.jpg上(覆盖)

import cv2
img1 = cv2.imread("pic.jpg")
img2 = cv2.resize(cv2.imread("pic3.png"), dsize=None, fx=2, fy=2)
y, x, z = img2.shape
X = 180
Y = 70
img1[Y:Y+y, X:X+x, :] = img2
cv2.imshow("new_pic", img1)
cv2.waitKey()
cv2.destroyAllWindows()

效果呈现如下
在这里插入图片描述


🌹꧔ꦿ小啾感谢您的关注与支持!🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ

          在这里插入图片描述

🌹꧔ꦿ本系列blog传送门:

✨OpenCV图像处理基本操作 【Python-Open_CV系列(一)】

✨OpenCV像素处理基本操作 【Python-Open_CV系列(二)】

✨OpenCV之 BGR、GRAY、HSV色彩空间&色彩通道专题 【Python-Open_CV系列(三)】

✨OpenCV绘制图像与文字(可作为脚手架代码)(python) 【Python-Open_CV系列(四)】

✨OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】

✨基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】

✨OpenCV基本功 之 图像的掩模、运算 & 合并专题 -小啾带学【Python-Open_CV系列(七)】

✨《三英战吕布》 - 图像模板匹配 【Python-Open_CV系列(八)】

✨OpenCV滤波器 龙门石窟篇【Python-Open_CV系列(九)】(均值滤波器、中值滤波器、高斯滤波器、双边滤波器)

✨Open_CV形态学运算专题 (腐蚀&膨胀、开&闭运算、梯度运算、顶帽运算黑帽运算 )【Python-Open_CV系列(十)】

✨霍夫变换看不懂?小啾带你串一遍:OpenCV图形检测专题 这样学最简单【Python-Open_CV系列(十一)】

✨小啾带你开天眼 之 开启py-OpenCV摄像头及视频处理【Python-Open_CV系列(十二)】

✨小啾带你开天眼 之 人脸检测与识别(以及华强、皇叔、高祖配墨镜特效)【Python-Open_CV系列(十三)】


http://chatgpt.dhexx.cn/article/iuZePxun.shtml

相关文章

空间掩模matlab,浅谈基于SLM的非相干全息系统掩模设计及成像处理

宋冲 摘要:基于空间光调制器(Spatial Light Modulator,SLM)的菲涅尔非相干相关数字全息系统,无需对物体在空间或时间上进行扫描,可以快速获取真实三维物体的全息图,在荧光生物样品显微成像、彩色全息显示、以及自适应光学等领域展示了极大应用潜力。通过本项目的研究,为S…

matlab 掩模,用于图像中的与脸部有关的选择和处理的图像掩模制造技术

【技术实现步骤摘要】 【国外来华专利技术】【专利说明】用于图像中的与脸部有关的选择和处理的图像掩模相关串请的交叉引用本申请要求对通过完全引用而结合于此、提交于2013年5月14日的第13/894,384号美国专利申请的优先权。 技术介绍 数字相机的流行和便利以及因特…

图像掩模matlab,图像掩模_matlab_图像掩模

光学图像处理中,掩模可以足胶片、滤光片等。数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。数字图像处理中,图像掩模主要用于:①提取感兴趣区,用预先制作的感兴 未来手机触摸屏要靠无掩模光刻技术_多点触摸 337x396 - 29KB - JPEG 5.4.3 选择式掩模平滑 - 51CTO.COM 53…

图像中的掩膜(Mask)是什么

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步 在图像处理中,经常会碰到掩膜(Mask)这个词。那么这个词到底是什么意思呢?下面来简单解释一下。 1.什么是掩膜 …

第三章-OpenCV基础-4-掩模

基本概念 掩模,又称为掩膜,掩码,模板。图像掩模是指,用特定的图像/图形/物体遮挡代处理的图像(全部或局部),从而控制图像处理的区域,在数字图像处理中,掩模就是一个指定的数组,毕竟,图像也是数组。 左边图为原图,中间图为掩模(白色区域为透明区域,黑色区域为黑色遮挡区域),经过…

在微信小程序中如何引入iconfont

在微信小程序如何引用iconfont? 1.首先进入iconfont 选择自己喜欢的图标 iconfont-阿里巴巴矢量图标库 2.选择自己喜欢的图标加入购物车 3.将图标添加至项目(如果没有项目就随便新建一个项目) 4.打开个人主页 找到自己的项目,点…

微信小程序引入iconfont

第一种 在tabBar中使用 只能下载到本地,放在文件夹中使用 如下图: 第二种 在页面内使用iconfont图标 1:复制代码 2:粘贴到wxss文件里 3:在app.wxss中引入该文件 4:就可以在文件里面使用iconfont图…

微信小程序中使用tabBar

文章目录 前景知识小程序项目app.jsonpages/home/home.wxmlpages/camera/camera.wxmlpages/user/user.wxml 相关链接 前景知识 前面我们学习过:在app.json里对小程序进行全局配置,app.json的文件内容是一个JSON对象,包含很多属性&#xff0c…

微信小程序|icon列表跳转不同界面

效果&#xff1a; 包含图片、文字&#xff0c;分列布局&#xff0c;点击对应图标跳转到相应界面 WXML&#xff1a; <!-- 三个主要功能:文书服务&#xff0c;在线咨询&#xff0c;律师匹配跳转到对应页面&#xff0c;可以返回注意php后台和数据库搭建--><view class&…

微信小程序引入阿里巴巴icon步骤及报错解决

首先将选择好的图标加入购物车,点击右上角购物车图标&#xff0c;将其添加进项目中。(Add To Project) 添加进入项目后&#xff0c;会自动跳转到该项目&#xff0c;选择Download Code&#xff0c; 解压缩包&#xff0c;只会用到文件夹中的4个文件&#xff0c;将解压后的下面4个…

微信小程序引入iconfont图标

一、查看iconfont项目设置 二、生成在线链接 为什么要生成在线链接&#xff0c;因为微信小程序不能用静态文件 三、根据下载的iconfont.css配置app.wxss 下载的iconfont.css配置 自定义app.wxss配置 为什么不直接用iconfont.css&#xff0c;因为微信小程序不支持css只支持wxss…

《微信小程序-进阶篇》组件封装-Icon组件的实现(一)

大家好&#xff0c;这是小程序系列的第九篇文章&#xff0c;从这篇开始我们将进入提高篇&#xff0c;在这一个阶段&#xff0c;我们的目标是可以较为深入的了解组件化开发&#xff0c;并且实践积累一些后续项目也就是原神资料站中用得着的组件&#xff1a; 1.《微信小程序-基础…

uniapp与微信小程序引入iconfont

加入购物车&#xff0c;下载解压 引入 uniapp 微信小程序 使用 icon更新后更换线上url&#xff0c;就不用每次下载解压

微信小程序引入下载至本地的iconfont图标

在写小程序项目中遇到icon图标引入不起作用&#xff0c;原因是因为小程序必须先转为base64引入&#xff01; 第一步 选好自己要用的icon图标并下载至本地 下载后得到这样目录的文件 第二步 转换成base64 网址&#xff1a;https://transfonter.org/ 选择后缀为.ttf的文件 第…

《微信小程序-进阶篇》组件封装-Icon组件的实现(二)

大家好&#xff0c;这是小程序系列的第十篇文章&#xff0c;在这一个阶段&#xff0c;我们的目标是 由简单入手&#xff0c;逐渐的可以较为深入的了解组件化开发&#xff0c;并且实践积累一些后续项目也就是原神资料站中用得着的组件&#xff1a; 1.《微信小程序-基础篇》带你了…

黑马微信小程序入门

文章目录 1.环境准备1.1. 注册账号1.2 获取APPID1.3 下载开发工具 2第一个微信小程序2.1. 打开微信开发者⼯具2.2. 新建⼩程序项⽬2.3 填写项目信息 3.小程序的目录结构3.1. ⼩程序⽂件结构和传统web对⽐3.2. 基本的项⽬⽬录 4.⼩程序配置⽂件4.1. 全局配置app.json4.2 tabbar4…

【微信小程序】简洁好用的icon(94/100)

布局 <!--pages/icon/icon.wxml--> <icon class"icon-box-img" type"success" size"50"></icon> <view class"icon-box-title">成功</view> <icon class"icon-box-img" type"info&q…

【微信小程序】组件使用及属性参考

文章目录 3.1 视图容器组件3.1.1 视图容器view3.1.2 滚动视图scroll-view3.1.3 可移动视图movable-view3.1.4 覆盖视图3.1.5 滑块视图swiper 3.2 内容组件3.2.1 图标icon3.2.2 进度条progress3.2.3 文本text 3.3 导航组件3.4 小程序UI框架3.4.1 WeUI3.4.2 iView3…

微信小程序icon图标引入

一、iconfont-阿里巴巴矢量图标库 下载需要的图标 1.将想要的图标添加入库并下载代码 二、下载成功后&#xff0c;将得到一个名为 "download.zip" 的文件&#xff0c;然后解压得到这么一堆文件&#xff1a; 三、转换 ttf 文件为 base64 推荐去 https://transfonter…

关于微信小程序图标icon的五种实现方案

关于图标icon 微信小程序中的 icon 组件只有 9 种类型 success、success_no_circle、info、warn、waiting、cancel、download、search、clear。 只有9个类型的图标往往是不够的&#xff0c;需要拓展更多的icon组件图标。 第一种方案 直接使用图片&#xff08;简单粗暴&#xf…