OpenCV---像素运算
像素运算
分为算术运算和逻辑运算
算术运算:
加减乘除
调节亮度
调整对比度
逻辑运算:
与或非
遮罩层控制
一:算术运算
import cv2 as cv import numpy as np def add_demo(m1,m2): dst = cv.add(m1,m2) cv.imshow("add_demo",dst) def subtract_demo(m1,m2): dst = cv.subtract(m1,m2) cv.imshow("subtract_demo",dst) def multiply_demo(m1,m2): dst = cv.multiply(m1,m2) cv.imshow("multiply_demo",dst) def divide_demo(m1,m2): dst = cv.divide(m1,m2) #不多用 cv.imshow("divide_demo",dst) src1 = cv.imread("./a1.jpg") #读取图片 src2 = cv.imread("./a2.jpg") #读取图片 print(src1.shape) print(src2.shape) cv.imshow("image1",src1) cv.imshow("image2",src2) add_demo(src1,src2) subtract_demo(src1,src2) multiply_demo(src1,src2) divide_demo(src1,src2) cv.waitKey(0) #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作 cv.destroyAllWindows() #销毁所有窗口
原图:
add:(黑色是0,白色为255,当大于255会为白色,小于0为黑色)
subtract:
multiply:
divide:
获得各个通道的均值:
def others(m1,m2): M1 = cv.mean(m1) M2 = cv.mean(m2) print(M1) print(M2)
(190.8543375, 190.8543375, 190.8543375, 0.0) #整体偏黑 (186.68600625000002, 228.5496625, 241.74333125, 0.0) #红绿较多,所以偏黄
获取各个图像的方差:
def others(m1,m2): M1 = cv.mean(m1) M2 = cv.mean(m2) M1,dev1 = cv.meanStdDev(m1) #返回均值和方差,分别对应3个通道 M2,dev2 = cv.meanStdDev(m2) print(M1) print(dev1) print(M2) print(dev2)
[[190.8543375] #M1 [190.8543375] [190.8543375]] [[95.31664687] #dev1 [95.31664687] [95.31664687]]
[[186.68600625] #M2 [228.5496625 ] [241.74333125]] [[72.40766216] #dev2 [39.39460523] [30.92104465]]
可以知道dev2偏小,所以图二中色彩差异(对比性)是较小的,若是整张图片同色,则方差为0,均值为0,可以用来查看扫描仪中是否有信息(方差小于一个预值,则失效,丢弃)
img = np.zeros([400,400,3],np.uint8) m,dev = cv.meanStdDev(img) print(m,dev)
二:逻辑运算
与and:(1和1为1)(类似遮罩,当我们使用白色遮罩)
def logic_and_demo(m1,m2): dst = cv.bitwise_and(m1,m2) cv.imshow("logic_and_demo",dst)
或or:(1和1,1和0都为1)
def logic_or_demo(m1,m2): dst = cv.bitwise_or(m1,m2) cv.imshow("logic_or_demo",dst)
异或xor:(1和0为1)
def logic_xor_demo(m1,m2): #异或:不同为1,相同为0 dst = cv.bitwise_xor(m1,m2) cv.imshow("logic_or_demo",dst)
非(not):对一张图片取反
def logic_not_demo(m1): #非是对于一张图片 dst = cv.bitwise_not(m1) cv.imshow("logic_not_demo",dst)
补充:针对视频中inrange
def extrace_object(): capture = cv.VideoCapture("./1.mp4") while True: ret,frame = capture.read() #frame是每一帧图像,ret是返回值,为0是表示图像读取完毕 if ret == False: break hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV) lower_hsv = np.array([0,43,46]) upper_hsv = np.array([10,255,255]) mask = cv.inRange(hsv,lower_hsv,upper_hsv) dst = cv.bitwise_and(frame,frame,mask=mask) cv.imshow("video",frame) cv.imshow("mask", mask) cv.imshow("dst",dst) c = cv.waitKey(40) if c == 27: break
mask:该函数输出的dst是一幅二值化之后的图像(是将满足我们的图像对象所有位都设为1白色,不满足设置为0黑色)
bitwise_and:白色全为1与原图相与,会将白色区域提取
调整亮度和对比度addWeighted
推文:Opencv 例程讲解 6 ---- 图片融合 addWeighted到底有多快?
def contrast_brightness_demo(image,c,b): ''' :param image: 原图 :param c: 对比度 是将像素乘与c,原来2,4---->4, 8 差距由2--->4导致对比增强 :param b: 亮度 是将每个像素点加上相关亮度 :return: ''' 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",dst)
src = cv.imread("./1.png") cv.imshow("src",src) contrast_brightness_demo(src,1.2,0)
亮度:
src = cv.imread("./1.png") cv.imshow("src",src) contrast_brightness_demo(src,1,50)
1、第1个参数,输入图片1, 2、第2个参数,图片1的融合比例 3、第3个参数,输入图片2 4、第4个参数,图片2的融合比例 5、第5个参数,偏差 6、第6个参数,输出图片