像素运算
一、算数运算
1.1 加减乘除
opencv自带图片色素的处理函数:
相加:add()
相减:subtract()
相乘:multiply()
相除:divide()
原理就是:通过获取两张(一次只能是两张)个图片的同一个位置的色素值来实现运算。
运算的要求:两张图片的shape要一样。
例图:
代码:
import cv2 as cv #导入cv模块
import numpy as np #np科学计数的包,通过numpy对数据进行处理
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("D:/opencv3.4.13/opencv/sources/samples/data/LinuxLogo.jpg") #读取图片位置
src2 = cv.imread("D:/opencv3.4.13/opencv/sources/samples/data/WindowsLogo.jpg") #读取图片位置
print(src1.shape)
print(src2.shape)
cv.namedWindow("image1", cv.WINDOW_AUTOSIZE) #创建一个GUI
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)
cv.destroyAllWindows() #释放所有的内存
代码可以简化:
import cv2 as cv
#数值运算:加减乘除
def shu_image(src11, src22):
src = cv.add(src11, src22)#加
cv.imshow("add", src)
src = cv.subtract(src11, src22)#减
cv.imshow("subtract", src)
src = cv.subtract(src11, src22)#乘
cv.imshow("subtract", src)
src = cv.divide(src11, src22)#除
cv.imshow("divide", src)
src1 = cv.imread("01.jpg")
src2 = cv.imread("02.jpg")
cv.imshow("image1", src1)
cv.imshow("image2", src2)
shu_image(src1, src2)
cv.waitKey(0)
cv.destroyAllWindows()
运行截图:
1.2 调节亮度和调整对比度
基本原理:两张图片合成。
先按照原来的图片的格式新建一个色素全为零的图片,然后按照两张图的比例不同合成一张新图片。主要用到函数:addWeighted函数
代码如下:
import cv2 as cv #导入cv模块
import numpy as np #np科学计数的包,通过numpy对数据进行处理
# 粗略的调节对比度和亮度
def contrast_brightness_image(src1, a, g):
h, w, ch = src1.shape # 获取shape的数值,height和width、通道
# 新建全零图片数组src2,将height和width,类型设置为原图片的通道类型(色素全为零,输出为全黑图片)
src2 = np.zeros([h, w, ch], src1.dtype)
dst = cv.addWeighted(src1, a, src2, 1 - a, g) # addWeighted函数说明如下
cv.imshow("con-bri-demo", dst)
src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/lena.jpg")
cv.namedWindow("image1", cv.WINDOW_AUTOSIZE) #创建一个GUI
cv.imshow("image1", src) #对窗口图片进行展示
contrast_brightness_image(src, 1.5, 10)#第一个1.2为对比度 第二个为亮度数值越大越亮
cv.waitKey(0)
cv.destroyAllWindows() #释放所有的内存
运行截图:
addWeighted函数:官方:计算两个图像阵列的加权和 我的理解是按照所占比例合成两张图片。
Opencv:cv2.addWeighted() 图像融合
addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
一共有七个参数:前4个是两张要合成的图片及它们所占比例,第5个double gamma起微调作用,第6个OutputArray dst是合成后的图片,第七个输出的图片的类型(可选参数,默认-1)
有公式得出两个图片加成输出的图片为:dst = src1[I] * alpha + src2[I] * beta + gamma
参考:opencv进阶学习笔记3:像素运算和图像亮度对比度调节
其中c越大,越亮。
起作用的是系数1,和亮度调节量。
系数2乘以的是全0数组,无用,放在这里起传参作用
二、逻辑运算
2.1 与、或、非
opencv自带图片色素的处理函数:
与:bitwise_add()
或:bitwise_or()
非:bitwise_not()
异或:bitwise_xor()
代码如下:
import cv2 as cv #导入cv模块
import numpy as np #np科学计数的包,通过numpy对数据进行处理
def logic_demo(m1, m2):
dst = cv.bitwise_and(m1, m2)
dst = cv.bitwise_or(m1, m2)
image = cv.imread("D:/opencv3.4.13/opencv/sources/samples/data/LinuxLogo.jpg") # 读取图片位
dst = cv.bitwise_not(image)
dst = cv.bitwise_xor(m1, m2)
cv.imshow("logic_demo", dst)
src1 = cv.imread("D:/opencv3.4.13/opencv/sources/samples/data/LinuxLogo.jpg") #读取图片位置
src2 = cv.imread("D:/opencv3.4.13/opencv/sources/samples/data/WindowsLogo.jpg") #读取图片位置
print(src1.shape)
print(src2.shape)
cv.namedWindow("image1", cv.WINDOW_AUTOSIZE) #创建一个GUI
cv.imshow("image1", src1) #对窗口图片进行展示
cv.imshow("image2", src2) #对窗口图片进行展示
logic_demo(src1, src2)
cv.waitKey(0)
cv.destroyAllWindows() #释放所有的内存
运行截图:
2.2 遮罩层控制
代码如下:
import cv2 as cv #导入cv模块
import numpy as np #np科学计数的包,通过numpy对数据进行处理
def extrace_object_demo():
capture = cv.VideoCapture("C:/Users/lenovo/Desktop/opencv/daima/banknum/test.mp4")
while(True):
ret, frame = capture.read()
if ret == False:
break;
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
lower_hsv = np.array([37, 43, 46])
upper_hsv = np.array([77, 255, 255])
mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv)
dst = cv.bitwise_and(frame, frame, mask=mask)
cv.imshow("video", frame)
cv.imshow("mask", dst)
c = cv.waitKey(40)
if c == 27:
break
extrace_object_demo()
cv.waitKey(0)
cv.destroyAllWindows() #释放所有的内存
运行截图:
解释参数含义在res = cv2.bitwise_and(img,img,mask = mask)
src1:第一个图像(合并的第一个对象)src2:第二个图像(合并的第二个对象)mask:理解为要合并的规则。如果图像的区域(灰度缩放,然后被遮罩)具有黑色(值为0),则不合并(第一图像的合并区域与第二图像的合并区域)。反之亦然,它将被执行