Python圖像處理--直方圖,高斯濾波,直方圖均衡化


一,PIL(Python Imaging Library Python,圖像處理類庫)提供了通用的圖像處理功能,以及大量有用的基本圖像操作,比如圖像縮放、裁剪、旋轉、顏色轉換等。利用 PIL 中的函數,我們可以從大多數圖像格式的文件中讀取數據,然后寫入最常見的圖像格式文件中。PIL 中最重要的模塊為 Image。
  我們處理數學運算、繪制圖表,或者在圖像上繪制點、直線和曲線時,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,對其還不太了解,掌握圖像的處理是為接下來的功能實現作基礎,希望自己加油。

 


免責聲明!

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



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