今天在对图片进行预处理是遇到了cv2.bitwise_and函数,感觉还是挺有意思的,那就趁热记一下吧。

目标:

将下面这个柯南logo头像加到下面图像的左上角并且背景无遮挡(logo图片白的部分不遮挡星空图片的背景)。

最终效果:

代码:

import cv2
img1 = cv2.imread(r'D:\Python\pytorchLearn\ImagePreprocess\test.jpg')
img2 = cv2.imread(r'D:\Python\pytorchLearn\ImagePreprocess\kelan.jpg')rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 245, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)img1_bg = cv2.bitwise_and(roi, roi, mask=mask)
img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv)
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv2.imshow('test', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

分块解读

首先下面这两行的代码作用是将我们的星空图像中的对应logo图像的区域找出来记为roi

rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]

我们将这个roi图像显示出来,与我们预想的一致,正是星空图像的左上角对应logo图像的区域:

下面三行代码是生成一个mask掩码矩阵和mask_inv逆掩码矩阵方便我们后面cv2.bitwise_and函数的使用,我们稍微讲一下参数和原理,后面再看效果。
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 245, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)

第一行是将我们的logo图像变成灰度图像,第二行cv2.threshold函数的参数:第一个参数为原图像,第二个参数为进行分类的阈值,第三个参数为高于(低于)阈值时赋予的新值,第四个方法选择参数,常用的有:
• cv2.THRESH_BINARY(黑白二值)
• cv2.THRESH_BINARY_INV(黑白二值反转)
• cv2.THRESH_TRUNC (得到的图像为多像素值)
• cv2.THRESH_TOZERO
• cv2.THRESH_TOZERO_INV

返回值为:第一个retVal(得到的阈值值),第二个就是阈值化后的掩码图像

根据我们选择的模式为cv2.THRESH_BINARY,以及第二三个参数为245、255,表示:高于245的像素设置为255,否则像素值置零。其他模式见文章:(13条消息) 图像阈值处理cv2.threshold()函数(python)_肥宅_Sean的博客-CSDN博客_cv2threshold

于是我们的mask图像便是对于img2gray图像的高于200的像素值置255(白),否则置0(黑),我们来验证一下:

img2gray图像:

mask掩码矩阵图像:

mask_inv矩阵图像:

可以看见img2gray中黑的和灰的像素值较低被置为黑色,背景白色仍置为白色。

得到mask掩码矩阵图像后我们接着往下看:

img1_bg = cv2.bitwise_and(roi,roi,mask = mask)
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)

cv2.bitwise_and函数的作用取与运算,第一个参数为输入图像,第二个参数为输出图像,第三个参数mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置像素的所有通道分量都设置为0。
roi图像和mask图像上面已给出,下面我们给出img1_bg的图像:

与声明的一致,同理img2_fg图像只是将参数mask换成了其反矩阵,并且作用对象变成了我们的logo图像。我们看看效果:
img2_fg图像:

也即在原来mask矩阵图像为白的时候输出原图logo图像,反之置黑。

最后,我们将上面两张图加起来就达到了我们想要的左上角部分,再把原图星空图像的左上角替换成我们加起来后的左上角部分即得到结果:

dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst

改进建议

可以看到对柯南的抠图还是存在一点瑕疵,出现了一些黑点,这里可以使用另一篇博客里面提到的开闭运算来解决:
数据预处理的一些常见方法
加入以下代码:

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
mask_inv = cv2.morphologyEx(mask_inv,cv2.MORPH_CLOSE,kernel) # 闭运算

修改之后的结果:

位运算bitwise_and和bitwise_not函数相关推荐

  1. 位运算bitwise_and函数

    今天在学习opencv时,把OpenCV 的标志放到另一幅图像上.这时要用到cv2.bitwise_and函数,加下来从原理和效果讲一下这个函数. 目标:将下面这个logo加到蚂蚁图像的左上角并且背景 ...

  2. 一个关于文件中位运算的的处理函数。

    函数ReadDat()的功能是实现从文件IN88.DAT中读取一篇英文文章存入到字符串数组xx中.请编制函数CharConvA(),其功能是:以行为单位把字符串的最后一个字符的ASCii值右移4位后加 ...

  3. 【CV 向】了解 OpenCV 中的算术与位运算

    文章目录 引言 1. 利用 NumPy 创建图像 2. 算术运算 2.1 加法与减法 2.2 乘法与除法 3. 位运算 3.1 与运算 3.2 或运算 3.3 异或运算 3.4 非运算 结论 引言 P ...

  4. 0x01.基本算法 — 位运算

    目录 一.位运算 二.memset函数 三.移位运算 四.二进制状态压缩 五.成对变换 六.lowbit 七.相关习题 0.AcWing 26. 二进制中1的个数 1.Acwing 89. a^b(快 ...

  5. 2016BIT小学期——电话号码问题(哈希+位运算)

    1.题目描述: 商业单位需要容易记忆的电话号码,有一些方法可以让电话号码变得更容易记忆.譬如,可以把电话号码写成单词或短语,如 MON-GLOP 可以代表滑铁卢大学的电话.有时仅仅是把号码的一部分写成 ...

  6. opencv位运算,cv2.bitwise_and,cv2.bitwise_or,cv2.bitwise_not,cv2.bitwise_xor

    目录 与运算 或运算 非运算 异或运算 位运算完整代码 与运算 在opencv进行与运算使用cv2.bitwise_and方法 def bitwise_and(src1, src2, dst=None ...

  7. Numpy数组常用函数汇总(数学运算、三角函数、位运算、比较运算及其它)

    一.数学运算 函数名 description 说明 add(x1, x2, [, out, where, casting, order, -]) Add arguments element-wise. ...

  8. [转载] OpenCV-Python图像位与运算bitwise_and函数详解

    参考链接: Python中的numpy.bitwise_and ☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一.概述 图像的与运算主要 ...

  9. OpenCV-Python图像位与运算bitwise_and函数详解

    ☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一.概述 图像的与运算主要用于获取某个图像中感兴趣的部分,是针对两个图像矩阵数组或一个数组 ...

最新文章

  1. 人脸识别是大势所趋 加速落地“普惠AI”
  2. UF_DRAW_set_view_display 使用问题
  3. 世界在音乐中得到了完整的再现和表达。
  4. python操作文件夹-Python文件操作大全,随机删除文件夹内的任意文件
  5. Android中的windowSoftInputMode属性详解
  6. 服务器找不到硬盘如何解决方案,Linux云服务器磁盘不见了?解决方案在这里
  7. python闹钟_用python做了个高级闹钟 欢迎借鉴
  8. 手机不小心把计算机隐藏了怎么恢复,任务栏被隐藏如何恢复?
  9. [Android] Android 锁屏实现与总结 (一)
  10. 2017 Google 开发者大会终于来了!
  11. matpower常用标准算例
  12. IT行业都能干什么事?为什么要学习IT技能呢?
  13. confluence挖矿病毒(kdevtmpfsi 、solrd)解决
  14. 使用elasticsearch建立搜索引擎
  15. 谷歌浏览器常用的搜索语法
  16. 二十一世纪大学英语读写教程(第二册)学习笔记(原文)——5 - Holding Onto a Dream(坚持梦想)
  17. python数字转换为大写中文_阿拉伯数字金额转中文大写 (python实现)
  18. 黑色沙漠(黑沙)单机版局域网联机外网公网教程
  19. 高并发访问数据库问题
  20. Jetson部署实践

热门文章

  1. React Native + react-native-camera 实现扫描二维码「安卓」
  2. LightDM配置说明
  3. 从k8s.gcr.io拉取镜像
  4. 三行代码可视化神经网络特征图
  5. 钉钉后台配置微应用_将配置文件链接应用于微格式
  6. 高并发 高负载 网站系统架构
  7. Ubuntu14.04搭建LXR本地服务器阅读Linux内核代码
  8. 微信小程序Excel生成下载浏览分享
  9. ubuntu Aria2 AriaNg安装
  10. 曾经大肆其道的电商返利APP,其运营策略你真的清楚吗,一文带你读懂返利APP的竞品分析