百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

「python opencv视觉零基础实战」 七逻辑运算应用

toyiye 2024-07-06 00:35 19 浏览 0 评论

一、学习目标

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

如有错误欢迎指出~

目录

「python opencv 计算机视觉零基础实战」 第一节

「python opencv视觉入门到实战」二、格式与摄像头

「python opencv 视觉入门到实战」 三、图像编辑

「python opencv视觉入门到实战」 第四节色彩空间

「python opencv视觉入门到实战」 五、对象追踪

「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 cv2

img1 = 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 cv2

img1 = 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 cv2

img1 = 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 cv2

img1 = 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 np

capture=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:
       break
   hsv_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 np

capture=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:
        break
    hsv_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遮罩剔除不需要的内容

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码