一.改變圖片每個像素點每個通道的灰度值
(一)
代碼如下:
#遍歷訪問圖片每個像素點,並修改相應的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為白色
