目錄:
(一)圖像的深度和圖像的通道
(1)圖像的深度
(2)圖像的通道
(二)自定義一張多通道的圖片
(1)zeros 函數
(2)ones 函數
(三)自定義一張單通道的圖片
(四)像素操作
(1)numpy操作數組
(2)調用庫函數
(五)opnecv 利用getTickCount()和getTickFrequency()計算執行時間
正文:
(一)圖像的深度和圖像的通道
(1)圖像的深度
圖像中像素點占得bit位數,就是圖像的深度,比如:
二值圖像:圖像的像素點不是0 就是1 (圖像不是黑色就是白色),圖像像素點占的位數就是 1 位,圖像的深度就是1,也稱作位圖。
灰度圖像:圖像的像素點位於0-255之間,(0:全黑,255代表:全白,在0-255之間插入了255個等級的灰度)。2^8=255,圖像的深度是8。
依次輪推,我們把計算機中存儲單個像素點所用的 bit 位稱為圖像的深度。
(2)圖像的通道
有了圖像深度的概念,我們知道如果是24位的圖像,則這個像素點的顏色的取值范圍是:從0到2^24。這個范圍特別大,如果我們知道了某店的像素值怎么判斷像素點的顏色呢?我們知道 RGB是基本的三原色,如果我們用8位代表一種顏色,每種顏色最大是255,這樣每個像素點的顏色值的范圍就是(0-255,0-255,0-255)。這樣圖像的通道就是3。
灰度圖的圖像存儲模型

灰度圖像像素點的存儲就是對應的原圖從左到右,從上到下,依次排列,每個點的值就是就是像素點的值,每個點的地址就是像素像素點的地址。
RGB圖的圖像存儲模型

RGB彩色圖像和灰度圖相比,每個像素點都有3個通道。每個通道占的內存空間都是8位。在內存中,RGB 圖像的存儲是以二維數組的形式。
學習圖像的存儲就是為了理解圖像中像素點的存儲情況,有助於我們對每個像素點的操作。
(二)自定義一張多通道的圖片-----用到函數:zeros和ones
(1)zeros 函數
1 # -*- coding=GBK -*- 2 import cv2 as cv 3 import numpy as np 4 5 6 def create_image(): 7 img = np.zeros([400, 400, 3], np.uint8)#zeros:double類零矩陣 創建400*400 3個通道的矩陣圖像 參數時classname為uint8 8 img[:, :, 0] = np.ones([400, 400])*255#ones([400, 400])是創建一個400*400的全1矩陣,*255即是全255矩陣 並將這個矩陣的值賦給img的第一維 9 img[:, :, 1] = np.ones([400, 400])*255#第二維全是255 10 img[:, :, 2] = np.ones([400, 400])*255#第三維全是255 11 cv.imshow("自制圖片", img)#輸出一張400*400的白色圖片(255 255 255):藍(B)、綠(G)、紅(R) 12 13 create_image() 14 cv.waitKey(0) 15 cv.destroyAllWindows()
(2)ones 函數
1 # -*- coding=GBK -*- 2 import cv2 as cv 3 import numpy as np 4 5 6 def create_image(): 7 img = np.ones([400, 400, 3], np.uint8) 8 img[:, :, 0] = img[:, :, 0]*255 9 img[:, :, 1] = img[:, :, 1]*255 10 img[:, :, 2] = img[:, :, 2]*255 11 cv.imshow("自制圖片", img) 12 13 create_image() 14 cv.waitKey(0) 15 cv.destroyAllWindows()
第8,9,10行換成
image[:, :, 0] = np.ones([400, 400]) * 255
image[:, :, 1] = np.ones([400, 400]) * 255
image[:, :, 2] = np.ones([400, 400]) * 255
建議 img[:, :, 2] = np.ones([400, 400])*255 這樣賦值
(3)補充
1 >>>from numpy import * 2 >>> a=zeros((3,4)) 3 >>> a 4 array([[ 0., 0., 0., 0.], 5 [ 0., 0., 0., 0.], 6 [ 0., 0., 0., 0.]]) 7 >>> from numpy import * 8 >>> a=ones((3,4)) 9 >>> a 10 array([[ 1., 1., 1., 1.], 11 [ 1., 1., 1., 1.], 12 [ 1., 1., 1., 1.]]) 13 >>> from numpy import * 14 >>> a=eye(3) 15 >>> a 16 array([[ 1., 0., 0.], 17 [ 0., 1., 0.], 18 [ 0., 0., 1.]])
(三)自定義一張單通道的圖片
1 # -*- coding=GBK -*- 2 import cv2 as cv 3 import numpy as np 4 5 6 def create_image(): 7 img = np.ones([400, 400, 1], np.uint8) 8 img = img * 127 9 cv.imshow("自制圖片", img) 10 11 create_image() 12 cv.waitKey(0) 13 cv.destroyAllWindows()
(四)像素操作
(1)numpy操作數組
讀取一張圖片,修改顏色通道后輸出,可以得到圖像的:行數,列數,通道數的矩陣,對矩陣進行操作可改變圖像像素
1 # -*- coding=GBK -*- 2 import cv2 as cv 3 import numpy as np 4 5 6 #numpy數組操作 7 def access_pixles(image): 8 print(image.shape) 9 height = image.shape[0] 10 width = image.shape[1] 11 channel = image.shape[2] 12 print("width : %s, height : %s, channel : %s" % (width, height, channel)) 13 for row in range(height): 14 for col in range(width): 15 for c in range(channel): 16 pv = image[row, col, c] 17 image[row, col, c] = 255 - pv 18 cv.imshow("修改后", image) 19 20 21 src = cv.imread("C://1.jpg") 22 #cv.namedWindow("原來", cv.WINDOW_NORMAL) 23 cv.imshow("原來", src) 24 t1 = cv.getTickCount()#毫秒級別的計時函數,記錄了系統啟動以來的時間毫秒 25 access_pixles(src) 26 t2 = cv.getTickCount() 27 time = (t2 - t1)*1000/cv.getTickFrequency()#getTickFrequency用於返回CPU的頻率,就是每秒的計時周期數 28 print("time: %s" % time)#輸出運行的時間 29 cv.waitKey(0) 30 cv.destroyAllWindows()
(2)調用庫函數
1 # -*- coding=GBK -*- 2 import cv2 as cv 3 import numpy as np 4 5 6 #像素取反 7 def inverse(image): 8 dst = cv.bitwise_not(image) 9 cv.imshow("取反", dst) 10 11 12 src = cv.imread("C://1.jpg") 13 cv.namedWindow("原來", cv.WINDOW_NORMAL) 14 cv.imshow("原來", src) 15 t1 = cv.getTickCount() 16 inverse(src) 17 t2 = cv.getTickCount() 18 time = (t2 - t1)*1000/cv.getTickFrequency() 19 print("time: %s" % time) 20 cv.waitKey(0) 21 cv.destroyAllWindows()
(五)opnecv 利用getTickCount()和getTickFrequency()計算執行時間
t1 = cv.getTickCount()
picture_message(scr)
t2 = cv.getTickCount()
time = 1000*(t2-t1)/cv.getTickFrequency()
print('Time is %s ms'% time)
getTickCount():用於返回從操作系統啟動到當前所經的計時周期數,看名字也很好理解,get Tick Count(s)。
getTickFrequency():用於返回CPU的頻率。get Tick Frequency。這里的單位是秒,也就是一秒內重復的次數。
所以剩下的就很清晰了:
總次數/一秒內重復的次數 = 時間(s)
1000 *總次數/一秒內重復的次數= 時間(ms)
這個邏輯很清晰,沒什么問題,但是這里有一個小坑,那就是C版本的cvGetTickFrequency()函數和C++版本的getTickFrequency()的單位不一樣,前者以ms計算頻率,后者以s為單位計算頻率,所以如果使用C版本的cvGetTickFrequency()計算時間的話,應該是:
總次數/一秒內重復的次數*1000 = 時間(ms)
總次數/一秒內重復的次數= 時間(s)
參考:
https://blog.csdn.net/u013355826/article/details/64905921
https://blog.csdn.net/u011321546/article/details/79523115
https://www.cnblogs.com/jczhuang/p/9766950.html