WHCSRL 技术网

Python 计算机视觉(四)—— OpenCV进行图像算数与逻辑运算

目录

1. 图像加法运算

(1)随机生成灰度图像

(2)读取原始图像

(3)两图像相加

(4)图像像素点加常数

2. 图像减法运算

(1)减小亮度

(2)还原添加灰度图像的图像 

3. 图像与运算

4. 图像或运算

5. 图像异或运算

6. 图像非运算

7. 图像逻辑运算的意义

结束语


1. 图像加法运算

图像加法运算是将一幅图像加在另外一幅图像上面或者对图像的某一个像素点值进行操作,加上一个常数改变其亮度或者颜色

(1)随机生成灰度图像

参考资料:图像的像素加法、减法运算

  1. import numpy as np
  2. import cv2
  3. #np.random.randint(a, b)生成大于等于 a 小于 b 的随机整数
  4. img_gray = np.random.randint(0, 256, size=[406, 600], dtype=np.uint8)#生成一张 406*600 的随机灰度图
  5. cv2.namedWindow("gray")
  6. cv2.imshow("gray", img_gray)
  7. cv2.waitKey(delay = 0)

(2)读取原始图像

首先是从电脑获得已经下载的图像:

  1. import numpy as np
  2. import cv2
  3. img1 = cv2.imread('E:From ZhihuFor the deskde.jpg') #读取图像
  4. cv2.namedWindow("awindow") #创建窗口
  5. img1_1 = cv2.resize(img1, dsize= None, fx = 0.5, fy = 0.5)#对图像尺寸进行调整
  6. cv2.imshow("awindow", img1_1) #显示图像
  7. cv2.waitKey(delay = 0) #等待
  8. print(img1_1.shape) #读取图像信息

并得到图像的信息:

(406, 600, 3)  图像的分辨率以及通道,之前的灰度图像就是以这个图像的大小生成的 

 (3)两图像相加

 使用 cv2.addWeighted() 函数

该函数包括参数:图像1,图像1权值,图像2,图像2权值,为合成后的图像像素值所加的数

使用该函数时,两图像分辨率必须一致,图像通道数也要一致

本例中是将上面的灰度图像和读取的图像相加得到的

主要实现方法如下,我已经添加了注释

  1. """
  2. Author:Huijun
  3. date:2021/10/15
  4. """
  5. import numpy as np
  6. import cv2
  7. img1 = cv2.imread('E:From ZhihuFor the deskde.jpg') #读取图像
  8. cv2.namedWindow("awindow") #创建窗口
  9. img1_1 = cv2.resize(img1, dsize= None, fx = 0.5, fy = 0.5)#调整大小
  10. img_gray0 = cv2.cvtColor(img1_1, cv2.COLOR_BGR2GRAY) #对图像进行灰度处理
  11. cv2.imshow("awindow", img_gray0) #显示图像
  12. cv2.waitKey(delay = 0) #等待
  13. img_gray = np.random.randint(0, 256, size=[406, 600], dtype=np.uint8)#生成随机灰度图
  14. cv2.namedWindow("gray")
  15. cv2.imshow("gray", img_gray)
  16. print(img_gray.shape) #读取灰度图属性
  17. cv2.waitKey(delay = 0)
  18. final_img = cv2.addWeighted(img_gray0, 0.8, img_gray, 0.2, 8) #将两个图相加
  19. cv2.namedWindow("windowfinal")
  20. cv2.imshow("windowfinal", final_img)
  21. cv2.waitKey(delay = 0)

得到最终图像:

可以看出两种图像相加,但还是能分辨出美女,这是因为我们在相加时将美女的权值调为 0.8 ,所以整张图中主要显示的还是美女

如果将权值修改一下:

final_img = cv2.addWeighted(img_gray0, 0.5, img_gray, 0.5, 8)

让二者五五开,得到如下图像: 

(4)图像像素点加常数

在前面的文章中提到过,图像的像素点值代表其亮度

在这里我们尝试给每一个像素点加上 50 并与原图对比

首先我们得创建一个和原图同等尺寸的矩阵

  1. Mix = np.ones(img1_1.shape, dtype=np.uint8)*50 #生成一个单位矩阵并乘以50,单位矩阵维度和 img1_1 相同
  2. Addimg = cv2.add(Mix, img1_1) #给每一个像素点加50
  3. cv2.namedWindow("Addimg")
  4. cv2.imshow("Addimg", Addimg)
  5. cv2.waitKey(delay = 0)

得到的图像如下: 

2. 图像减法运算

(1)减小亮度

cv2.subtract() 函数可以实现图像之间的减法

下面我们还原上面得到的图像:

  1. img1_2 = cv2.subtract(Addimg, Mix) #在得到的图像中减去矩阵
  2. cv2.namedWindow("subimg")
  3. cv2.imshow("subimg", img1_2)
  4. cv2.waitKey(delay = 0)

 得到的效果如下:

可见最上面的图还原了中间的那一幅图像 

(2)还原添加灰度图像的图像 

在前面我们将灰度图像和原始图像相加得到一幅比较模糊的图像,这里我们尝试对它进行还原

  1. img1_3 = cv2.subtract(final_img, img_gray)
  2. cv2.namedWindow("subimg1")
  3. cv2.imshow("subimg1", img1_3)
  4. cv2.waitKey(delay = 0)

得到的最终图像如下(subimg1 窗口):

 可以看出减去灰度图像得到的图像并没有将原图复原出来,这是因为我们之前将两图像进行相加是按照权值相加的,所以直接减去灰度图像会使整个图像亮度降低

3. 图像与运算

在图像的运算中参考的资料:openCV—Python(6)—— 图像算数与逻辑运算

  1. img1_4 = cv2.bitwise_and(img_gray0, img_gray) #对两种图像进行与操作
  2. cv2.namedWindow("And")
  3. cv2.imshow("And", img1_4)
  4. cv2.waitKey(delay = 0)

得到的图像如下:

由于生成的灰度图像为单通道图像,所以需要将原图像转化为灰度图像才能相与,再读入一幅三通道的图像进行与操作:

代码大致如下:

  1. """
  2. Author:Huijun
  3. date:2021/10/15
  4. """
  5. import numpy as np
  6. import cv2
  7. img1 = cv2.imread('E:From ZhihuFor the deskde.jpg')
  8. cv2.namedWindow("beauty0")
  9. img1_1 = cv2.resize(img1, dsize= None, fx = 0.5, fy = 0.5)
  10. cv2.imshow("beauty0", img1_1)
  11. print(img1_1.shape)
  12. cv2.waitKey(delay = 0)
  13. img1_5 = cv2.imread('E:From ZhihuFor the deskde1.jpg')
  14. img1_50 = cv2.resize(img1_5, dsize= None, fx = 0.834, fy = 0.903) #调整大小和前一幅图像一致
  15. cv2.namedWindow("beauty1")
  16. cv2.imshow("beauty1", img1_50)
  17. cv2.waitKey(delay = 0)
  18. print(img1_50.shape)
  19. img1_51 = cv2.bitwise_and(img1_1, img1_50)
  20. cv2.namedWindow("Add1")
  21. cv2.imshow("Add1", img1_51)
  22. cv2.waitKey(delay = 0)

 得到的图像:

。。。。。离了个大谱!beauty0 和 beauty1 都没了

4. 图像或运算

操作方式和图像的与运算一样,只是函数的名称变了

img1_51 = cv2.bitwise_or(img1_1, img1_50) #对两图像进行或运算

得到的最终图像:
  

5. 图像异或运算

img1_51 = cv2.bitwise_xor(img1_1, img1_50) #对两图像进行异或操作

得到的图像如下: 

6. 图像非运算

对一个图像进行非操作

  1. img1_51 = cv2.bitwise_not(img1_1) #对读取的图像进行非操作
  2. cv2.namedWindow("Not")
  3. cv2.imshow("Not", img1_51)
  4. cv2.waitKey(delay = 0)

7. 图像逻辑运算的意义

参考资料:知乎回答

图像处理-逻辑运算

首先简单的算术运算对于图像来说就是对像素点值进行处理,为一幅图像加上一些要素或者减去一些要素,来观察图像的变化或者不同

在逻辑运算中,与运算可以求出两图像相交的部分,即对应的像素如果同时为真时结果为真;

非运算主要是将黑变为白,将白变为黑,对灰度图像的处理十分有效;

或运算可以求两种图像的合并,一个像素点为真时结果为真;

异或运算当两像素点相同时结果为真,不同时结果为假,可以得到两种图像不相交的部分,可以将图像进行扣出或者其他操作。

结束语

这篇文章主要汇总了图像处理过程中的一些算数运算和逻辑运算,也简单介绍了它们的意义,主要涉及一些基础操作,为后面的学习打下基础;对于一些参考资料我也添加在文章中了,如果想深入了解可以点进去进行学习。

推荐阅读