一,PIL(Python Imaging Library Python,圖像處理類庫)提供了通用的圖像處理功能,以及大量有用的基本圖像操作,比如圖像縮放、裁剪、旋轉、顏色轉換等。利用 PIL 中的函數,我們可以從大多數圖像格式的文件中讀取數據,然后寫入最常見的圖像格式文件中。PIL 中最重要的模塊為 Image。
我們處理數學運算、繪制圖表,或者在圖像上繪制點、直線和曲線時,Matplotlib是個很好的類庫,具有比 PIL 更強大的繪圖功能。Matplotlib 可以繪制出高質量的圖表,就像本書中的許多插圖一樣。Matplotlib 中的 PyLab 接口包含很多方便用戶創建圖像的函數。
我們處理數學運算、繪制圖表,或者在圖像上繪制點、直線和曲線時,Matplotlib是個很好的類庫,具有比 PIL 更強大的繪圖功能。Matplotlib 可以繪制出高質量的圖表,就像本書中的許多插圖一樣。Matplotlib 中的 PyLab 接口包含很多方便用戶創建圖像的函數。
NumPy是非常有名的 Python 科學計算工具包,其中包含了大量有用的思想,比如數組對象(用來表示向量、矩陣、圖像等)以及線性代數函數。NumPy 中的數組對象可以幫助你實現數組中重要的操作,比如矩陣乘積、轉置、解方程系統、向量乘積和歸一化,這為圖像變形、對變化進行建模、圖像分類、圖像聚類等提供了基礎。
二,直方圖
圖像的直方圖用來表征該圖像像素值的分布情況。用一定數目的小區間(bin)來指定表征像素值的范圍,每個小區間會得到落入該小區間表示范圍的像素數目。圖像的直方圖可以使用 hist() 函數繪制。hist() 函數的第二個參數指定小區間的數目。需要注意的是,因為 hist() 只接受一維數組作為輸入,所以我們在繪制圖像直方圖之前,必須先對圖像進行壓平處理。flatten() 方法將任意數組按照行優先准則轉換成一維數組。
代碼如下:
1 from PIL import Image 2 from pylab import * 3 #讀取圖像到數組 4 im=array(Image.open('11.JPG').convert('L')) 5 #新建一個圖像 6 figure() 7 #不使用顏色信息 8 gray() 9 #在原點的左上角顯示輪廓圖像 10 contour(im,origin='image') 11 axis('equal') 12 axis('off') 13 figure() 14 hist(im.flatten(),128) 15 show()
效果:
原圖
輪廓圖
直方圖
三,高斯濾波
高斯濾波是對整幅圖像進行加權平均的過程,每一個像素點的值,都由其本身和鄰域內的其他像素值經過加權平均后得到。其濾波核的值由如下公式得到(用當前點與中心點的歐式距離的平方代替下面的
(x2+y2):
代碼如下:
1 import cv2 2 import numpy as np 3 import matplotlib.pyplot as plt 4 5 #讀取圖片 6 img = cv2.imread('11.JPG') 7 source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) 8 9 #高斯濾波,這里使用15*15的卷積核 10 result = cv2.GaussianBlur(source, (15,15), 0) 11 12 #顯示圖形 13 titles = ['Source Image', 'GaussianBlur Image'] 14 images = [source, result] 15 for i in range(2): 16 plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray') 17 plt.title(titles[i]) 18 plt.xticks([]),plt.yticks([]) 19 plt.show()
效果:
四,直方圖均衡化
圖像灰度變換中一個非常有用的例子就是直方圖均衡化。直方圖均衡化是指將一幅圖像的灰度直方圖變平,使變換后的圖像中每個灰度值的分布概率都相同。在對圖像做進一步處理之前,直方圖均衡化通常是對圖像灰度值進行歸一化的一個非常好的方法,並且可以增強圖像的對比度。在這種情況下,直方圖均衡化的變換函數是圖像中像素值的累積分布函數(cumulative distribution function,簡寫為 cdf,將像素值的范圍映射到目標范圍的歸一化操作)。
代碼:
1 import cv2 # 僅用於讀取圖像矩陣 2 import matplotlib.pyplot as plt 3 import numpy as np 4 from PIL import Image 5 gray_level = 256 # 灰度級 6 7 8 def pixel_probability(img): 9 """ 10 計算像素值出現概率 11 :param img: 12 :return: 13 """ 14 assert isinstance(img, np.ndarray) 15 16 prob = np.zeros(shape=(256)) 17 18 for rv in img: 19 for cv in rv: 20 prob[cv] += 1 21 22 r, c = img.shape 23 prob = prob / (r * c) 24 25 return prob 26 27 28 def probability_to_histogram(img, prob): 29 """ 30 根據像素概率將原始圖像直方圖均衡化 31 :param img: 32 :param prob: 33 :return: 直方圖均衡化后的圖像 34 """ 35 prob = np.cumsum(prob) # 累計概率 36 37 img_map = [int(i * prob[i]) for i in range(256)] # 像素值映射 38 39 # 像素值替換 40 assert isinstance(img, np.ndarray) 41 r, c = img.shape 42 for ri in range(r): 43 for ci in range(c): 44 img[ri, ci] = img_map[img[ri, ci]] 45 46 return img 47 48 49 def plot(y, name): 50 """ 51 畫直方圖,len(y)==gray_level 52 :param y: 概率值 53 :param name: 54 :return: 55 """ 56 plt.figure(num=name) 57 plt.bar([i for i in range(gray_level)], y, width=1) 58 59 60 if __name__ == '__main__': 61 62 img=Image.open('11.jpg') 63 img=img.convert('L') 64 img.save('111.jpg') 65 img = cv2.imread("111.jpg", 0) # 讀取灰度圖 66 67 prob = pixel_probability(img) 68 plot(prob, "原圖直方圖") 69 70 # 直方圖均衡化 71 img = probability_to_histogram(img, prob) 72 cv2.imwrite("source_hist.jpg", img) # 保存圖像 73 74 prob = pixel_probability(img) 75 plot(prob, "直方圖均衡化結果") 76 77 plt.show()
效果:
灰度圖
均衡化后的圖
直方圖
直方圖均衡化
結論:
剛接觸Python,對其還不太了解,掌握圖像的處理是為接下來的功能實現作基礎,希望自己加油。