Python-图像上的算术运算
图像加法
你可以使用函数cv2.add() 将两幅图像进行加法运算,当然也可以直接使
用numpy,res=img1+img。两幅图像的大小,类型必须一致,或者第二个
图像可以使一个简单的标量值。
import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg # mpimg 用于读取图片
x=np.uint8([250])
y=np.uint8([10])
z1=cv2.add(x,y)
print(z1)
z2=x+y
print(z2)
这种差别在你对两幅图像进行加法时会更加明显。OpenCV 的结果会更好
一点。所以我们尽量使用OpenCV 中的函数。
图像混合
这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混
合或者透明的感觉。图像混合的计算公式如下:
通过修改a的值(0 -> 1),可以实现非常酷的混合。
现在我们把两幅图混合在一起。第一幅图的权重是0.7,第二幅图的权重
是0.3。函数cv2.addWeighted() 可以按下面的公式对图片进行混合操作。
这里r的取值为0。
import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg # mpimg 用于读取图片
img1=cv2.imread('3.jpg')
img2=cv2.imread('4.jpg')
dst=cv2.addWeighted(img1,0.7,img2,0.3,0)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
裁剪图像
import cv2
import numpy as np
from PIL import Image
img = cv2.imread("2.jpeg")
print(img.shape)
cropped = img[0:1200, 0:1200] # 裁剪坐标为[y0:y1, x0:x1]
cv2.imwrite("2.png", cropped)
按位运算
这里包括的按位操作有:AND,OR,NOT,XOR 等。当我们提取图像的一部分,选择非矩形ROI 时这些操作会很有用。下面的例子就是教给我们如何改变一幅图的特定区域。
我想把树叶的标志放到另一幅图像上。如果我使用加法,颜色会改变,如果使用混合,会得到透明效果,但是我不想要透明。如果他是矩形我可以象上一章那样使用ROI。但是他不是矩形。但是我们可以通过下面的按位运算实现:
import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg # mpimg 用于读取图片
#让img2的logo放在img1的左上角 所以创建一个ROI
img1=cv2.imread('4.jpg')
img2=cv2.imread('5.jpg')
rows,cols,channels=img2.shape
roi=img1[0:rows,0:cols]
#创建掩模
img2gray=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret,mask=cv2.threshold(img2gray,175,255,cv2.THRESH_BINARY)
cv2.imshow('mask',mask)
#反运算
mask_inv=cv2.bitwise_not(mask)
cv2.imshow('mask_inv',mask_inv)
# 取roi 中与mask 中不为零的值对应的像素的值,其他值为0
# 注意这里必须有mask=mask 或者mask=mask_inv, 其中的mask= 不能忽略
img1_bg=cv2.bitwise_and(roi,roi,mask=mask)
cv2.imshow('img1_bg',img1_bg)
# 取roi 中与mask_inv 中不为零的值对应的像素的值,其他值为0。
# Take only region of logo from logo image.
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)
cv2.imshow('img2_bg',img2_fg)
# Put logo in ROI and modify the main image
dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如下,为了帮助大家理解我把上面程序的中间结果也显示了出来,特别是img1_bg 和img2_fg。
转载请注明出处,欢迎讨论和交流!