今天在学习opencv时,把OpenCV 的标志放到另一幅图像上。这时要用到cv2.bitwise_and函数,加下来从原理和效果讲一下这个函数。

目标:将下面这个logo加到蚂蚁图像的左上角并且背景无遮挡(logo图片白的部分不遮挡蚂蚁图片蓝的地方)。

效果:

下面直接上代码,根据代码讲解原理:

import cv2
img1 = cv2.imread(r'D:\Pycharm\learn_opencv\pic\ants_image\0013035.jpg')
img2 = cv2.imread('D:\Pycharm\learn_opencv\pic\logo.jfif')rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 200, 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('sasa',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, 200, 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,以及第二三个参数为200、255,表示:高于200的像素设置为255,否则像素值置零。其他模式见文章:(13条消息) 图像阈值处理cv2.threshold()函数(python)_肥宅_Sean的博客-CSDN博客_cv2threshold

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

img2gray图像:

mask掩码矩阵图像:

可以看见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_fn图像:

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

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

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

位运算bitwise_and函数相关推荐

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

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

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

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

  3. 位运算bitwise_and和bitwise_not函数

    今天在对图片进行预处理是遇到了cv2.bitwise_and函数,感觉还是挺有意思的,那就趁热记一下吧. 目标: 将下面这个柯南logo头像加到下面图像的左上角并且背景无遮挡(logo图片白的部分不遮 ...

  4. 位运算-自定义函数之通用位移

    编写一个函数,实现左右循环移位.函数名为move,调用方法为move(value, n).其中value为需要循环位移的数,n为位移的位数.n<0表示为左移:n>0表示为右移.例如,n=4 ...

  5. 学习笔记7-C语言-进制转换、原返补、位运算、函数

    进制转换 为什么要使用二.八进制.十六进制?因为现在的CPU只能识别高低两种电流,因此只能对二进制数据进行运算二进制数据虽然可以直接被cpu识别,但不方便人们书写.记录,所以把二进制数据转换成八进制是 ...

  6. java zlib 位运算_Zlib 函数 - [ php中文手册 ] - 在线原生手册 - php中文网

    用户评论: [#1] Robin Skoglund [2008-04-04 16:39:06] ini_set('zlib.output_compression', 'On') doesn't wor ...

  7. Java位运算优化:位域、位图棋盘等

    快速小测试:如何重写下面的语句?要求不使用条件判断语句交换两个常量的值. if (x == a) x= b; else x= a; 答案: x= a ^ b ^ x; //此处变量x等于a或者等于b ...

  8. excel二进制移位运算_Excel揭秘13:在Excel中实现位运算

    我们知道,计算机使用的是二进制计数法.也就是说,在计算机中的所有信息都是使用二进制来存储和处理的. 下表列出了我们熟悉的十进制数及与其相对应的二进制数: 位运算规则 在位运算中,"按位与&q ...

  9. Go语言bits包的位运算操作基础

    Go语言的bits包实现了预先声明的无符号类型整数的位计数和相关操作函数,所以这个包主要用来处理无符号类型整数相关的位运算操作,下面是常见的位运算操作函数: ① OnesCount函数,函数原型为:f ...

最新文章

  1. linux查看出口IP
  2. java中方法的重写
  3. Python PIL反色混合
  4. 不定位成一个连接者,家装公司进军智能装饰的所有姿势都是错的
  5. mysql 8.0.x版本压缩包安装方式
  6. 解决在eclipse里没有“Dynamic Web Project“这个选项的问题
  7. 基于 Electron 做视频会议的两种实现方式
  8. [Javascript]把html内容复制到剪贴板
  9. php的redis安装配置,Redis 的安装配置介绍_php
  10. 快速搭建一个前端模板
  11. 讲道理 | 三维高斯积分公式
  12. 数据结构丿丶树 哈夫曼树
  13. 线性代数笔记1.1n阶行列式
  14. Report ZD600PSR028_1
  15. 联想计算机机房怎么同传,电脑开机自动进入网络同传
  16. 数据结构——循环链表之约翰夫生死游戏
  17. 计算机老师工作年度总结,计算机老师年终工作总结3篇
  18. 跳过校园网开机直连宽带
  19. 刷个openwrt,并加入改写的802.1X认证客户端(iNode认证)
  20. 亚马逊运营必备实用工具

热门文章

  1. 计算机电源电压的调整,电压调整电路、电压调整方法及其计算机系统
  2. 弦理论是如何解决量子力学和相对论间的矛盾
  3. python求组合数c(m、n)编程题_c语言编程问题,计算出从n 个不同元素中取出m 个元素(m≤n)的组合数。编写程序...
  4. arcgis for android(二)显示二维地图
  5. 微信小程序上传Excel文本文件功能
  6. javascript网页设计期末作业 购物网站
  7. 证券运维外包第3个月工作总结
  8. 点击轮播图片,链接跳转错误
  9. [POI2008]MAF-Mafia
  10. 视频制作和php,【艾奇电子相册视频制作软件和PHP学校网站系统哪个好用】艾奇电子相册视频制作软件和PHP学校网站系统对比-ZOL下载...