zoukankan      html  css  js  c++  java
  • 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个参数,输出图片
  • 相关阅读:
    tensorflow模型的保存与恢复
    Anaconda Linux端环境管理
    Windows环境下Redis集群部署
    Error fetching https://ruby.taobao.org/:RubySass淘宝镜源无效解决
    ORM 轻量级框架 Dapper(介绍)
    TypeScript 数据类型
    TypeScript 环境搭建
    微信小程序反编译
    利用Fiddler实现手机抓包
    SQL 优化常用查询
  • 原文地址:https://www.cnblogs.com/ssyfj/p/9260798.html
Copyright © 2011-2022 走看看