1. 程式人生 > >數字影象處理(二)

數字影象處理(二)

今天花了一點時間實現了,對一幅灰度影象進行直方圖均衡化處理

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()

執行結果:

程式碼上已經附上很詳細的註解了,最後我主要再把思路順一順。在處理這個問題時,我們做的第一步便是把圖片匯入,然後對圖片進行一系列處理,比如:把它變成我們需要的灰度圖,轉成我們所需要的矩陣(包括一維,二維),最後便是根據公式進行直方圖均衡化處理。程式碼中有些冗餘的程式碼我是用來測試的,一併貼上去了,大家可以好好看看也可以忽略。