import cv2 as cv
import numpy as np
def add_demo(m1,m2):
dst = cv.add(m1,m2)
cv.imshow("add_demo",dst)
#xiangjian
def subtract_demo(m1,m2):
dst = cv.subtract(m1,m2)
cv.imshow("sub_demo",dst)
#chu
def divide_demo(m1,m2):
dst = cv.divide(m1,m2)
cv.imshow("divide_demo", dst)
#cheng
def multiply(m1,m2):
dst = cv.multiply(m1,m2)
cv.imshow("multiply_demo",dst)
def others(m1,m2):
#cv.mean():得到一个关于每个通道图像的像素值的均值的数组。
M1 = cv.mean(m1)
M2 = cv.mean(m2)
print(M1)
print(M2)
src2 = cv.imread("E:/opencv/picture/WindowsLogo.jpg")
src1 = cv.imread("E:/opencv/picture/LinuxLogo.jpg")
print("src1 =%s ,src2 =%s"%(src1.shape,src2.shape))
add_demo(src1,src2)
subtract_demo(src1,src2)
divide_demo(src1,src2)
multiply(src1,src2)
others(src1,src2)
cv.imshow("img1",src1)
cv.imshow("img2",src2)
cv.waitKey(0)
cv.destroyAllWindows()
总结:
进行图像运算的前提是两个图片的尺寸和维度是完全一样的。
相关的api指令:
1. 相加
dst = cv.add(m1,m2)
2. 相减
dst = cv.subtract(m1,m2)
3. 相乘
dst = cv.multiply(m1,m2)
4. 相除
dst = cv.divide(m1,m2)
5. 求出图片各个通道像素值的平均值
M1 = cv.mean(m1)
print(M1)
6. 求出图片的均值与方差,
MM1,dev1 = cv.meanStdDev(m1)
MM2,dev2 = cv.meanStdDev(m2)
其中返回值MM1是各个通道像素的均值,dev1是各个通道像素的方差。
注意:
1-4 输出的依旧是图片数组。
5-6 输出的是1行3列1维的数组(分别是各个通道像素值的均值与方差)。
下面再分析逻辑运算与对比度,亮度调整:
def logic_demo(m1,m2):
dst1 = cv.bitwise_and(m1,m2)
dst2 = cv.bitwise_or(m1,m2)
dst3 = cv.bitwise_not(m1)#这个一般只针对一个对象
cv.imshow("logic_win1",dst1)
cv.imshow("logic_win2", dst2)
cv.imshow("logic_win3", dst3)
相关api指令:
1. cv.bitwise_and(src1,src2)
将src1,src2两图像作“逻辑并”运算
2. cv.bitwise_or(src1,src2)
将src1,src2两图像作“逻辑或”运算
3. cv.bitwise_not(src)
将src图像作非运算
亮度,对比度调节:
def contrast_brightness_demo(image,c,b):
h,w,ch = image.shape
blank = np.zeros([h,w,ch],image.dtype)
dst = cv.addWeighted(image,c,blank,1-c,b)
cv.imshow("dst_contrast_win",dst)
其中api指令:addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
一共有七个参数:前4个是两张要合成的图片及它们所占比例,第5个double gamma起微调作用,后面两个不管。
由公式得出两个图片加成输出的图片为:dst=src1*alpha+src2*beta+gamma
在程序段中: dst = image*c +0*(1-c)+gamma
所以说1-c这项写啥都行,0也就ok了。