python_Opencv_图像上的算术运算

图像加法


 

cv2和numpy中都提供了图像相加的实现,你可以使用函数cv2.add() 将两幅图像进行加法运算,当然也可以直接使
用numpy,res=img1+img。两幅图像的大小,类型必须一致,或者第二个图像可以使一个简单的标量值。

但是二者实现有些不同,如下一个例子:

 1 # -*- coding: utf-8 -*-
 2 
 3 # 图像加法,比较numpy中和cv2中两种不同加法运算
 4 
 5 import cv2
 6 import numpy as np
 7 
 8 x = np.uint8([250])
 9 y = np.uint8([10])
10 print cv2.add(x,y) # 250+10 = 260 => 255
11 #cv2结果: [[255]]
12 print x+y # 250+10 = 260 % 256 = 4
13 #numpy结果: [4]
View Code

因此,需要说明一下。

OpenCV 中的加法与Numpy 的加法的不同点在于:OpenCV 的加法是一种饱和操作,而Numpy 的加法是一种模操作。

这种差别在你对两幅图像进行加法时会更加明显。OpenCV 的结果会更好一点。所以我们尽量使用OpenCV 中的函数。

 

图像混合


 

这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉。

图像混合的计算公式如下:

通过修改 的值(0 -->1),可以实现非常酷的混合。现在我们把两幅图混合在一起。

第一幅图的权重是0.7,第二幅图的权重是0.3。函数cv2.addWeighted() 可以按下面的公式对图片进行混合操作。

这里r的取值为0。

 1 # -*- coding: utf-8 -*-
 2 import cv2
 3 import numpy as np
 4 
 5 img1=cv2.imread('Koala.jpg')
 6 img2=cv2.imread('test.jpg')
 7 
 8 dst=cv2.addWeighted(img1,0.7,img2,0.3,0)  # 图片相加,效果为图像混合
 9 
10 cv2.imshow('dst',dst)
11 cv2.waitKey(0)
12 cv2.destroyAllWindows()
View Code

 

混合之后的效果:

需要注意的是:输入做混合操作的图片必须大小相同,否则会报错。

 

按位运算

这里包括的按位操作有:AND,OR,NOT,XOR 等。当我们提取图像的一部分,选择非矩形ROI 时这些操作会很有用。

下面的例子就是教给我们如何改变一幅图的特定区域。
我想把一个的标志放到另一幅图像上。如果我使用加法,颜色会改变,如果使用混合,会得到透明效果,但是我不想要透明。

如果他是矩形我可以象上一章那样使用ROI。但是他不是矩形。但是我们可以通过下面的按位运算实现:

 1 # -*- coding: utf-8 -*-
 2 import cv2
 3 import numpy as np
 4 
 5 
 6 img1 = cv2.imread('Koala.jpg')                          # 加载图像
 7 img2 = cv2.imread('logo.jpg')
 8 
 9 rows,cols,channels = img2.shape  
10 roi = img1[0:rows, 0:cols ]                             # 取img1的这个区域来处理                      
11 img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)        # 建立logo的二值图,也建立相反的二值图     
12 ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)#二值化
13 mask_inv = cv2.bitwise_not(mask)                        # 做非操作,黑的变白,白的变黑,黑色0,白色255
14 img1_bg = cv2.bitwise_and(roi,roi,mask = mask)          #与操作 ,参数输入,输出,与mask做and操作,黑色的被填充                               
15 img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)    #与操作                               
16 dst = cv2.add(img1_bg,img2_fg)                          # 相加
17 img1[0:rows, 0:cols ] = dst                             #把添加了logo的该区域赋值回原来的地方
18 
19 cv2.imshow('img2gray',img2gray)                         #显示整个过程中的中间结果和最终结果
20 cv2.imshow('ret',ret)
21 cv2.imshow('mask',mask)
22 cv2.imshow('mask_inv',mask_inv)
23 cv2.imshow('img1_bg',img1_bg)
24 cv2.imshow('img2_fg',img2_fg)
25 cv2.imshow('dst',dst)
26 cv2.imshow('res',img1)
27 cv2.waitKey(0)
28 cv2.destroyAllWindows()
View Code

posted @ 2016-09-17 17:50  Wenism  阅读(2139)  评论(0编辑  收藏  举报