Python_OpenCV_實現模糊集合用於圖像增強(對比度提升,空間濾波)


本文部分內容來自:
https://blog.csdn.net/qq_37764129/article/details/82893966
模糊集的詳細原理請看岡薩雷斯的數字圖像處理教程,這里不再詳細贅述。
下面將模糊集用於圖像增強的步驟羅列如下:
使用模糊集合來進行灰度變換,從而增強圖像。首先可以在常理下考慮一下,一般的對於動態范圍較小的圖像,我們一般的處理的方法是灰度拉升,或者直方圖均衡。

這兩種的方法的本質就是,讓原圖較暗的像素更加暗,讓原圖較亮的像素更加亮。那么,我們規定如下模糊規則
R1:IF 一個像素是暗的,THEN 讓這個像素更暗;
R2:IF 一個像素是灰的,THEN 讓他保持是灰的;
R3:IF 一個像素是亮的,THEN 讓這個像素更亮;
這個規則就代表了我們的處理方法。當然,IF條件中的像素是暗的(或者灰的,或者是亮的),這個概念都是模糊的。同理THEN結論中的更暗(或者保持灰的,或者更亮)亦是模糊的。為此,我們需要確立一個隸屬度函數,從而來判斷一個像素對於三個條件的隸屬度。

實際上,隸屬度函數的確定是很復雜的,然而,這里我們則盡量想得簡單一點。首先,一個像素是暗的(模糊),那么其隸屬度函數大致的形狀是,

在低於某個值的時候域隸屬度為1,
在灰度越過某一個值之后,其隸屬度為0,
當然。然后與之間進行線性插值,那么,我們就可以得到R1的隸屬度函數了。同理,R2與R3也是一樣的。
為了簡單起見,我們將THEN結論中的更暗設置為較為簡單的函數。

為了讓這個像素更黑,其輸出都為0。同理,
為了使這個像素保持灰的,我們將其輸出設為0.5,
為了使得一個像素更亮,我們將其設置為1。
根據以上討論,我們所決定的隸屬度函數如下所示。

 

 

使用輸入的隸屬度函數,可以得到模糊化后的數據。
對於一個像素Z0,需要根據規則R1,R2與R3,計算出Z0所對應的隸屬度Udark(Z0),Ugray(Z0),Ubright(Z0),這個過程,稱之為模糊化。將一個輸入量模糊化,所使用的函數(或者說是對應關系),稱之為知識庫。
模糊化之后,得到一個像素所對應的三個隸屬度Udark(Z0),Ugray(Z0),Ubright(Z0)之后,就可以進行反模糊化了。反模糊化的算法很多,這里使用簡單的重心法去進行計算。
V0={Udark(Z0)*Vd+Ugray(Z0)*Vg+Ubright(Z0)*Vb}/{Udark(Z0)+Ugray(Z0)+Ubright(Z0)}
其中Vd,Vg,Vb為輸出的單一值,對於一個像素Z0,需要根據規則R1,R2與R3,計算出Z0所對應的隸屬度Udark(Z0),Ugray(Z0),Ubright(Z0)。得到一個權值衡量后的成熟度估計值,為輸出值。到此,就得到了輸出V0,整個算法的效果如下圖所示。

 

 可以看到愛因斯坦的照片的對比度得到了很大的提升,以下為對應的直方圖,可以看到直方圖分布變得更加寬闊,而且輸出圖像的直方圖更加偏向暗部。但是如果使用直方圖均衡化,圖像會變得白的更白,黑的更黑。

 

 以下為PythonOpencv代碼實現:

import cv2 as cv
import matplotlib.pyplot as plt

def exchange(image):
    image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    for row in range(0,image.shape[0]):
        for col in range(0,image.shape[1]):
            m=image[row][col]/255.00
            if m<=0.2700:
                image[row][col]=0
            elif m>0.2700 and m<=0.5000:
                image[row][col]=(m-0.27)/0.23*127
            elif m>0.5000 and m<=0.7200:
                image[row][col]=(m-0.5)/0.22*255+(0.72-m)/0.22*127
            else:
                image[row][col]=255

    cv.imshow('dst',image)

src= cv.imread('C:/Python/OpenCV/a.jpg')
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.imshow('src',gray)
exchange(src)
cv.waitKey(0)

這里是以0.27 0.72 作為臨界點的,如果讀者感興趣可以修改上述臨界值,會看到更多效果。
讀者也可以將原圖的直方圖均衡化的結果圖像輸出,與模糊集的結果對比下。
未完待續。


————————————————
版權聲明:本文為CSDN博主「/我愛西紅柿炒雞蛋/」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/m0_47472749/article/details/114556420

 


免責聲明!

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



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