Python+OpenCV圖像處理(五)—— 像素運算


 

  最近在忙畢業設計,只能偶爾更新博客........

一、像素的算術運算

像素的算術運算涉及加減乘除等基本運算(要進行算術運算,兩張圖片的形狀(shape)必須一樣)

代碼如下:

#像素的算術運算(加、減、乘、除)   兩張圖片必須shape一致
import cv2 as cv
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 divide_demo(m1, m2):   #像素的除法運算
    dst = cv.divide(m1, m2)
    cv.imshow("divide_demo", dst)
def multiply_demo(m1, m2):   #像素的乘法運算    
    dst = cv.multiply(m1, m2)
    cv.imshow("multiply_demo", dst)

src1 = cv.imread('E:\imageload\LinuxLogo.jpg')
src2 = cv.imread('E:\imageload\WindowsLogo.jpg')
cv.imshow('image1', src1)
cv.imshow('image2', src2)

add_demo(src1, src2)
subtract_demo(src1, src2)
divide_demo(src1, src1)
multiply_demo(src1, src2)

cv.waitKey(0)
cv.destroyAllWindows()

運行結果:

注意:

1.這里的的像素運算指的是多維數組對應的值進行加減乘除運算,前提是兩張圖片必須shape、size一樣

2.在相除的時候,一個很小的數除以很大的數結果必然小,所以得出的圖像幾乎全黑。(黑色為0,白色為255)

3.在相乘的時候,圖案“Linux”邊緣上的像素並不穩定

 

二、像素的邏輯運算

像素的邏輯運算涉及與、或、非、異或等基本運算(要進行邏輯運算,兩張圖片的形狀(shape)必須一樣)

這里主要展示與或非的邏輯運算

代碼如下:

#像素的邏輯運算(與、或、非)   兩張圖片必須shape一致
import cv2 as cv
def and_demo(m1, m2):    #與運算  每個像素點每個通道的值按位與
    dst = cv.bitwise_and(m1, m2)
    cv.imshow("and_demo", dst)
def or_demo(m1, m2):     #或運算   每個像素點每個通道的值按位或
    dst = cv.bitwise_or(m1, m2)
    cv.imshow("or_demo", dst)
def not_demo(m1):     #非運算   每個像素點每個通道的值按位取反
    dst = cv.bitwise_not(m1)
    cv.imshow("not_demo", dst)

src1 = cv.imread('E:\imageload\LinuxLogo.jpg')
src2 = cv.imread('E:\imageload\WindowsLogo.jpg')
cv.imshow('image1', src1)
cv.imshow('image2', src2)

and_demo(src1, src2)
or_demo(src1, src2)
not_demo(src1)

cv.waitKey(0)
cv.destroyAllWindows()

運行結果:

 

注意:這里的邏輯運算是按照像素點的各通道的值按二進制形式按位與或非進行運算的

 

三、調節圖片對比度和亮度

代碼如下:

#調節圖片對比度和亮度
import cv2 as cv
import numpy as np
def contrast_brightness_image(img1, ratio, b):    #第2個參數rario為對比度  第3個參數b為亮度
    h, w, ch = img1.shape
    img2 = np.zeros([h, w, ch], img1.dtype)    # 新建的一張全黑圖片和img1圖片shape類型一樣,元素類型也一樣
    dst = cv.addWeighted(img1, ratio, img2, 1 - ratio, b)
    cv.imshow("csecond", dst)
src = cv.imread("E:\imageload\example.png")
cv.imshow("first", src)
contrast_brightness_image(src, 0.1, 10)
cv.waitKey(0)
cv.destroyAllWindows()

運行結果:

注意:help(cv2.addWeighted)可得到.addWeighted函數的官方解釋。

函數addWeighted的原型:addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) -> dst

src1表示需要加權的第一個數組(上述例子就是圖像矩陣)

alpha表示第一個數組的權重

src2表示第二個數組(和第一個數組必須大小類型相同)

beta表示第二個數組的權重

gamma表示一個加到權重總和上的標量值

即輸出后的圖片矩陣:dst = src1*alpha + src2*beta + gamma;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM