Python圖像處理之圖像清晰度評(píng)價(jià)
0、實(shí)現(xiàn)效果
能夠通過一張標(biāo)準(zhǔn)圖,對(duì)同一組相機(jī)拍攝的照片進(jìn)行清晰度評(píng)價(jià)。
1、概述
圖像清晰度是用來指導(dǎo)調(diào)焦機(jī)構(gòu)找到正焦位置的評(píng)價(jià)函數(shù)。理想的清晰度評(píng)價(jià)曲線類似于泊松分布,請看下圖:

p點(diǎn)對(duì)應(yīng)于正焦位置,P1 和P2 為正焦位置焦前和焦后采集到圖像的清晰度評(píng)價(jià)結(jié)果。
正焦的圖像比模糊的離焦圖像邊緣要更加的銳利清晰,相應(yīng)的邊緣像素灰度值變化大,因而會(huì)有更大的梯度值,從數(shù)學(xué)的角度來看圖像,它是二維的離散矩陣,利用梯度函數(shù)可獲取圖像的灰度信息,來判別圖像的清晰度,在離散信中梯度表現(xiàn)為差分形式。
2、模糊度分類
1、運(yùn)動(dòng)模糊
運(yùn)動(dòng)模糊是在捕獲圖像時(shí),快門在打開時(shí)間內(nèi)成像系統(tǒng)和拍攝 對(duì)象的短暫相對(duì)運(yùn)動(dòng),造成成像在某個(gè)方向上形成的模糊。
2、壓縮模糊
壓縮模糊是圖像在進(jìn)行有損壓縮丟失部分信息。
3、高斯模糊
高斯模糊是人為引入的一種模糊,使用高斯低通濾波器對(duì)原始圖像進(jìn)行濾波得到的。
3、清晰度量化指標(biāo)
Brenner
Brenner梯度函數(shù)是最簡單的梯度評(píng)價(jià)函數(shù),它只是簡單的計(jì)算相鄰兩個(gè)像素灰度差的平方,該函數(shù)定義如下:

f(x,y) 表示圖像f對(duì)應(yīng)像素點(diǎn)(x,y)的灰度值,D(f)為圖像清晰度計(jì)算結(jié)果。
python實(shí)現(xiàn):
def brenner(img):
'''
:param img:narray 二維灰度圖像
:return: int 圖像越清晰越大
'''
shapes = np.shape(img)
output = 0
for x in range(0, shapes[0]-2):
for y in range(0, shapes[1]):
output+=(int(img[x+2,y])-int(img[x,y]))**2
return output
能量梯度函數(shù)(Energy of Gradient)
將 x 方向和 y 方向的相鄰像素的灰度值之差的平方和作為每個(gè)像素點(diǎn)的梯度值,對(duì)所有像素梯度值累加作為清晰度評(píng)價(jià)函數(shù)值,表達(dá)式如下所示:

python實(shí)現(xiàn):
def EOG(img):
'''
:param img:narray 二維灰度圖像
:return: int 圖像越清晰越大
'''
shapes = np.shape(img)
output = 0
for x in range(0, shapes[0]-1):
for y in range(0, shapes[1]-1):
output+=((int(img[x+1,y])-int(img[x,y]))**2+(int(img[x,y+1])-int(img[x,y]))**2)
return output
Roberts
Roberts函數(shù)與能量梯度函數(shù)相似,它是利用對(duì)角方向像素點(diǎn)灰度值之差。將4個(gè)相鄰像素點(diǎn)的灰度值交叉相減的平方和作為每個(gè)像素點(diǎn)的梯度值,對(duì)所有像素梯度值累加作為清晰度評(píng)價(jià)函數(shù)值,表達(dá)式如下式所示:

python實(shí)現(xiàn):
def Roberts(img):
'''
:param img:narray 二維灰度圖像
:return: int 圖像越清晰越大
'''
shapes = np.shape(img)
output = 0
for x in range(0, shapes[0]-1):
for y in range(0, shapes[1]-1):
output+=((int(img[x+1,y+1])-int(img[x,y]))**2+(int(img[x+1,y])-int(img[x,y+1]))**2)
return output
Laplace
采用Laplace算子與圖像各個(gè)像素點(diǎn)的灰度值進(jìn)行卷積得到一個(gè)梯度矩陣記為,取各像素點(diǎn)梯度的平方和作為評(píng)價(jià)函數(shù),如下式所示:



python實(shí)現(xiàn):
def Laplacian(img):
'''
:param img:narray 二維灰度圖像
:return: int 圖像越清晰越大
'''
return cv2.Laplacian(img,cv2.CV_64F).var()
由于之前推導(dǎo)過,你可以查看此文,這是我以前所寫的一篇博客:圖像處理:邊緣檢測原理
SMD(灰度方差)函數(shù)
當(dāng)完全聚焦時(shí),圖像最清晰,圖像中的高頻分量也最多,故可將灰度變化作為聚焦評(píng)價(jià)的依據(jù),灰度方差法的公式如下:

python實(shí)現(xiàn):
def SMD(img):
'''
:param img:narray 二維灰度圖像
:return: int 圖像越清晰越大
'''
shape = np.shape(img)
output = 0
for x in range(1, shape[0]-1):
for y in range(0, shape[1]):
output+=math.fabs(int(img[x,y])-int(img[x,y-1]))
output+=math.fabs(int(img[x,y]-int(img[x+1,y])))
return output
SMD2 (灰度方差乘積)函數(shù)
SDM函數(shù)具有較好的計(jì)算性能,但其缺點(diǎn)也很明顯,即在焦點(diǎn)附近靈敏度不高,即該函數(shù)在極值點(diǎn)附近過于平坦,從而導(dǎo)致聚焦精度難以提高。在《一種快速高靈敏度聚焦評(píng)價(jià)函數(shù)》中李郁峰等人在論文中提出了一種新的評(píng)價(jià)函數(shù),稱之為灰度方差乘積法,即對(duì)每一個(gè)像素領(lǐng)域兩個(gè)灰度差相乘后再逐個(gè)像素累加,該函數(shù)定義如下:

python實(shí)現(xiàn):
def SMD2(img):
'''
:param img:narray 二維灰度圖像
:return: int 圖像約清晰越大
'''
shape = np.shape(img)
output = 0
for x in range(0, shape[0]-1):
for y in range(0, shape[1]-1):
output+=math.fabs(int(img[x,y])-int(img[x+1,y]))*math.fabs(int(img[x,y]-int(img[x,y+1])))
return output
4、圖像清晰度評(píng)價(jià)實(shí)現(xiàn)
SWD2:
import cv2
import pyps.pyzjr.definition as din
import pyps.pyzjr.utility as ult
image=ult.read_resize_image("./compare/8881.jpg",space=True)
img = din.SMD2(image)
print(img)
cv2.putText(image, f"definition:{img:.2f}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 3)
cv2.imshow("definition_Image", image)
cv2.waitKey(0)
Brenner:

Laplacian:

5、總結(jié)與評(píng)價(jià)
很遺憾,本次的清晰度評(píng)價(jià)失敗了,如果想要得到一個(gè)邊界值幾乎不可能實(shí)現(xiàn),哪怕通過大量圖像數(shù)據(jù)(模糊圖像與清晰圖像)也不能完成,因?yàn)檫@些清晰度量化指標(biāo)函數(shù)都是通過求圖像像素的梯度,換湯不換藥,在不同場景不同模糊的條件下很難去進(jìn)行比對(duì)。
到此這篇關(guān)于Python圖像處理之圖像清晰度評(píng)價(jià)的文章就介紹到這了,更多相關(guān)Python圖像清晰度評(píng)價(jià)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python數(shù)據(jù)結(jié)構(gòu)集合set教程示例詳解
這篇文章主要為大家介紹了Python數(shù)據(jù)結(jié)構(gòu)集合set教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
高考要來啦!用Python爬取歷年高考數(shù)據(jù)并分析
轉(zhuǎn)眼間,高考的日子又要來臨了,不知道高考學(xué)子們準(zhǔn)備的怎么樣了,今天這篇文章簡單且隨意地分析一下高考的一些數(shù)據(jù),需要的朋友可以參考下2021-06-06
python網(wǎng)絡(luò)爬蟲精解之Beautiful Soup的使用說明
簡單來說,Beautiful Soup 是 python 的一個(gè)庫,最主要的功能是從網(wǎng)頁抓取數(shù)據(jù),Beautiful Soup 提供一些簡單的、python 式的函數(shù)用來處理導(dǎo)航、搜索、修改分析樹等功能,需要的朋友可以參考下2021-09-09
python實(shí)現(xiàn)模擬鍵盤鼠標(biāo)重復(fù)性操作Pyautogui
這篇文章主要為大家詳細(xì)介紹了python如何利用Pyautogui模擬鍵盤鼠標(biāo)重復(fù)性操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
pycharm社區(qū)版安裝node.js插件運(yùn)行js代碼方法
PyCharm可以說是當(dāng)今最流行的一款Python IDE了,下面這篇文章主要給大家介紹了關(guān)于pycharm社區(qū)版安裝node.js插件運(yùn)行js代碼的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10

