[Python从零到壹] 三十六.图像处理基础篇之图像算术与逻辑运算详解

Posted Eastmount

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python从零到壹] 三十六.图像处理基础篇之图像算术与逻辑运算详解相关的知识,希望对你有一定的参考价值。

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。

该系列文章主要讲解Python OpenCV图像处理和图像识别知识,前期主要讲解图像处理基础知识、OpenCV基础用法、常用图像绘制方法、图像几何变换等,中期讲解图像处理的各种运算,包括图像点运算、形态学处理、图像锐化、图像增强、图像平滑等,后期研究图像识别、图像分割、图像分类、图像特效处理以及图像处理相关应用。

上一篇文章介绍了如何使用OpenCV绘制各类几何图形,包括cv2.line()、v2.circle()、cv2.rectangle()、cv2.ellipse()、cv2.polylines()、cv2.putText()函数。这篇文章将详细讲解图像算法运算与逻辑运算,包括图像加法、图像减法、图像与运算、图像或运算、图像非运算与图像异或运算。让我们来对比下这些运算在图像中能实现什么样的效果。希望文章对您有所帮助,如果有不足之处,还请海涵。

文章目录

下载地址:

前文赏析:

第一部分 基础语法

第二部分 网络爬虫

第三部分 数据分析和机器学习

第四部分 Python图像处理基础

第五部分 Python图像运算和图像增强

第六部分 Python图像识别和图像处理经典案例

第七部分 NLP与文本挖掘

第八部分 人工智能入门知识

第九部分 网络攻防与AI安全

第十部分 知识图谱构建实战

扩展部分 人工智能高级案例

作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。


一.图像加法运算

图像加法运算主要有两种方法。第一种是调用Numpy库实现,目标图像像素为两张图像的像素之和;第二种是通过OpenCV调用add()函数实现。第二种方法的函数原型如下:

  • dst = add(src1, src2[, dst[, mask[, dtype]]])
    – src1表示第一张图像的像素矩阵
    – src2表示第二张图像的像素矩阵
    – dst表示输出的图像,必须和输入图像具有相同的大小和通道数
    – mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。
    – dtype表示输出数组的可选深度

注意,当两幅图像的像素值相加结果小于等于255时,则输出图像直接赋值该结果,如120+48赋值为168;如果相加值大于255,则输出图像的像素结果设置为255,如(255+64) 赋值为255。下面的代码实现了图像加法运算。

#coding:utf-8
# By:Eastmount
import cv2  
import numpy as np  
 
#读取图片
img = cv2.imread("luo.png")

#图像各像素加100
m = np.ones(img.shape, dtype="uint8")*100

#OpenCV加法运算
result = cv2.add(img, m)

#显示图像
cv2.imshow("original", img)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出如图4-1所示,左边为“小珞珞”的原始图像,右边为像素值增加100像素后的图像,输出图像显示更偏白。


二.图像减法运算

图像减法运算主要调用subtract()函数实现,其原型如下所示:

  • dst = subtract(src1, src2[, dst[, mask[, dtype]]])
    – src1表示第一张图像的像素矩阵
    – src2表示第二张图像的像素矩阵
    – dst表示输出的图像,必须和输入图像具有相同的大小和通道数
    – mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。
    – dtype表示输出数组的可选深度

具体实现代码如下所示:

#coding:utf-8
# By:Eastmount
import cv2  
import numpy as np  
 
#读取图片 
img = cv2.imread("luo.png")

#图像各像素减50
m = np.ones(img.shape, dtype="uint8")*50

#OpenCV减法运算
result = cv2.subtract(img, m)

#显示图像
cv2.imshow("original", img)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出如图4-2所示,左边为原始图像,右边为像素值减少50像素后的图像,输出图像显示更偏暗。


三.图像与运算

与运算是计算机中一种基本的逻辑运算方式,符号表示为“&”,其运算规则为:

  • 0&0=0
  • 0&1=0
  • 1&0=0
  • 1&1=1

图像的与运算是指两张图像(灰度图像或彩色图像均可)的每个像素值进行二进制“与”操作,实现图像裁剪。

  • dst = bitwise_and(src1, src2[, dst[, mask]])
    – src1表示第一张图像的像素矩阵
    – src2表示第二张图像的像素矩阵
    – dst表示输出的图像,必须和输入图像具有相同的大小和通道数
    – mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。

下面代码是通过图像与运算实现图像剪裁的功能。

#coding:utf-8
# By:Eastmount
import cv2  
import numpy as np  
 
#读取图片 
img = cv2.imread("luo.png", cv2.IMREAD_GRAYSCALE)

#获取图像宽和高
rows, cols = img.shape[:2]
print(rows, cols)

#画圆形
circle = np.zeros((rows, cols), dtype="uint8")
cv2.circle(circle, (int(rows/2),int(cols/2)), 100, 255, -1)
print(circle.shape)
print(img.size, circle.size)

#OpenCV图像与运算
result = cv2.bitwise_and(img, circle)

#显示图像
cv2.imshow("original", img)
cv2.imshow("circle", circle)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出如图4-3所示,原始图像与圆形进行与运算之后,提取了其中心轮廓。同时输出图像的形状为377×326。注意,两张图像的大小和类型必须一致。


四.图像或运算

逻辑或运算是指如果一个操作数或多个操作数为 true,则逻辑或运算符返回布尔值 true;只有全部操作数为false,结果才是 false。图像的或运算是指两张图像(灰度图像或彩色图像均可)的每个像素值进行二进制“或”操作,实现图像裁剪。其函数原型如下所示:

  • dst = bitwise_or(src1, src2[, dst[, mask]])
    – src1表示第一张图像的像素矩阵
    – src2表示第二张图像的像素矩阵
    – dst表示输出的图像,必须和输入图像具有相同的大小和通道数
    – mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。

下面代码是通过图像或运算实现图像剪裁的功能。

#coding:utf-8
# By:Eastmount
import cv2  
import numpy as np  
 
#读取图片 
img = cv2.imread("luo.png", cv2.IMREAD_GRAYSCALE)

#获取图像宽和高
rows, cols = img.shape[:2]

#画圆形
circle = np.zeros((rows, cols), dtype="uint8")
cv2.circle(circle, (int(rows/2),int(cols/2)), 100, 255, -1)

#OpenCV图像或运算
result = cv2.bitwise_or(img, circle)

#显示图像
cv2.imshow("original", img)
cv2.imshow("circle", circle)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出如图4-4所示,原始图像与圆形进行或运算之后,提取了图像除中心原形之外的像素值。


五.图像非运算

图像非运算就是图像的像素反色处理,它将原始图像的黑色像素点转换为白色像素点,白色像素点则转换为黑色像素点,其函数原型如下:

  • dst = bitwise_not(src1, src2[, dst[, mask]])
    – src1表示第一张图像的像素矩阵
    – src2表示第二张图像的像素矩阵
    – dst表示输出的图像,必须和输入图像具有相同的大小和通道数
    – mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。

图像非运算的实现代码如下所示。

#coding:utf-8
import cv2  
import numpy as np  
 
#读取图片 
img = cv2.imread("Lena.png", cv2.IMREAD_GRAYSCALE)

#OpenCV图像非运算
result = cv2.bitwise_not(img)

#显示图像
cv2.imshow("original", img)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

原始图像非运算之后输出如图4-5所示。


六.图像异或运算

逻辑异或运算(xor)是一个数学运算符,数学符号为“⊕”,计算机符号为“xor”,其运算法则为:如果a、b两个值不相同,则异或结果为1;如果a、b两个值相同,异或结果为0。

图像的异或运算是指两张图像(灰度图像或彩色图像均可)的每个像素值进行二进制“异或”操作,实现图像裁剪。其函数原型如下所示:

  • dst = bitwise_xor(src1, src2[, dst[, mask]])
    – src1表示第一张图像的像素矩阵
    – src2表示第二张图像的像素矩阵
    – dst表示输出的图像,必须和输入图像具有相同的大小和通道数
    – mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。

图像异或运算的实现代码如下所示。

#coding:utf-8
# By:Eastmount
import cv2  
import numpy as np  
 
#读取图片 
img = cv2.imread("luo.png", cv2.IMREAD_GRAYSCALE)

#获取图像宽和高
rows, cols = img.shape[:2]

#画圆形
circle = np.zeros((rows, cols), dtype="uint8")
cv2.circle(circle, (int(rows/2),int(cols/2)), 100, 255, -1)

#OpenCV图像异或运算
result = cv2.bitwise_xor(img, circle)

#显示图像
cv2.imshow("original", img)
cv2.imshow("circle", circle)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

原始图像与圆形进行异或运算之后输出如图4-6所示。


七.总结

本文详细介绍了图像处理的算术运算与逻辑运算,包括图像加法、图像减法、图像与运算、图像或运算、图像非运算与图像异或运算,并以“小珞珞”图像为案例进行讲解,希望对您有所帮助。

感谢在求学路上的同行者,不负遇见,勿忘初心。图像处理系列主要包括三部分,分别是:

这周的留言感慨~

十二年CSDN的博客分享,如果要说分享最让我开心的是什么?不是传道,不是授业,也不是解惑,而是接下来这类事。这些年已经陆续鼓励了一些朋友当老师,而昨天得知这一位博友真的去到新疆南疆成为了一名小学老师,我很是感动,是真的感动,六年前我曾鼓励他如果想,就放弃高额工资的互联网大厂,去做自己想做的,没想到已经当了四年老师。又当爹又当妈,国语普及,文化教育,这里面的艰辛不是一两句道得清,除了佩服就是鼓励。
正如你说的一样,“一辈子总得做点有意义的事情,生命实在太短暂,一定要活得积极、正面”。或许,这也是我在CSDN分享博客的最大意义,再比如云南那位老友的留言,“农村的孩子下雨没有伞,只能拼命奔跑”,希望你以后也能成为一名教师,感恩有你们,感谢有你们。我也希望自己早日毕业回到家乡,花上三四十年做好两件事,一是认真教书,二是将少数民族文物抢救和文字语音保护做好,也鼓励更多人一起加入进来。自己虽然很菜吧,但还是有一些喜欢的事,尤其陪伴爱的人,挺好,爱你们喔。2022年继续加油,在CSDN分享更高质量的博客和专栏。

(By:娜璋之家 Eastmount 2022-01-25 夜于贵阳 https://blog.csdn.net/Eastmount )


以上是关于[Python从零到壹] 三十六.图像处理基础篇之图像算术与逻辑运算详解的主要内容,如果未能解决你的问题,请参考以下文章

[Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)

[Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形

[Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制

[Python从零到壹] 四十六.图像增强及运算篇之图像阈值化处理

[Python从零到壹] 五十六.图像增强及运算篇之图像平滑(中值滤波双边滤波)

[Python从零到壹] 四十.图像处理基础篇之图像量化处理