1. 程式人生 > 其它 >python繪圖種原理介紹及應用

python繪圖種原理介紹及應用

valid卷積

在full卷積的卷積過程中,會遇到KflipKflip靠近I的邊界(K矩陣與I矩陣),就會有部分延申到I之外,這時候忽略邊界,只考慮I完全覆蓋KflipKflip內的值情況,這個的過程就是valid卷積。一個高為H1,寬為W1的矩陣I與高為H2,寬為W2的矩陣K,在H1大於等於H2,W1大於等於W2的情況下,valid卷積的結果就是一個(H1-H2+1)*(W-W+1)的矩陣CvalidCvalid。

  CvalidCfullCvalid=Cfull(Rect(W21,H21,W1W2+1,H1H2+1))

same卷積

無論是full卷積還是valid卷積都不會得到正好的尺寸,要麼比原尺寸大要麼比原尺寸小,這時就需要same卷積來解決這個問題。若想得到寬和高都正好的矩陣我們首先需要給

KflipKflip一個錨點,將錨點放在(迴圈)影象矩陣的(r,c)處,((r,c)在矩陣之內),將對應位置的元素逐個相乘,最終將所有的積進行求和作為輸出影象矩陣在(r,c)處的輸出值。這個過程稱為same卷積。
OpenCv函式copyMakeBorder的引數表

引數 解釋
src 輸入矩陣
dst 輸出矩陣
top 上側擴充的行數
bottom 下側擴充的行數
left 左側擴充的行數
right 右側擴充的行數
borderType 邊界擴充的型別
value border Type= BORDER_CONSTANT事的常數
其中borderType有多種型別,比如:BORDER_REPLICATE(邊界複製)、BORDER_CONSTANT(常數擴充)、BORDER_REFLECT(反射擴充)等。  
在使用Python進行卷積操作時用到包Scipy,其中有關的操作函式為convolve2d(in1,in2,mode='full',boundary='fill',fillvalue=0)  
引數 解釋
-- --
in1 輸入陣列
in2 輸入陣列,代表K(卷積運算元)
mode 卷積型別,也就是以上提到的三種類型:full,valid,same
boundary 邊界填充:fill\wrap\symm
fillvalue 當boundary='fill'時,設定邊界填充的值,預設為0
在這裡需要注意的是當model為same時卷積運算元的錨點位置由不同尺寸而不同,假設K(卷積運算元)的寬和高分別為W、H。  
W和H的值 錨點位置
-- --
均為奇數 預設為中心點
H為偶數、W為奇數 (H-1,(W-1)/2)
H為奇數,W為偶數 ((H-1)/2,W-1)
均為偶數 (H-1,W-1)

程式碼實現:

import numpy as np
from scipy import signal

if __name__ == "__main__":

    I = np.array([[1,2],[3,4],np.float32])
    #I的高和寬
    H1,W1 = I.shape[:2]
    #卷積運算元
    k = np.array([[-1,-2],[2,1],np.float32])
    #K的寬和高
    H2,W2 = k.shape[:2]
    #計算full卷積
    c_full = signal.convolve2d(I,k,mode='full')
    #設定錨點
    r,c = 0,0
    #根據錨點來從full卷積中擷取same卷積
    c_same= c_full[H2-r-1:H1-r-1,W2-c-1:W1+W2-c-1]

 影象數字化:

我們平時使用PS或者其它影象處理的軟體開啟一個要處理的影象,當我們將影象放大得足夠大的時候我們會發現很多個灰度程度不同的小方格,每個方格就相當於一個畫素,水平方向的方格數代表這個影象的畫素寬度(通常在影象的屬性資訊中可以檢視到影象以畫素為單位的寬度),同樣垂直方向上的方格的個數代表影象的畫素高度。計算機會將每個方格化為一個數值- “位深度”,是將一個方格化為[0,255]之間的一個uchar型別的數字,用256個數來表示灰度的深淺(0代表黑色,256代表白色),值越小越灰,反之越大越接近白色,就越亮。總之對於計算機數字影象的處理就是對影象矩陣的操作。
利用imread的Python API ,可以將灰度影象轉化成都ndarry型別,例項如下:

import cv2
import numpy as np  
#讀入原始影象
img=cv2.imread('j1.jpg',cv2.IMREAD_GRAYSCALE)
#灰度化處理
cv2.imshow("1",img);
cv2.waitKey(0)

在OpenCV3.X版本中對應的引數是:

 

引數 OpenCV3.x的解釋
filename 影象的檔名,可以包含路徑
flags IMREAD_COLOR: 彩色影象;IMREAD_GRAYSCALE:灰色影象;IMREAD_ANYCOLOR:任意影象
我使用的編輯工具是Anaconda2的Spyder編輯器,正常情況下會有一定的程式碼提示,當忘記完整的引數時可以根據提示來補全。  
對於影象的灰度化也可以使用cv2.cvtColor()函式進行顏色轉換 例如影象灰度化:  
`  
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  

 

彩色影象數字化

對彩色影象的理解和對灰色影象的理解上相似,灰色影象的每一個畫素都是有一個數組量化的,二彩色影象的每一個畫素都是由三個數字組成的向量量化的,最常用的就是用R,G,B三個分量來量化的,這三個元素的值分別代表三種基色:Red、Green、Blue的亮度。假設每種基色的數值量化成m=2的n次方,如同8為灰度影象一樣,將灰度量化成2的8次方=256個數。RGB影象的紅綠藍三個通道的影象都是一張8點陣圖,因此顏色的總數是256的3次方=16777216,如(0,0,0)代表黑色,(255,255,255)代表白色,(255,0,0)代表紅色,(0,0,255)代表藍色。
下面將RGB彩色圖轉換為三維的ndarray,程式碼如下:

import cv2
import numpy as np
import sys

#讀入原始影象
image=cv2.imread('j1.jpg',cv2.IMREAD_COLOR)
#得到三個顏色通道
b = image[:,:,0]
g = image[:,:,1]
r = image[:,:,2]
#顯示三個顏色通道
cv2.imshow('b',b)
cv2.imshow('g',g)
cv2.imshow('r',r)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.cvtColor()函式應用變化

cv2.cvtColor()函式能夠實現多種變化。首先,影象處理中有多種色彩空間,例如 RGB、HLS、HSV、HSB、YCrCb、CIE XYZ、CIE Lab 等。下面對平常用到的顏色空間進行簡單介紹:

    • RGB (Red 紅色,Green 綠色,Blue 藍色),可用於表示大部分顏色,也是影象處理中最基本、最常用、面向硬體的顏色空間,是一種光混合的體系.
    • LAB (L 亮度,A 綠色到紅色的分量, B 藍色到黃色的分量)顏色空間由一個亮度通道和兩個顏色通道組成的。LAB 相較於RGB與CMYK等顏色空間更符合人類視覺,也更容易調整:想要調節亮度,就調節L 通道,想要調節只色彩平衡就分別調 A 和 B。L 越大,亮度越高(L為0時是黑色),A 和 B 為0時都代表灰色,在實際應用中常常將顏色通道的範圍[-100, +100]或[-128, 127]之間。
    • HSI (H 色相,S 飽和度,I 亮度) HSI顏色模式中的色調使用顏色類別表示,飽和度與顏色的白光光亮亮度剛好成反比,代表灰色與色調的比例,亮度是顏色的相對明暗程度.
      下面是一個綜合運用的例項:
      from matplotlib import pyplot as plt
      import cv2
      
      img_BGR = cv2.imread('j1.jpg') # BGR 
      plt.subplot(3,3,1)
      plt.imshow(img_BGR);plt.axis('off');plt.title('BGR')
      
      img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB)
      plt.subplot(3,3,2)
      plt.imshow(img_RGB);plt.axis('off');plt.title('RGB')
          
      img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY)
      plt.subplot(3,3,3);
      plt.imshow(img_GRAY);plt.axis('off');plt.title('GRAY')
          
      img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV)
      plt.subplot(3,3,4)
      plt.imshow(img_HSV);plt.axis('off');plt.title('HSV')
          
      img_YcrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb)
      plt.subplot(3,3,5)
      plt.imshow(img_YcrCb);plt.axis('off');plt.title('YcrCb')
          
      img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS)
      plt.subplot(3,3,6)
      plt.imshow(img_HLS);plt.axis('off');plt.title('HLS')
          
      img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ)
      plt.subplot(3,3,7)
      plt.imshow(img_XYZ);plt.axis('off');plt.title('XYZ')
          
      img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB)
      plt.subplot(3,3,8)
      plt.imshow(img_LAB);plt.axis('off');plt.title('LAB')
          
      img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV)
      plt.subplot(3,3,9)
      plt.imshow(img_YUV);plt.axis('off');plt.title('YUV')
      plt.show()