一、学习目标

  1. 了解opencv中图像的逻辑运算
  2. 了解opencv中逻辑运算的应用

目录

[python opencv 计算机视觉零基础到实战] 一、opencv的helloworld

[【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的helloworld

[[python opencv 计算机视觉零基础到实战] 三、numpy与图像编辑] 一、opencv的helloworld

[[python opencv 计算机视觉零基础到实战] 四、了解色彩空间及其详解] 一、opencv的helloworld

[[python opencv 计算机视觉零基础到实战] 五、对象追踪] 一、opencv的helloworld
[python opencv 计算机视觉零基础到实战] 六、图像运算

如有错误欢迎指出~

二、了解OpenCV中图像运算的运用

2.1 了解and逻辑运算

在上一节中,我们了解了基本的图像运算,这一节将了解在opencv将两张图片进行逻辑运算。逻辑运算在编程中较为常见的一种基本运算,在此不在进行赘述。我们首先了解一下opencv中的逻辑与运算,opencv中逻辑与运算与我们基本的逻辑与运算一致,也就是1 and 1为1,1 and 0 为0。我们可以通过一个小示例来直观的感受opencv的and运算方式。

在opencv中,对两个图片进行逻辑与运算需要使用bitwise_and方法。bitwise_and方法接收2个图片数组为参数。首先我们读取2个图片1bit与1bit3。

import cv2img1 = cv2.imread(r'C:\Users\mx\Desktop\1bit.jpg')
img3 = cv2.imread(r'C:\Users\mx\Desktop\1bit3.jpg')cv2.imshow("img1", img1)
cv2.imshow("img3", img3)cv2.waitKey (0)
cv2.destroyAllWindows()

得到两张图片如下:

随后使用bitwise_and方法对两张图片进行运算:

import cv2img1 = cv2.imread(r'C:\Users\mx\Desktop\1bit.jpg')
img3 = cv2.imread(r'C:\Users\mx\Desktop\1bit3.jpg')
and_img=cv2.bitwise_and(img3,img1)
cv2.namedWindow("and_img",cv2.WINDOW_NORMAL)cv2.imshow("img1", img1)
cv2.imshow("img3", img3)
cv2.imshow("and_img", and_img)cv2.waitKey (0)
cv2.destroyAllWindows()

以上代码中关键代码为and_img=cv2.bitwise_and(img3,img1),在这一串代码中对img3与img1进行了逻辑与运算。由于img1图片只有“我是1_bit”文字为白色,其他区域为黑色,我们可以当成“我偶是1_bit”这个内容区域的值为1,然后黑色区域位置为0。这时黑色区域与img3图片的通道区域值进行计算,那就是0与一个内容值进行逻辑与计算,那么结果为0,img1的文字部分值为1,与img3图片相同的位置进行逻辑与计算,那么保留结果。这时,运算后的图片则应该是生成一张带有“我是1_bit”字样的图片,并且在字样区域内带有img3图片内容。结果如下:

那将图片img1改成如下情况呢:

这时“我是1_bit”’字样区域的内容将会与另一张图片计算后排出,这时结果将会产生一个0值的空缺部分,由于空白部分的值为1,逻辑运算后将会保留白色区域的另外一张图片内容。

结果如下:

2.2 了解or逻辑运算

在opencv中既然存在and逻辑与,那么逻辑或大几率存在是可能的。在opencv中,逻辑或运算与逻辑与运算相反,使用bitwise_or方法,传入参数也是两张用于逻辑计算的图片。使用示例如下:

import cv2img1 = cv2.imread(r'C:\Users\mx\Desktop\1bit.jpg')
img3 = cv2.imread(r'C:\Users\mx\Desktop\1bit3.jpg')
and_img=cv2.bitwise_or(img3,img1)
cv2.namedWindow("and_img",cv2.WINDOW_NORMAL)cv2.imshow("img1", img1)
cv2.imshow("img3", img3)
cv2.imshow("and_img", and_img)cv2.waitKey (0)
cv2.destroyAllWindows()

结果如下:

以上使用的图片与2.1示例中图片一致。逻辑或运算,只要不都为0则是1。图片img1中,字体为白,其它部分为0,但由于进行逻辑运算时,黑色部分进行计算的区域对应img3是有内容的,也就是说img3中该部分的内容非0。那么,结果就是img3中的图片内容,最终将会得到如上结果。

2.3 了解取反运算

取反运算非常简单,就是黑的边白,白的变黑;当然这样说不严谨,但是却很好反应了取反这个操作的结果;例如0取反则是1,1取反则是0。取反使用bitwise_not方法,bitwise_not方法接收一个图片参数。以下方法依旧使用名为1bit的图片。图片为了方便查看在代码中显示了原图内容。

import cv2img1 = cv2.imread(r'C:\Users\mx\Desktop\1bit.jpg')
not_img=cv2.bitwise_not(img1)
cv2.imshow("img1 ", img1 )
cv2.imshow("not_img", not_img)
cv2.waitKey (0)
cv2.destroyAllWindows()

结果如下:

2.4 逻辑运算有什么用呢?

我们在前两节中的值,可以通过inRange方法提取图片中的指定颜色内容,但是提取出来后将会得到一个黑白图片,那么如何对改图片进行颜色的还原呢?想必有些同学学完逻辑运算后觉得应该是找到了方法。是的,我们可以通过逻辑运算对图片进行颜色上的还原。因为我们提取出来的图片是黑白图片,提取出来指定颜色内容的区域为白色,那么只需要将图片与原图进行and运算,那么重合的部分就会显示出来,这个时候就可以还原提取后图片的颜色。但是,我们是哪个颜色提取出来的图片是单通道的灰度图片,怎么办呢?不急,首先我们把之前的代码贴上,方便查看:

import cv2
import numpy as npcapture=cv2.VideoCapture(r'C:\Users\mx\Desktop\hmbb.mp4')
min=np.array([26,43,46])
max=np.array([34,255,255])
while True:r,img=capture.read()if r==False:breakhsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)flag=cv2.inRange(hsv_img,lowerb=min,upperb=max)cv2.imshow("flag", flag)cv2.imshow("hmbb", img)k=cv2.waitKey (40)if k==27:break
cv2.destroyAllWindows()

以上代码已经在前两节“对象跟踪”小节讲解,那么现在只需要对提取到的图片与原图进行一个and逻辑运算即可,添加以下代码:

cflag=cv2.bitwise_and(img,img,mask=flag)

以上代码bitwise_and添加了两个相同的img参数,为什么添加呢?不急,下一节将会告诉大家。我们现在着重查看mask参数,mask参数赋值为提取到的flag目标区域的图片,表示遮罩。将会在之前传入的img中剔除不要的区域,只保留白色的区域,传入的类型是8位单通道的灰度图像。这时我们就可以将flag值赋值给mask,bitwise_and将会从img图片中做逻辑运算去除我们不需要的黑色区域的图片内容,这时将会得到一个颜色比较正常的海绵宝宝。完整代码如下:

import cv2
import numpy as npcapture=cv2.VideoCapture(r'C:\Users\mx\Desktop\hmbb.mp4')
img1 = cv2.imread(r'C:\Users\mx\Desktop\1bit.jpg')
min=np.array([26,43,46])
max=np.array([34,255,255])
while True:r,img=capture.read()if r==False:breakhsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)flag=cv2.inRange(hsv_img,lowerb=min,upperb=max)cflag=cv2.bitwise_and(img,img,mask=flag)cv2.imshow("flag", flag)cv2.imshow("hmbb", img)cv2.imshow("cflag", cflag)k=cv2.waitKey (40)if k==27:break
cv2.destroyAllWindows()

结果如下:

逻辑运算的更多内容下一节将会讲解。
该系列文章首发于ebaina

三、总结

  1. 了解了opencv中对图像进行逻辑与运算使用bitwise_and方法
  2. 了解了opencv中对图像进行逻辑或运算使用bitwise_or方法
  3. 了解了opencv中对图像进行取反运算使用bitwise_not方法
  4. 了解了and方法的其他用途,用于mask遮罩剔除不需要的内容

[python opencv 计算机视觉零基础到实战] 七、逻辑运算与应用相关推荐

  1. [python opencv 计算机视觉零基础到实战] 八、ROI泛洪填充

    一.学习目标 了解什么是ROI 了解floodFill的使用方法 如有错误欢迎指出~ 目录 [python opencv 计算机视觉零基础到实战] 一.opencv的helloworld [[pyth ...

  2. [python opencv 计算机视觉零基础到实战] 十一找到图片中指定内容

    一.学习目标 了解图片内容定位方法matchTemplate使用 了解minMaxLoc方法使用 上一篇<[python opencv 计算机视觉零基础到实战] 十.图片效果毛玻璃> 如有 ...

  3. [python opencv 计算机视觉零基础到实战] 十、图片效果毛玻璃

    一.学习目标 了解高斯模糊的使用方法 了解毛玻璃的图片效果添加 了解如何自己做一个噪声图片 上一篇:[python opencv 计算机视觉零基础到实战] 九.模糊 如有错误欢迎指出~ 二.了解模糊与 ...

  4. [python opencv 计算机视觉零基础到实战] 六、图像运算

    一.学习目标 了解opencv中图像运算的方法 了解opencv中图像运算的运用 如有错误欢迎指出~ 二.了解OpenCV中图像运算的运用 目录 [python opencv 计算机视觉零基础到实战] ...

  5. [python opencv 计算机视觉零基础到实战] 四、了解色彩空间及其详解

    一.学习目标 了解什么是色彩空间 了解opencv中色彩空间的转换 目录 [python opencv 计算机视觉零基础到实战] 一.opencv的helloworld [[python opencv ...

  6. [python opencv 计算机视觉零基础到实战] 三、numpy与图像编辑

    一.学习目标 了解图片的通道与数组结构 了解使用numpy创建一个图片 了解使用numpy对图片的一般操作方法 目录 [python opencv 计算机视觉零基础到实战] 一.opencv的hell ...

  7. 【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取

    一.学习目标 了解图片的结构属性 了解如何捕获视频 了解waitkey的使用方法 目录 [python opencv 计算机视觉零基础到实战] 一.opencv的helloworld [[python ...

  8. [python opencv 计算机视觉零基础到实战] 一 opencv的helloworld

    前置条件 说明:本系列opencv实战教程将从基础到实战,若只是简单学习完python也可以通过该教程完成一般的机器学习编程:文中将会对很多python的基础内容进行讲解,但由于文章定位的原因将不会赘 ...

  9. [python opencv 计算机视觉零基础到实战] 十六、用opencv画画

    一.学习目标 了解如何使用line方法 了解如何使用rectangle方法 了解如何使用ellipse方法 如有错误欢迎指出~ 二.了解OpenCV的绘图方法 2.1 了解直线绘图方法 我们在前两节中 ...

最新文章

  1. iOS已发布应用中对异常信息捕获和处理
  2. Resource通配符路径 ——跟我学spring3
  3. json模块及其API
  4. python3入门到精通pdf-Python3入门到精通实战特训
  5. 如何对自己做好正确的人生规划
  6. js定时器、高亮修改单元格背景色
  7. IBM推出可加快响应跨云网络威胁的开放技术 业界首次实现跨安全工具和跨云的搜索威胁功能,无需移动数据
  8. java操作阿里云的对象存储OSS
  9. 清除iphone文件app连接服务器记录,“文件”中连接外置设备或服务器 - iPhone附带的APP - iPhone使用手册...
  10. go var 一个整数_Go语言基础之基本数据类型
  11. 计算机网络第四章课后答案(第七版谢希仁著)
  12. 怎么篡改计算机硬盘大小,怎么样更改Parallels Desktop硬盘大小 Parallels Desktop虚拟机硬盘大小如何更改...
  13. 元界Metaverse清单:你需要知道的一切
  14. 微软AI 绘图工具+ChatGPT免费用,10秒轻松出图,超详细教程,纯干货分享
  15. 中国象棋游戏Chess(3) - 实现走棋规则
  16. aks Unable to connect to the server: x509
  17. 小蜜脚本显示服务器关闭了链接,小蜜脚本怎么老出现错误报告鼠标连点选中区域...
  18. 漫反射体各向同性和朗伯体遵循余弦定律之间矛盾吗?
  19. 网站统计中的数据收集原理及实现-埋点统计
  20. kubernetes kubelet挂掉问题分析

热门文章

  1. 一朝读码深似海,不读源码薪难升!读懂.NET5源码,到底多重要?
  2. .NET Core 集成JWT认证
  3. [Student.Achieve] 学生教务管理系统开源
  4. .NET与鲲鹏共展翅,昇腾九万里(二)
  5. ProjectFileManager 发布!项目文件管理效率提升10倍以上!
  6. 如何运用领域驱动设计 - 工作单元
  7. 深入理解.NET Core的基元(三) - 深入理解runtimeconfig.json
  8. 误删50节点K8s集群为何3小时才能复原?Spotify揭自家事故幕后经验
  9. 开箱即用Bumblebee独立部署搭建webapi网关详解
  10. 使用Dapper持久化IdentityServer4