Python+OpenCV圖像處理(三)—— Numpy數組操作圖片


一.改變圖片每個像素點每個通道的灰度值

(一)

代碼如下:

#遍歷訪問圖片每個像素點,並修改相應的RGB
import cv2 as cv
def access_pixels(image):
    print(image.shape)
    height = image.shape[0]
    width = image.shape[1]
    channels = image.shape[2]
    print("width: %s  height: %s  channels: %s"%(width, height, channels))
    for row in range(height):
        for col in range(width):
            for c in range(channels):
                pv = image[row , col, c]        #獲取每個像素點的每個通道的數值
                image[row, col, c]=255 - pv     #灰度值是0-255   這里是修改每個像素點每個通道灰度值
    cv.imshow("second_image",image)
src=cv.imread('E:\imageload\example.png')   #blue, green, red
cv.namedWindow('first_image', cv.WINDOW_AUTOSIZE)
cv.imshow('first_image', src)
t1 = cv.getTickCount()    #GetTickcount函數返回從操作系統啟動到當前所經過的毫秒數
access_pixels(src)
t2 = cv.getTickCount()
time = (t2-t1)/cv.getTickFrequency()  #getTickFrequency函數返回CPU的頻率,就是每秒的計時周期數
print("time : %s ms"%(time*1000) )    #輸出運行時間
cv.waitKey(0)
cv.destroyAllWindows()

運行結果:

 

注意:

1.image[i,j,c]   i表示圖片的行數,j表示圖片的列數,c表示圖片的通道數(0代表B,1代表G,2代表R    一共是RGB三通道)。坐標是從左上角開始

2.每個通道對應一個灰度值。灰度值概念:把白色與黑色之間按對數關系分成若干級,稱為“灰度等級”。范圍一般從0到255,白色為255,黑色為0。要詳細了解灰度值和通道的概念,請參考這篇博客:https://blog.csdn.net/silence2015/article/details/53789748

 

(二)

上述代碼實現像素取反的運行時間較長,下面代碼運用opencv自帶的庫函數可以使運行時間大大減少。

代碼如下:

#調用opencv的庫函數快速實現像素取反
import cv2 as cv
def inverse(img):
    img = cv.bitwise_not(img)   #函數cv.bitwise_not可以實現像素點各通道值取反
    cv.imshow("second_image", img)

src=cv.imread('E:\imageload\example.png')   #blue, green, red
cv.namedWindow('first_image', cv.WINDOW_AUTOSIZE)
cv.imshow('first_image', src)
t1 = cv.getTickCount()    #GetTickcount函數返回從操作系統啟動到當前所經過的毫秒數
inverse(src)
t2 = cv.getTickCount()
time = (t2-t1)/cv.getTickFrequency()  #getTickFrequency函數返回CPU的頻率,就是每秒的計時周期數
print("time : %s ms"%(time*1000) )    #輸出運行時間
cv.waitKey(0)
cv.destroyAllWindows()

運行結果:

可見,使用庫函數 bitwise_not 可以使運行時間縮短13倍左右

 

二.自定義一張三通道圖片

代碼如下:

#自定義一張三通道圖片
import cv2 as cv
import numpy as np
def creat_image():
    img = np.zeros([400, 400, 3], np.uint8)   #將所有像素點的各通道數值賦0
    img[:, :, 0] = np.ones([400, 400]) * 255   #0通道代表B
    # img[:, :, 1] = np.ones([400, 400]) * 255   #1通道代表G
    # img[:, :, 2] = np.ones([400, 400]) * 255   #2通道代表R
    cv.imshow("new_image",img)
creat_image()
cv.waitKey(0)
cv.destroyAllWindows()

運行結果:

 

注意:

1.np.zeros函數用於創建一個數值全為0的矩陣,np.ones用於創建一個數值全為1的矩陣

2.當圖片為多通道圖片時,B:255  G:0  R:0 則三通道圖片顯示藍色。所有通道數值組合示意圖如下:

 

 

 

 

補注:

單通道: 此通道上值為0-255。 (255為白色,0是黑色) 只能表示灰度,不能表示彩色。
三通道:BGR (255,255,255為白色, 0,0,0是黑色 )  可以表示彩色, 灰度也是彩色的一種。

單通道和三通道區別見博客:https://blog.csdn.net/qq_32211827/article/details/56854985

 

三、自定義一張單通道圖片

代碼如下:

#自定義一張單通道圖片
import cv2 as cv
import numpy as np
def creat_image():
    img = np.ones([400, 400, 1], np.uint8)   #該像素點只有一個通道,該函數使所有像素點的通道的灰度值為1
    img = img * 127       #使每個像素點單通道的灰度值變為127
    cv.imshow("new_image",img)
creat_image()
cv.waitKey(0)
cv.destroyAllWindows()

運行結果:

注意:

1.代碼里 img = img * 127    表示數組里的每個數值都乘以127

2.之所以np.ones函數參數類型是uint8,是因為uint8數的范圍為0~255,  那么為0時恰好為黑色,為255時恰好為白色。若函數參數類型為int8,則int8類型數的范圍為-128~127,那么-128則為黑色,127為白色

 

 

 

 

 


免責聲明!

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



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