如果需要对两张图片做加减等算术操作,那么前提是这两张图片的通道数目、尺寸必须一致。
import numpy as np
from cv2 import cv2
def add(img1,img2):
dst = cv2.add(img1,img2)
cv2.imshow("add_dst",dst)
def subtract(img1,img2):
dst = cv2.subtract(img1,img2)
cv2.imshow("subtract_dst",dst)
def divide_demo(img1,img2):
dst = cv2.divide(img1,img2)
cv2.imshow("divide_dst",dst)
def multiply_demo(img1,img2):
dst = cv2.multiply(img1,img2)
cv2.imshow("multiply_dst",dst)
也可以查看图像通道上的平均值,可以使RGB通道,也可以是HSV通道,当然灰度图也是可以的。
def average(img1,img2):
mean1 = cv2.mean(img1)
mean2 = cv2.mean(img2)
print(mean1)
print(mean2)
有时候,仅仅查看平均值并不能够正确地反映出我们想要的信息,这时候就可以查看利用opencv中自带的 cv2.meanStdDev计算出方差。方差越大说明各个像素之间差异越大
def mean_dev(img1,img2):
mean1, std1= cv2.meanStdDev(img1)
mean2, std2= cv2.meanStdDev(img2)
print(mean1)
print(mean2)
print(std1)
print(std2)
有些时候,我们可以通过像素点的运算来处理图像。比方通过一张遮罩图(或黑或白的二值图),然后通过与、或、取反操作待处理的图像,就可以得出我们想要的结果。
def logic_and_demo(img1,img2):
"""逻辑与运算,只有两个bit都是1时,两bit的与运算结果才为1"""
"""黑色BGR(0,0,0)数据类型为uint8,所以二进制形态为00000000"""
"""白色BGR(255,255,255)数据类型为uint8,二进制形态为11111111"""
"""由此可见黑色像素与任何颜色进行与运算结果都为黑色,黑色遮挡一切"""
"""白色像素和任何颜色像素进行与运算结果都为原来的颜色,白色相当于透明"""
dst = cv2.bitwise_and(img1,img2)
#注意,若img1或img2中有一个是mask,则它可以作为遮罩层
cv2.imshow("logic_and_dst",dst)
def logic_or_demo(img1,img2):
"""两bit进行或运算,两bit中只要与一个为1,则结果为1"""
"""任何颜色与黑色进行或运算,结果都保持原来的颜色"""
"""任何颜色与白色进行或运算,结果都为白色"""
dst = cv2.bitwise_or(img1,img2)
cv2.imshow("logic_or_dst",dst)
def logic_not_demo(img1):
"""bit_wise_not其实是按位取反,即像素的某个通道二进制形态为10010011,则变为01101100"""
"""注意01101100+10010011=11111111,即255"""
dst = cv2.bitwise_not(img1)
cv2.imshow("logic_not_dst",dst)
以上内容如有错误,欢迎指出。谢谢!