使用OpenCV進行模糊檢測(拉普拉斯算子)

2021-02-15 Opencv視覺實踐

點擊上方"藍色小字"關注我呀

本文翻譯自光頭哥哥的博客:

【Blur detection with OpenCV】。

本文僅作學習分享,原文連結:

這隻超可愛、超活躍家養小獵犬可能是有史以來拍照次數最多的狗。從8周大我們得到它的時候,到現在,不到3年的時間,我們已經收集了6000多張狗狗的照片。

在剛剛過去的這個周末,我坐下來,試圖整理手機裡大量的照片。這是一項艱巨的任務,而且我很快就注意到一個問題——有很多照片模糊程度過高。

現在,對於一般人來說,我認為他們會刪除這些模糊的照片(或者至少將它們移到一個單獨的文件夾中)——但作為一個計算機視覺科學家,這是不可能發生的。

相反,我編寫了一個快速的Python腳本,用OpenCV執行模糊檢測。

接下來,我將向你展示如何使用OpenCV、Python和Laplacian算子計算圖像中的模糊量。在這篇文章的結尾,你將能夠應用Laplacian方法到你自己的照片來檢測模糊的程度。

在研究如何檢測圖像中的模糊程度時,我的第一步是閱讀優秀的綜述論文,即【形狀-聚焦測量算子分析[2013 Pertuz等]】。在Pertuz等人的論文中,回顧了近36種估計圖像焦距程度的不同方法。

https://www.semanticscholar.org/paper/Analysis-of-focus-measure-operators-for-Pertuz-Puig/8c675bf5b542b98bf81dcf70bd869ab52ab8aae9?p2df

如果你有信號處理方面的背景,首先要考慮的方法是計算圖像的快速傅立葉變換,然後檢查低頻和高頻的分布:如果圖像只有有少量的高頻,那麼圖像就會被認為是模糊的。然而,定義什麼算低數量的高頻或者什麼是高數量的高頻是相當困難的。

相反,如果我們可以計算一個單一的浮點值來表示一個給定圖像的模糊程度,不是很好嗎?
Pertuz等人回顧了許多計算這種「模糊度度量」的方法,其中一些方法簡單而直接,僅使用基本的灰度像素強度統計,另一些更先進和基於特徵的方法,評估圖像的局部二值模式。

快速瀏覽完這篇論文後,我找到了我一直在尋找的理想算法:pecch - pacheco等人在他們2000年ICPR論文《亮場顯微鏡中的硅藻自動聚焦:比較研究》中提出的Laplacian的變化。

方法很簡單。簡單。有良好的推理。並且只需要一行代碼就可以實現:

cv2.Laplacian(image, cv2.CV_64F).var()

你只需採取一個圖像的單一通道(大概灰度)和卷積它與以下3 x 3的內核:

然後取響應的方差(即標準差的平方)。
如果方差低於預先定義的閾值,則認為圖像模糊;否則,圖像不會模糊。

這種方法有效的原因是由於Laplacian算子本身的定義,它用於測量圖像的二階導數。拉普拉斯算子突出顯示圖像中包含快速梯度變化的區域,很像Sobel和Scharr算子。和這些算子一樣,Laplacian也經常用於邊緣檢測。這裡的假設是,如果一幅圖像的方差較高,那麼就說明圖像有廣泛的響應,包括類邊和非類邊,這是一幅正常的聚焦圖像的代表。但如果方差很低,那麼就會有很小的響應擴散,這表明圖像中幾乎沒有邊緣。而圖像越模糊,邊緣就越少。所以可以用來檢測是否模糊。

顯然,這裡的關鍵是設置正確的閾值,而閾值的設置與應用到的圖像集相關。如果閾值過低,你就會錯誤地將原本不模糊的圖像標記為模糊。如果閾值過高,那麼實際上模糊的圖像將不會被標記為模糊。這種方法只有在非常穩定的圖像集(同一類型)中應用良好。

所以現在我們已經明確了將要使用的方法:計算一個單一的度量來表示一個給定的圖像是多麼「模糊」,讓我們看看我們的數據集以下12張圖像:

圖3:我們的圖像集。有些模糊,有些則不然。我們的目標是使用OpenCV進行模糊檢測並將圖像標記為模糊。

正如你所看到的,有些圖像是模糊的,有些則不是。我們的目標是正確地標記每個圖像模糊或非模糊。
有了這些,打開一個新文件,命名為detect_blur.py,讓我們打開代碼:

from imutils import pathsimport argparseimport cv2def variance_of_laplacian(image):      return cv2.Laplacian(image, cv2.CV_64F).var()ap = argparse.ArgumentParser()ap.add_argument("-i", "--images", required=True,  help="path to input directory of images")ap.add_argument("-t", "--threshold", type=float, default=100.0,  help="focus measures that fall below this value will be considered 'blurry'")args = vars(ap.parse_args())

我們從在第2-4行上導入必要的包開始。如果你還沒有我的imutils包在你的機器上,你會想現在安裝:

從這裡開始,我們將在第6行定義variance_of_laplacian函數。這個方法將我們想要計算焦距的圖像(假設為單個通道,例如灰度圖像)作為參數。第9行簡單地用3 x 3 Laplacian運算符對圖像進行卷積,並返回方差。

第12-17行解析命令行參數。我們需要的第一個命令是——images,它是指向包含我們想要測試是否模糊的圖像數據集的目錄的路徑。

我們還將定義一個可選參數——thresh,它是我們將用於模糊測試的閾值。如果一個給定圖像的焦距測量低於這個閾值,我們將標記圖像為模糊。需要注意的是,您可能需要為自己的圖像數據集調優這個值。100的值對於我的數據集似乎工作得很好,但是這個值對於圖像的內容是非常主觀的,所以您需要自己使用這個值來獲得最優結果。

不管你信不信,最難的部分已經完成了!我們只需要寫一點代碼從磁碟加載圖像,計算Laplacian的方差,然後將圖像標記為模糊或非模糊:

for imagePath in paths.list_images(args["images"]):        image = cv2.imread(imagePath)  gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  fm = variance_of_laplacian(gray)  text = "Not Blurry"      if fm < args["threshold"]:    text = "Blurry"    cv2.putText(image, "{}: {:.2f}".format(text, fm), (10, 30),    cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 3)  cv2.imshow("Image", image)  key = cv2.waitKey(0)

我們從第2行開始對圖像目錄進行循環。對於這些圖像,我們將從磁碟加載,將其轉換為灰度,然後使用OpenCV應用模糊檢測(第6-9行)。
在焦點測量超過命令行參數提供的閾值的情況下,我們將把圖像標記為「模糊」。
最後,第3517-20行將文本和計算結果寫到圖像上,並將結果顯示在我們的屏幕上。

現在我們已經編寫了detect_blur.py腳本,讓我們嘗試一下。打開一個shell並發出以下命令:

$ python detect_blur.py --images images

這張照片的計算值是83.17,低於我們的閾值100;因此,我們正確地將該圖像標記為模糊。

這幅圖像的計算值為64.25,這也使得我們將其標記為「模糊」。

圖6的計算值很高,為1004.14—比前兩幅圖高了幾個數量級。這幅圖像顯然是非常清晰的。

在這篇博文中,我們學習了如何使用OpenCV和Python執行模糊檢測。

我們實現了計算Laplacian方法的方差,得到一個浮點值來表示圖像的「模糊」程度。這種方法快速、簡單、易於應用——我們只需用Laplacian算子對輸入圖像進行卷積並計算方差。如果方差低於預先定義的閾值,我們將圖像標記為「模糊」。
需要注意的是,閾值是正確調優的一個關鍵參數,您經常需要根據每個數據集對其進行調優。

相關焦點

  • 使用OpenCv和Dlib進行打哈欠檢測
    打哈欠檢測與應用打哈欠檢測就是使用OpenCV和Dlib來檢測打哈欠(由於疲勞或無聊而張大嘴巴深吸氣)。可廣泛應用於自駕車、駕駛員疲勞檢測、駕駛員睡意檢測、駕駛員意識檢測等領域。安裝OpenCv和Dlib庫OpenCv的安裝如下:pip install opencv-pythonDlib的安裝如下:pip install cmake
  • 使用Python+OpenCV進行面部合成
    原文 http://www.learnopencv.com/face-morph-using-opencv-cpp-python/
  • 手把手:使用OpenCV進行面部合成— C++ / Python
    讓我們從獲取對應點開始。首先,我們可以通過檢測面部特徵點自動(或手工)獲得大量像素點。我用dlib庫檢測到68個對應點。接下來,我手工增加了4個點(1個在右側耳朵,1個在脖子處,2個在肩膀處)。最後,我增加了圖片的角點和邊的中點作為對應點。毋庸置疑,在頭部和頸部增加越多的點,得到的圖片效果就更好;反之,去掉手工點(只剩下自動點),得到的圖片效果就要差一些。
  • 基於OpenCV的車輛變道檢測
    當然可以使用圖像數據集檢測來汽車,但是由於汽車在變道時我們需要通過彈出窗口提供警報,因此對於這些動態情況,視頻輸入更為可行。捕獲輸入後,使用循環提取幀,並使用汽車的haar級聯文件檢測到的坐標,我們在循環中在汽車周圍繪製一個矩形,以在對捕獲的幀執行其他操作時獲得一致性。
  • OpenCV 4.5 發布!
    從 4.5 版本開始,OpenCV將正式使用Apache 2 授權協議,對開發者更加友好,避免專利算法進入OpenCV帶來的潛在糾紛。2. 因為SIFT 專利到期,成為公有技術,代碼被移到主庫(其實 4.4 版本已經進了)。
  • 特徵點檢測-SIFT
    是原圖 表示處理後的照片2、然後,做這一層的DoG高斯模糊咱們之前有聊過(而且不止一次),問題是,我們的現在要做的是特徵值檢測,做不同程度的高斯模糊有什麼用呢?番外篇:這些圖片有沒有讓你想起了想起了拉普拉斯金字塔?
  • OpenCV黑魔法之隱身衣 | 附源碼
    上面的GIF簡單地解釋了算法的所有階段。現在我們將詳細討論每一步。因為我們使用了一塊紅色的布來將它轉換成一件隱形鬥篷,所以我們將著重於在框架中檢測紅色。聽起來簡單嗎?我們有一個RGB(紅-綠-藍)圖像,使用簡單閾值的R通道來得到我們的mask。結果證明,這將並不會特別有效,因為RGB值是高度敏感的照明。因此,即使鬥篷是紅色的,也可能有一些區域,由於陰影,相應像素的紅色通道值相當低。
  • Oh My God,原來是一個這樣的拉普拉斯,宇宙中的惡魔拉普拉斯妖
    以他的姓氏命名的變換、定理、方程等更是數不勝數:拉普拉斯展開、拉普拉斯變換、拉普拉斯定理、拉普拉斯方程、拉普拉斯算子、拉普拉斯函數、拉普拉斯積分、拉普拉斯分布、拉普拉斯向量等。。。拉普拉斯在研究天體問題的過程中,創造和發展了許多數學的方法,以他的名字命名的拉普拉斯變換、拉普拉斯定理和拉普拉斯方程,在科學技術的各個領域有著廣泛的應用。
  • 使用Fast.ai和OpenCV進行視頻面部表情和意識檢測
    從實時視頻或視頻文件中檢測面部表情和意識。背後的靈感是什麼?通過網絡攝像頭看著我,但被深度學習所取代實時視頻分類器演示介紹本教程的目標?使用fast.ai庫訓練面部表情分類模型,從您的網絡攝像頭或視頻文件中讀取面部表情,最後添加面部標記以跟蹤您的眼睛以確定意識!在進行該項目時,面臨的一大挑戰是弄清楚如何使用經過訓練的分類器,使其能夠有效地用於實時視頻和視頻文件。第一步是用卷積神經網絡訓練圖像分類模型。
  • opencv-python獲取圖像:面向對象與面向過程
    這裡需要注意以下,opencv讀取圖片默認通道為BGR的格式,當在其他UI用戶界面顯示圖像時注意轉換一下通道順序,例如BGR轉換成RGB:Image1=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)下面讀取一張圖片並顯示
  • 談談OpenCV中的四邊形
    使用經典圖像處理的算法的話可以使用OpenCV提供了幾個和矩形相關的函數接口。另一類就是使用機器學習類算法檢測定位四個角點。這篇文章我們主要來看看使用經典圖像處理算法來解決這個問題。1.最小包絡正矩形Rect boundingRect(InputArray points)函數會給我們傳入的邊界點計算得到一個最小的包絡正矩形,並輸出這個正矩形的頂點。
  • 計CCD實現老式檢測設備實時監測設計
    CCD在老式儀表改造中可用於實現老式檢測設備的實時監測功能,利用CCD對傳統的機械錶盤進行圖像識別,用計算機代替人眼完成讀數以及判別工作,減輕了工作人員讀數並進行數據處理等繁雜的工作,提高了監測效率,實現了實時在線監測及報警。 2 系統工作原理 如圖1所示,該CCD檢測系統主要由CCD攝像機、卡座、光源、圖像採集卡,計算機以及輸出設備組成。
  • 《精靈寶可夢劍盾》拉普拉斯怎麼配招 拉普拉斯配招推薦
    導 讀 精靈寶可夢劍盾拉普拉斯該怎麼配招呢,快來和小編一起了解吧!
  • 使用谷歌AI Open Images進行對象檢測
    或者使用Snapchat濾鏡將一些花哨的狗耳朵放在臉上,將自拍照分享給朋友?你是否知道這些很酷的功能是通過一個神奇的神經網絡實現的,它不僅可以識別出照片中有一張臉,還可以檢測出耳朵的位置。從某種意義上說,你的手機可以「看到」你,它甚至可以知道你的樣子!幫助計算機「看到」的技術被稱為「計算機視覺」。
  • Python中如何利用Opencv打開視頻或圖像並用PyQt控制項顯示
    OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS作業系統上,使用起來十分方便,把它與PyQt結合起來,就可以順利的操作視頻、圖像了。具體安裝請自行百度,這裡介紹使用方法。
  • 基於python+opencv的圖像目標區域自動提取
    因此我們要解決的問題變為:提取矩形的四個角落、進行透視變換。檢測矩形並提取坐標需要對圖像進行預處理、邊緣檢測、提取輪廓、檢測凸包、角點檢測。4、邊緣檢測與輪廓處理我們用Canny算子邊緣檢測,提取輪廓binary = cv2.Canny(binary, 0, 60, apertureSize = 3)cv2.imwrite("3-canny.png", binary, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
  • 《寶可夢劍盾》S7雙打瞬時第一拉普拉斯核心隊怎麼樣 拉普拉斯核心...
    導 讀 寶可夢劍盾S7雙打瞬時第一拉普拉斯核心隊分享 寶可夢劍盾的第7賽季正在進行,新賽季較以往賽季有不小的改變
  • opencv教程-光流法
    opencv裡的光流法有兩種,稀疏光流法 和 稠密光流法。簡單理解的話光流就是一個向量,包含在一定時間間隔內x方向位置的變化、y方向位置的變化,所以其三個主要因素就是dx,dy,dt。