1. 程式人生 > >OpenCV---像素運算

OpenCV---像素運算

imread mean std xtra ted target break key tar

像素運算

分為算術運算邏輯運算

算術運算:

加減乘除

調節亮度
調整對比度

邏輯運算:

與或非

遮罩層控制

一:算術運算

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個參數,輸出圖片

OpenCV---像素運算