'''图像上的算术运算
目标
• 学习图像上的算术运算,加法,减法,位运算等。
• 将要学习的函数与有:cv2.add(),cv2.addWeighted() 等。'''
#图像加法
'''你可以使用函数 cv2.add() 将两幅图像进行加法运算,当然也可以直接使用 numpy,res=img1+img。
两幅图像的大小,类型必须一致,或者第二个图像可以使一个简单的标量值。
注意:OpenCV 中的加法与 Numpy 的加法是有所不同的。OpenCV 的加法是一种饱和操作,而 Numpy
的加法是一种模操作。'''
x = np.uint8([250])
y = np.uint8([10])
cv.add(x,y) # OpenCV 的加法是一种饱和操作。 250+10 = 260 => 255
#array([[255]], dtype=uint8)
x+y # Numpy 的加法是一种模操作。250+10 = 260 % 256 = 4
#array([4], dtype=uint8)
#图像混合
'''这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉。
g (x) = (1 − α) f0 (x) + αf1 (x)
通过修改 α 的值(0 → 1),可以实现非常酷的混合。
现在我们把两幅图混合在一起。第一幅图的权重是 0.7,第二幅图的权重是 0.3。函数 cv2.addWeighted() 可以按下面的公式对图片进行混合操作。
dst = α · img1 + β · img2 + γ
这里 γ 的取值为 0。
取两个行列值相同的图片'''
img1 = cv.imread('img1.jpg')
img2 = cv.imread('img2.jpg')
#将两张图片进行混合,第一张图的融合比例0.4,第二张图的融合比例0.6
dst = cv.addWeighted(img1,0.4,img2,0.6,0)
#存储图片
cv.imwrite('dst.jpg',dst)
cv.imshow('image',dst)
cv.waitKey(10)
cv.destroyAllWindows()
从左往右: img1.jpg img2.jpg dst.jpg
'''ROI操作,它的英文全称是Region Of Interest,对应的中文解释就是感兴趣区域。
感兴趣区域,就是我们从图像中选择一个图像区域,这个区域就是图像分析所关注的焦点。
我们圈定这个区域,那么我们要处理的图像就从大图像变为一个小图像区域了,这样以便进
行进一步处理,可以大大减小处理时间。
用小图贴到大图的左上角'''
import cv2 as cv
import numpy as np
#导入大图和小图
img1= cv.imread('timg.jpg')
img2 = cv.imread('img2.jpg')
#获取小图的行、列、通道数
rows,cols,channels = img2.shape
#以小图的行、列、通道数值,用大图创建ROI
roi = img1[0:rows,0:cols]
#将两张图混合
roi = cv.addWeighted(roi,0.4,img2,0.6,0)
#将img1左上角区域替换成混合的图片
cv.imshow('image',img1)
cv.waitKey(10)
cv.destroyAllWindows()
'''最后显示的图片左上角有白色背景,不够美观 '''
#
import cv2 as cv
import numpy as np
#导入大图和小图
img1= cv.imread('timg.jpg')
img2 = cv.imread('img2.jpg')
#获取小图的行、列、通道数
rows,cols,channels = img2.shape
#生成roi图,按照小图的行、列值取大图值
roi = img1[0:rows, 0:cols]
#取小图转化为灰度图,不然后面的运算会报错。
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
#二值化小图,将小图中灰度值小于175的点置0,灰度值大于175的点置255。[https://blog.youkuaiyun.com/a19990412/article/details/81172426](https://blog.youkuaiyun.com/a19990412/article/details/81172426)
ret, mask = cv.threshold(img2gray, 175, 255, cv.THRESH_BINARY)
#对二值化小图进行非操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1。[https://blog.youkuaiyun.com/u011028345/article/details/77278467](https://blog.youkuaiyun.com/u011028345/article/details/77278467)
mask_inv = cv.bitwise_not(mask)
#生成img1背景图。对roi图与掩膜mask做与操作,即对图像(灰度图像或彩色图像均可)
#每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
img1_bg = cv.bitwise_and(roi,roi,mask = mask)
#生成img2前景图。对img2图与mask_inv做与操作。
img2_fg = cv.bitwise_and(img2,img2,mask = mask_inv)
#将img1背景图和img2前景图相加
dst = cv.add(img1_bg,img2_fg)
#将img1左上角区域替换成混合的图片
img1[0:rows, 0:cols ] = dst
cv.imshow('image',img1)
cv.waitKey(10)