Steven5538

Histogram Equalization and Edge Detection

Word count: 506Reading time: 2 min
2014/03/26 Share

Histogram Equalization 

直方圖均化(Histogram Equalization),屬於影像增強的技術之一,在某些情況下我們可能會需要提高影像的品質,使影像的細節或特徵更加明顯,其中一種方法便是對影像亮度的分布進行改變,直方圖均化便是其中之一。
直方圖等化使用機率分佈,將原先的亮度分布重新均勻的等化到新的亮度值。可參考公式如下。



這樣講或許有點抽象,直接看結果。

右為直方圖均化前,左為均化後,可以看出細節較為明顯,用統計圖來看的話,可以明顯看出所謂的亮度均分。

核心程式碼不難,直接實作公式。

1
2
3
4
5
6
7
for x in range(0 , len(histogram) , 256):
h = reduce(operator.add , histogram[x:x + 256]) / 255

n = 0
for y in range(0 , 256):
new_im.append(n / h)
n = n + histogram[x + y]

Edge Detection
Edge Detection(邊緣偵測),目的是標識圖像中亮度變化明顯的點,而 Sobel Operators 便是其中一種方式,它是一離散性差分算子,用來運算圖像亮度函數的梯度之近似值。在圖像的任何一點使用此算子,將會產生對應的梯度矢量或是其法矢量。
算子如下:

圖像中任一像素用以下公式結合,計算梯度大小。

然後再用以下公式計算梯度方向。

在實作上可以省略最後一個公式直接得出圖像,核心程式碼直接實作到第二條公式即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
dx = [-1,  0,  1, -2, 0, 2, -1, 0, 1]
dy = [-1, -2, -1, 0, 0, 0, 1, 2, 1]

width , height = im.size

pix = im.load()
new_im = Image.new('L' , (width , height))
new_pix = new_im.load()

tx = [0] * 9
ty = [0] * 9

for x in range(1 , height - 1):
for y in range(1 , width - 1):
for i in range(0 , 3):
for j in range(0 , 3):
tx[i * 3 + j] = pix[y - 1 + j , x - 1 + i] * dx[i * 3 + j]
ty[i * 3 + j] = pix[y - 1 + j , x - 1 + i] * dy[i * 3 + j]

new_pix[y , x] = abs(sum(tx)) + abs(sum(ty))

結果如下圖所示。

CATALOG