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

OpenCV基本功 之 图像的掩模、运算 & 合并专题 -小啾带学【Python-Open_CV系列(七)】OpenCV 图像的掩模 运算与合并 以 Python 为工具 Open CV 系列 七 1 图像的掩模 2 图像的运算 2 1 图像的加法运算 2 1 1 方法 2 1 2cv2 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 图像加密 3 图像的合并加权合并覆盖

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 np mask = 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() 

意思是mask的size有问题。


2.2 图像的位运算

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

OpenCV提供了以下位运算方法

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

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


2.2.1 按位与 cv2.bitwise_and()

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

import cv2 import numpy as np img1 = 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 np img1 = 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 cv2 img1 = 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 np img1 = 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系列(十三)】




















































版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203132.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午10:30
下一篇 2026年3月19日 下午10:31


相关推荐

  • 大语言模型解析[项目源码]

    大语言模型解析[项目源码]

    2026年3月14日
    2
  • Django使用pymysql连接MySQL数据库

    Django使用pymysql连接MySQL数据库按照以下两步解决即可 1 安装 pymysqlpipin 增加设置在 settings py 同目录下的 init py 中增加代码 importpymysq install as MySQLdb

    2026年3月18日
    2
  • C# 特性(Attribute)之Flag特性

    C# 特性(Attribute)之Flag特性

    2022年3月2日
    43
  • C#异步调用的方法

    最经公司工作需要调用一个外部的webservice,同时要将传出的数据进行保存,以自己以前的习惯,就打算逐步操作,失败啊,完全没考虑过用户体验效果,在同事指点下,意识到使用异步调用的好处,随便将自己找

    2021年12月24日
    41
  • modbus协议讲解及实现_通俗易懂近义词

    modbus协议讲解及实现_通俗易懂近义词什么是协议在了解什么是Modbus之前,我们先来看下什么是协议协议是一个汉语词汇,读音为xiéyì,意思是共同计议,协商;经过谈判、协商而制定的共同承认、共同遵守的文件。简单地说,在我们的单片机之间互相通信,以及单片机和上位机通信中,规定了不同的内容规范,这个规范是通信的双方都需要遵守的,这样就可以实现两者的通信。而这个协议规范可以有很多种,来适应不同的设备以及通信要求等,我们常见的就有IICSPIUART串口通信协议等等。而Modbus也是一个串行通信协议。什么是RS-485RS-2

    2022年10月9日
    5
  • idea2021.11.1激活码_最新在线免费激活

    (idea2021.11.1激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月28日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号