在計算機編程的時候,常常會使用一種“干脆的”集合。在判斷某件事,或者某個變量的時候,常常使用的是布爾值(因為某件事,不是真就是假)。通過一個閾值,去判斷這件事,而這樣的一個閾值的設定,會產(chǎn)生一個問題。還是使用《Digital Image Processing》 Rafael C. Gonzalez / Richard E. Woods書中的例子,看以下兩個圖。
當一個人的年齡超過20歲,那么這個人就不再屬于年輕人范疇。這樣來說,未免有些太過“殘忍”,畢竟,20多歲的人還是“比較”年輕的。這里就出現(xiàn)了一個模糊的定義,“比較”年輕,這個集合既不屬于年輕,也不屬于非年輕,也就是其實年輕與非年輕之間的過度不應該是干脆的,而應該是漸進的過度。
定義Z為對象集,其中,z表示Z中的一類元素(比如z表示年齡)。Z中的一個模糊集合A主要由一個隸屬度(Degree of membership)
當
下面,還有幾個重要的性質(zhì)。
對于所有的
對于所有的
對于所有的
到這里,其實已經(jīng)可以用模糊集合來做一些事情了。對于一個問題的處理,在使用模糊集合來解決的時候,我們可以參考以下步驟。首先,需要將輸入量折算為隸屬度,這個過程叫做“模糊化”。然后,使用得到的隸屬度來進行計算,或者判斷,或者其他更復雜的算法。最后,需要將隸屬度再次折算為輸出,這個過程稱為“去模糊”或者“反模糊”。
通過下面兩個例子,來具體體會一下模糊算法在圖像處理上的運用。
使用模糊集合來進行灰度變換,從而增強圖像。首先可以在常理下考慮一下,一般的對于動態(tài)范圍較小的圖像,我們一般的處理的方法是灰度拉升,或者直方圖均衡。這兩種的方法的本質(zhì)就是,讓原圖較暗的像素更加暗,讓原圖較亮的像素更加亮。那么,我們規(guī)定如下模糊規(guī)則
R1:IF 一個像素是暗的,THEN 讓這個像素更暗;
R2:IF 一個像素是灰的,THEN 讓他保持是灰的;
R3:IF 一個像素是亮的,THEN 讓這個像素更亮;
這個規(guī)則就代表了我們的處理方法。當然,IF條件中的像素是暗的(或者灰的,或者是亮的),這個概念都是模糊的。同理THEN結(jié)論中的更暗(或者保持灰的,或者更亮)亦是模糊的。為此,我們需要確立一個隸屬度函數(shù),從而來判斷一個像素對于三個條件的隸屬度。
實際上,隸屬度函數(shù)的確定是很復雜的,然而,這里我們則盡量想得簡單一點。首先,一個像素是暗的(模糊),那么其隸屬度函數(shù)大致的形狀是,在低于某個值
為了簡單起見,我們將THEN結(jié)論中的更暗設置為較為簡單的函數(shù)。為了讓這個像素更黑,其輸出都為0。同理,為了使這個像素保持灰的,我們將其輸出設為0.5,為了使得一個像素更亮,我們將其設置為1。
根據(jù)以上討論,我們所決定的隸屬度函數(shù)如下所示。
使用輸入的隸屬度函數(shù),可以得到模糊化后的數(shù)據(jù)。對于一個像素
模糊化之后,得到一個像素所對應的三個隸屬度
到此,就得到了輸出
根據(jù)以上算法,所得到的結(jié)果還是比較理想的。從灰度直方圖來看,處理后的圖像的直方圖的動態(tài)范圍得到了擴展,所得的圖像也比原圖更加的明亮清晰,圖片的一些細節(jié)處理的較為妥當。所使用的Matlab代碼如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
|
為了更深刻的理解模糊集合的性質(zhì),可以將規(guī)則的難度加深一些。若想進行一幅圖像的邊緣檢測,在空間域上的想法是:“如果一個像素是處在平滑區(qū)域的,那么使得這個像素為亮,否則,則使得這個像素為暗。”為了使得這個算法在模糊集合的概念可以用,我們可以考慮使用灰度差來表示像素的平滑程度。
如上圖所示,我們將一個像素8個相鄰的像素,各減去這個像素的值,即
注意,上述的zero,white與black都是模糊的概念。同樣的,根據(jù)這三個規(guī)則模糊化之后,用重心法去模糊。同時,我們還希望,當兩個點的灰度很接近的時候,去模糊能給予一個很強的響應,將灰度拉至很高(很亮)。所以,我們的輸入隸屬度函數(shù)需要再0處有一個較大的隸屬度,這里,我使用了高斯分布的一部分。其輸出隸屬度函數(shù),也不是像上面的例子一樣簡單,我希望若是白色的隸屬度很高,其輸出的灰度值就越高(越亮),反之則越低(越暗)。根據(jù)上述,我指定的輸入輸出隸屬度函數(shù)如下所示。
以上規(guī)則還出現(xiàn)了幾個比較需要注意的地方。我們制定規(guī)則的時候,使用了AND,將兩個條件相連了。這里在模糊集合里面,就相當于兩個模糊集合的交集。首先,應該依次算出兩個條件所對應的隸屬度的值,然后,取最小值即可,如下所示。
其次,這里還出現(xiàn)了ELSE語句,這里,可以視為以上四個條件的補集的交集(有點拗口)。其實看數(shù)學式的話,應該很好明白的。
到這里,我們就可以順利的算出上述五個條件的隸屬度,然后同樣的,使用最簡單的重心法,就可以得到結(jié)果了。結(jié)果如下所示。
從結(jié)果可以看出來,根據(jù)整定的規(guī)則,我們已經(jīng)很好的得到了圖像的邊緣。在這幅圖像上再次進行加工,二值化什么的,就比較容易了。所得到的結(jié)果圖像還是比較清晰的。以下是Matlab代碼。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
|
(作者注:其實模糊算法是很復雜的一門學科,《Digital Image Processing》 Rafael C. Gonzalez / Richard E. Woods這本書上講的還是太過簡單了,僅僅也只是算皮毛而已,對于模糊算法還沒有一個清晰的認識。殘留下來了幾個問題:①隸屬度函數(shù)的制定有什么樣的原則?②我們再使用模糊算法之前,希望得到一個什么樣的結(jié)果,而實際得到的結(jié)果又怎么樣去評估這個算法的好壞呢?③其他的反模糊算法與重心法的區(qū)別是什么?這些問題還有待深入的研究)