數字影象處理(二)
阿新 • • 發佈:2018-12-23
今天花了一點時間實現了,對一幅灰度影象進行直方圖均衡化處理
import numpy as np from PIL import Image import matplotlib.pyplot as plt from pylab import * #輸入一張圖片並且轉成一張灰度影象 src=Image.open('G:/實驗室學習資料/數字影象處理/lab1/1_1.jpg').convert('L') img=np.array(src) arr=img.flatten() #顯示影象 src.show() data = src.getdata() data = np.matrix(data) print(data) #print("新影象") data = np.reshape(data,(228,300)) print(data) new_im = Image.fromarray(data) # 顯示圖片 new_im.show() #開闢新的空間,存放結果影象 result=np.zeros((228,300)) #繪製原始直方圖 subplot(231) plt.hist(arr,bins=256,normed=True,facecolor='blue',alpha=0.75) #計算影象直方圖(每個bins陣列的區間值對應一個imhist陣列中的強度值) imhist,bins = histogram(arr,256,normed=True) #計算累計分佈函式 cdf=imhist.cumsum() #累計函式歸一化(由0~1變換至0~255) cdf = cdf*255/cdf[-1] #繪製累計分佈函式 subplot(232) plot(bins[:256],cdf) #依次對每一個灰度影象素值(強度值)使用cdf進行線性插值,計算其新的強度值 #interp(x,xp,yp) 輸入原函式的一系列點(xp,yp),使用線性插值方法模擬函式並計算f(x) im2 = interp(arr,bins[:256],cdf) #將壓平的影象陣列重新變成二維陣列 im2 = im2.reshape(arr.shape) # 顯示均衡化之後的直方圖影象 subplot(233) hist(im2.flatten(),256) #顯示原始影象 gray() subplot(234) imshow(data) #顯示變換後圖像 subplot(236) imshow(im2.reshape((228,300))) plt.show()
執行結果:
程式碼上已經附上很詳細的註解了,最後我主要再把思路順一順。在處理這個問題時,我們做的第一步便是把圖片匯入,然後對圖片進行一系列處理,比如:把它變成我們需要的灰度圖,轉成我們所需要的矩陣(包括一維,二維),最後便是根據公式進行直方圖均衡化處理。程式碼中有些冗餘的程式碼我是用來測試的,一併貼上去了,大家可以好好看看也可以忽略。