檢測圖片是否模糊有很多方法(這篇文章review了36種),比如FFT和variation of Laplacian等,前者在操作到時候需要定義高頻的量有多低和多高來區分圖片是模糊的,操作起來比較麻煩;而后者可以輸出一個浮點數來代表圖片的模糊程度。
這里我們用的方法為Pech-Pacheco在2000年提出的Laplacian方法(具體可以查看這篇文章)。Laplacian方法能夠進行這項工作的原因是Laplacian算子是用來衡量圖片的二階導,能夠強調圖片中密度快速變化的區域,也就是邊界,故常用於邊界檢測。在正常圖片中邊界比較清晰因此方差會比較大;而在模糊圖片中包含的邊界信息很少,所以方差會較小。
這個方法在opencv中只是一行代碼的事:cv2.Laplacian(image, cv2.CV_64F).var()
。具體操作為:用圖片的1個通道用以下3x3的核進行卷積,然后計算輸出的方差,如果方差小於一定值則圖片視為模糊。
[[0, 1, 0],
[1, -4, 1],
[0, 1, 1]]
代碼:
import cv2
image = "test.jpg"
frame = cv2.imread(image)
img2gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 將圖片壓縮為單通道的灰度圖
# img_resize = cv2.resize(img2gray, (112, 112)) # 為方便與其他圖片比較可以將圖片resize到同一個大小
score = cv2.Laplacian(img2gray, cv2.CV_64F).var()
print "Laplacian score of given image is ", score
if score > 100: # 這個值可以根據需要自己調節,在我的測試集中100可以滿足我的需求。
print "Good image!"
else:
print "Bad image!"
比如這張圖片的輸出分值為4.337
而這張為153.783
參考