之前学习了图像的导入,现在要对两张图像进行简单的运算。
先上代码
import cv2
import numpy as np
#load images
img1 = cv2.imread('tong1.jpg')
img2 = cv2.imread('tong2.jpg')
logo = cv2.imread('logo.jpeg')
'''
#add = img1 + img2
#add = cv2.add(img1,img2)
#add = cv2.addWeighted(img1,0.8,img2,0.2,0)
'''
rows,cols,channels = logo.shape
roi = img1[0:rows,0:cols]
img2gray = cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY)
ret,mask = cv2.threshold(img2gray,220,255,cv2.THRESH_BINARY_INV)
mask_inv = cv2.bitwise_not(mask)
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)
logo_fg = cv2.bitwise_and(logo,logo,mask = mask)
dst = cv2.add(img1_bg,logo_fg)
img1[0:rows,0:cols] = dst
cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
可以看到我在这里注释了三行东西,这三行代表着不同的加法运算。
第一行add = img1 + img2,是numpy的运算,直接相加。结果是把每个像素的三个颜色都加起来,当然会出现超过255的数。当imshow的时候,遇到超过255的数字就会进行取模运算。
第二行add = cv2.add(img1,img2),是opencv的运算,这里和numpy运算不一样的地方是在相加的时候遇到超过255的数就会直接取255。当imshow的时候会显示成白色(255,255,255)
第三行是有权重的加法,每个图像后面的变量是图像所占的比重,最后一个是图像的伽马值,这里取0。
这三种加法比较简单,不再赘述。
没有注释的部分是将一张图片去掉背景放到另一张图片上,我用的是下面两张图。
运行之后的图片如下:
可以看到python标志的白色背景被删掉加到了蓝天的图片上。接下来让我们看看程序是怎么实现的。
首先将logo的图片像素赋值给rows和cols,取背景图片相同大小的块赋值给roi,将logo灰度化。
接下来我们看到了新的函数threshold(),这个函数将处于220~255之间的像素变成255(白色),其余的变成0(黑色)。用bitwise_not将mask反色。
bitwise_and()这两句话没太懂什么意思,不过我把图画了出来,可以在评论区留言讨论。
然后将背景图片上相应的区域变成处理之后的图片,最后显示出来。
一般这样认为,bitwise_and()函数用黑色部分把原图遮挡起来。但是没有具体的细节,经过大佬指点,翻了翻源文件。
这里bitwise_and()有三个参数,可以说都是与的关系,可以认为前两个先与,小值覆盖大值,第三个参数作为掩码来覆盖,拿其中一个说明,roi和roi与之后还是自己,然后用mask_inv作为掩码,发现mask_inv中间是黑色的,就是0,那么roi中间被0填充,也就是传说中的被遮盖掉。
这里用到了python一个很有意思的命令,在这里看到的:
~/$ python -m pydoc -p 1234
pydoc server ready at http://localhost:1234/
运行之后在浏览器中输入得到的网址http://localhost:1234/,这期间终端不要关,就可以看到python的所有库文件了。