利用numpy實現多維數組操作圖片


        1、上次介紹了一點點numpy的操作,今天我們來介紹它如何用多維數組操作圖片,這之前我們要了解一下色彩是由blue ,green ,red 三種顏色混合而成,0:表示黑色 ,127:灰色 ,255:白色   ;接下來我們還是來看代碼:

    

 1 import cv2 as cv
 2 import numpy as np
 3 
 4 
 5 def access_piexls(image):
 6     print(image.shape)  #獲取圖像的形狀大小
 7     height=image.shape[0] #圖像的第一維度高度
 8     width=image.shape[1] #圖像的第二維度寬度
 9     channels=image.shape[2] #圖像的第三維度通道數
10     print("height : %s , width :%s , channels: %s"%(height,width,channels))
11     for row in range(height):
12         for col in range(width):
13             for c in range(channels):
14                 pv=image[row,col,c] #一個三維數組,來獲取每個維度的值
15                 image[row,col,c]=255-pv  #修改它的顏色顯示
16     cv.imshow("hhhh",image)
17 src=cv.imread("D:\hh.JPG")   #blue green red 色彩通道,這是基本的色彩構成,后面會學到  0:表示黑色   255:表示白色
18 
19 cv.namedWindow('input image',0)
20 cv.imshow('input image',src)
21 t1=cv.getTickCount() #獲取當前cpu轉動的時間
22  access_piexls(src)
23 24 t2=cv.getTickCount()
25 print("time : %s ms" %((t2-t1)/cv.getTickFrequency()*1000))  #計算走了多少秒
26 cv.waitKey(-1)
27 cv.destoryAllWindows()

 最終實現的效果如下(我們可以看到cpu 顯示這這張修改后的照片時間是9秒左右,同時照片的顏色也被改變了):

     

  2、接下來我們我可以在這個基礎上創建出一張新的照片來:

              

 1 import cv2 as cv
 2 import numpy as np
 3 
 4 
 5 def access_piexls(image):
 6     print(image.shape)  #獲取圖像的形狀大小
 7     height=image.shape[0] #圖像的第一維度高度
 8     width=image.shape[1] #圖像的第二維度寬度
 9     channels=image.shape[2] #圖像的第三維度通道數
10     print("height : %s , width :%s , channels: %s"%(height,width,channels))
11     for row in range(height):
12         for col in range(width):
13             for c in range(channels):
14                 pv=image[row,col,c] #一個三維數組,來獲取每個維度的值
15                 image[row,col,c]=255-pv  #修改它的顏色顯示
16     cv.imshow("hhhh",image)
17 def creat_image():
18     img = np.zeros([400,400,3],np.uint8)  #全zeros時 創建一個圖片,高為400,寬為400,三個色彩通道矩陣圖像    類型為uint8,這個時候我們還沒有對圖片進行顏色改變
19     cv.imshow("new_img", img)
20 
21 
22 src=cv.imread("D:\hh.JPG")   #blue green red 色彩通道,這是基本的色彩構成,后面會學到  0:表示黑色   255:表示白色
23 
24 cv.namedWindow('input image',0)
25 cv.imshow('input image',src)
26 t1=cv.getTickCount() #獲取當前cpu轉動的時間
27 #access_piexls(src)
28 creat_image()
29 t2=cv.getTickCount()
30 print("time : %s ms" %((t2-t1)/cv.getTickFrequency()*1000))  #計算走了多少秒
31 cv.waitKey(-1)
32 cv.destoryAllWindows()

最終效果是一張黑色的照片:

       

   3、接下來我們把這張新建的黑色照片,對它進行顏色操作,把它改成blue,也就是對顏色第一顏色通道進行多維數組操作(當然你也可以對其兩個顏色通道進行修改):

    

 1 import cv2 as cv
 2 import numpy as np
 3 
 4 
 5 def access_piexls(image):
 6     print(image.shape)  #獲取圖像的形狀大小
 7     height=image.shape[0] #圖像的第一維度高度
 8     width=image.shape[1] #圖像的第二維度寬度
 9     channels=image.shape[2] #圖像的第三維度通道數
10     print("height : %s , width :%s , channels: %s"%(height,width,channels))
11     for row in range(height):
12         for col in range(width):
13             for c in range(channels):
14                 pv=image[row,col,c] #一個三維數組,來獲取每個維度的值
15                 image[row,col,c]=255-pv  #修改它的顏色顯示
16     cv.imshow("hhhh",image)
17 def creat_image():
18     img = np.zeros([400,400,3],np.uint8)  #全zeros時 創建一個圖片,高為400,寬為400,三個色彩通道矩陣圖像    類型為uint8,這個時候我們還沒有對圖片進行顏色改變
19     img[: , : , 0]=np.ones([400,400])*255  #修改第一通道的顏色為blue  對第一個顏色通道操作
20     cv.imshow("new_img", img)
21 
22 
23 src=cv.imread("D:\hh.JPG")   #blue green red 色彩通道,這是基本的色彩構成,后面會學到  0:表示黑色   255:表示白色
24 
25 cv.namedWindow('input image',0)
26 cv.imshow('input image',src)
27 t1=cv.getTickCount() #獲取當前cpu轉動的時間
28 #access_piexls(src)
29 creat_image()
30 t2=cv.getTickCount()
31 print("time : %s ms" %((t2-t1)/cv.getTickFrequency()*1000))  #計算走了多少秒
32 cv.waitKey(-1)
33 cv.destoryAllWindows()

    

      4、單通道操作,更加簡單:

 1 import cv2 as cv
 2 import numpy as np
 3 
 4 def creat_image():
 5     img = np.ones([400,400,3],np.uint8)
 6     img=img * 0
 7     cv.imshow("new_img", img)
 8 
 9 cv.waitKey(-1)
10 cv.destoryAllWindows()

 5、填充操作(當我們把創建的圖片大小取小一點的話,我可以用fill(進行填充操作):

        

 1 import cv2 as cv
 2 import numpy as np
 3 
 4 def creat_image():
 5     m1 = np.ones([3,3],np.uint8)
 6     m1.fill(122)
 7     print(m1)
 8 
 9     m2=m1.reshape([1,9])  #把一行分為9列
10     print(m2)
11 
12 
13 
14 
15 
16 src=cv.imread("D:\hh.JPG")   #blue green red 色彩通道,這是基本的色彩構成,后面會學到  0:表示黑色   255:表示白色
17 
18 cv.namedWindow('input image',0)
19 cv.imshow('input image',src)
20 t1=cv.getTickCount() #獲取當前cpu轉動的時間
21 #access_piexls(src)
22 creat_image()
23 t2=cv.getTickCount()
24 print("time : %s ms" %((t2-t1)/cv.getTickFrequency()*1000))  #計算走了多少秒
25 cv.waitKey(-1)
26 cv.destoryAllWindows()

   6、接下來用bitwise_not()函數實現像素取反,這樣操作后讀取照片的時間就非常快了:

    

 1 import cv2 as cv
 2 import numpy as np
 3 #進行像素取反操作,可以使讀取照片的速度加快
 4 
 5 def inverse(img):
 6     dst=cv.bitwise_not(img)
 7     cv.imshow("取反",dst)
 8 src=cv.imread("D:\hh.JPG")   #blue green red 色彩通道,這是基本的色彩構成,后面會學到  0:表示黑色   255:表示白色
 9 
10 cv.namedWindow('input image',0)
11 cv.imshow('input image',src)
12 t1=cv.getTickCount() #獲取當前cpu轉動的時間
13 #access_piexls(src)
14 inverse(src)
15 t2=cv.getTickCount()
16 print("time : %s ms" %((t2-t1)/cv.getTickFrequency()*1000))  #計算走了多少秒
17 cv.waitKey(-1)
18 cv.destoryAllWindows()

    以上就是今天所學的東西了,就分享到這里了,睡覺了,現在是凌晨12:36,。

 


免責聲明!

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



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