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

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

文章目录

1.图像的掩模

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


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


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

1.png

此图片长1080,高810,途中正在饭桌上思考的男人,名叫莱纳。

我们的目的是尽可能地覆盖莱纳上半身之外的大多部分,下边界以右边瓶子瓶口为界限。

在莱纳所坐位置用一个矩形将其框出,该矩形四个点的坐标大致为

A.(568, 28)   B.(1044, 28)

C.(568, 430)   D.(1044, 430)


(坐标可以通过画图工具估计。)

1.png

掩码代码如下:

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()

程序执行效果如下:

此即该图片的掩模图像

1.png

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()

image.png

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()

1.png

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()

图像处理结果:

1.png

值得注意的是,这里有一个非非非非非非非非非常重要的细节,很多人都会在这里被卡壳(很显然博主也被卡了)。就是掩模对象是灰度图像,不是说看起来是灰度图像,而是数组要是灰度图像的数组,即创建的到时候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 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()

1.png

目录
相关文章
|
2月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
499 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
11天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
77 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
56 3
|
2月前
|
存储 JSON API
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
64 7
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
|
3月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
2月前
|
计算机视觉 Python
python利用pyqt5和opencv打开电脑摄像头并进行拍照
本项目使用Python的PyQt5和OpenCV库实现了一个简单的摄像头应用。用户可以通过界面按钮打开或关闭摄像头,并实时预览视频流。点击“拍照”按钮可以捕捉当前画面并保存为图片文件。该应用适用于简单的图像采集和处理任务。
142 0
python利用pyqt5和opencv打开电脑摄像头并进行拍照
|
2月前
|
JSON API 数据格式
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
57 0
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
|
2月前
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
86 2
|
6月前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
201 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
6月前
|
机器学习/深度学习 人工智能 算法
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
乐器识别系统。使用Python为主要编程语言,基于人工智能框架库TensorFlow搭建ResNet50卷积神经网络算法,通过对30种乐器('迪吉里杜管', '铃鼓', '木琴', '手风琴', '阿尔卑斯号角', '风笛', '班卓琴', '邦戈鼓', '卡萨巴', '响板', '单簧管', '古钢琴', '手风琴(六角形)', '鼓', '扬琴', '长笛', '刮瓜', '吉他', '口琴', '竖琴', '沙槌', '陶笛', '钢琴', '萨克斯管', '锡塔尔琴', '钢鼓', '长号', '小号', '大号', '小提琴')的图像数据集进行训练,得到一个训练精度较高的模型,并将其
85 0
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练