opencv学习五:图片像素运算--数值运算和逻辑运算

像素运算

在这里插入图片描述

一、算数运算

在这里插入图片描述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),则不合并(第一图像的合并区域与第二图像的合并区域)。反之亦然,它将被执行

猜你喜欢

转载自blog.csdn.net/weixin_44145452/article/details/112425749
今日推荐