python有關於圖像的深度和通道


目錄:
(一)圖像的深度和圖像的通道
 (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


免責聲明!

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



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