OpenCV-Python 圖像去噪|五十九

2021-01-07 人工智慧遇見磐創

目標

在本章中,

你將學習用於去除圖像中噪聲的非局部均值去噪算法。你將看到不同的函數,例如cv.fastNlMeansDenoising(),cv.fastNlMeansDenoisingColored()等。理論

在前面的章節中,我們已經看到了許多圖像平滑技術,例如高斯模糊,中值模糊等,它們在某種程度上可以消除少量噪聲。在這些技術中,我們在像素周圍採取了一個較小的鄰域,並進行了一些操作,例如高斯加權平均值,值的中位數等來替換中心元素。簡而言之,在像素處去除噪聲是其周圍的局部現象。 有噪聲的性質。

通常認為噪聲是零均值的隨機變量。考慮一個有噪聲的像素,$p=p_0+n$,其中$p_0$是像素的真實值,$n$是該像素中的噪聲。你可以從不同的圖像中獲取大量相同的像素(例如N)並計算其平均值。理想情況下,由於噪聲的平均值為零,因此應該得到$p = p_0$。

你可以通過簡單的設置自己進行驗證。將靜態相機固定在某個位置幾秒鐘。這將為你提供很多幀或同一場景的很多圖像。然後編寫一段代碼,找到視頻中所有幀的平均值(這對你現在應該太簡單了)。 比較最終結果和第一幀。你會看到噪聲減少。不幸的是,這種簡單的方法對攝像機和場景的運動並不穩健。通常,只有一張嘈雜的圖像可用。

因此想法很簡單,我們需要一組相似的圖像來平均噪聲。考慮圖像中的一個小窗口(例如5x5窗口)。 很有可能同一修補程序可能位於圖像中的其他位置。有時在它周圍的一個小社區中。一起使用這些相似的補丁並找到它們的平均值怎麼辦?對於那個特定的窗口,這很好。請參閱下面的示例圖片:

圖像中的藍色補丁看起來很相似。綠色補丁看起來很相似。因此,我們獲取一個像素,在其周圍獲取一個小窗口,在圖像中搜索相似的窗口,對所有窗口求平均,然後用得到的結果替換該像素。此方法是「非本地均值消噪」。與我們之前看到的模糊技術相比,它花費了更多時間,但是效果非常好。更多信息和在線演示可在其他資源的第一個連結中找到。

對於彩色圖像,圖像將轉換為CIELAB色彩空間,然後分別對L和AB分量進行降噪。

OpenCV中的圖像去噪

OpenCV提供了此方法的四個變體。

cv.fastNlMeansDenoising()-處理單個灰度圖像cv.fastNlMeansDenoisingColored()-處理彩色圖像。cv.fastNlMeansDenoisingMulti()-處理在短時間內捕獲的圖像序列(灰度圖像)cv.fastNlMeansDenoisingColoredMulti()-與上面相同,但用於彩色圖像。常用參數為:

h:決定濾波器強度的參數。較高的h值可以更好地消除噪點,但同時也可以消除圖像細節。(可以設為10)hForColorComponents:與h相同,但僅用於彩色圖像。(通常與h相同)templateWindowSize:應為奇數。(建議設為7)searchWindowSize:應為奇數。(建議設為21)請訪問其他資源中的第一個連結,以獲取有關這些參數的更多詳細信息。 我們將在此處演示2和3。剩下的留給你。

cv.fastNlMeansDenoisingColored() 如上所述,它用於消除彩色圖像中的噪點。(噪聲可能是高斯的)。請參閱以下示例:

import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('die.png')dst = cv.fastNlMeansDenoisingColored(img,None,10,10,7,21)plt.subplot(121),plt.imshow(img)plt.subplot(122),plt.imshow(dst)plt.show()以下是結果的放大版本。我的輸入圖像的高斯噪聲為σ= 25。查看結果:

cv.fastNlMeansDenoisingMulti() 現在,我們將對視頻應用相同的方法。第一個參數是噪聲幀列表。第二個參數 imgToDenoiseIndex 指定我們需要去噪的幀,為此,我們在輸入列表中傳遞幀的索引。第三是 temporalWindowSize,它指定要用於降噪的附近幀的數量。應該很奇怪。在那種情況下,總共使用 temporalWindowSize 幀,其中中心幀是要被去噪的幀。例如,你傳遞了一個5幀的列表作為輸入。令 imgToDenoiseIndex = 2 , temporalWindowSize =3。然後使用 frame-1,frame-2 和 frame-3 去噪 frame-2。讓我們來看一個例子。

import numpy as np import cv2 as cv from matplotlib import pyplot as plt cap = cv.VideoCapture('vtest.avi') # 創建5個幀的列表img = [cap.read()[1] for i in xrange(5)] # 將所有轉化為灰度 gray = [cv.cvtColor(i, cv.COLOR_BGR2GRAY) for i in img] # 將所有轉化為float64 gray = [np.float64(i) for i in gray] # 創建方差為25的噪聲 noise = np.random.randn(*gray[1].shape)*10 # 在圖像上添加噪聲 noisy = [i+noise for i in gray] # 轉化為unit8 noisy = [np.uint8(np.clip(i,0,255)) for i in noisy] # 對第三幀進行降噪 dst = cv.fastNlMeansDenoisingMulti(noisy, 2, 5, None, 4, 7, 35) plt.subplot(131),plt.imshow(gray[2],'gray') plt.subplot(132),plt.imshow(noisy[2],'gray') plt.subplot(133),plt.imshow(dst,'gray') plt.show()

計算需要花費大量時間。結果,第一個圖像是原始幀,第二個是噪聲幀,第三個是去噪圖像。

附加資源

http://www.ipol.im/pub/art/2011/bcm_nlm/ (它包含詳細信息,在線演示等。強烈建議訪問。我們的測試圖像是從此連結生成的)Online course at coursera (這裡拍攝的第一張圖片)

相關焦點

  • opencv-python圖像預處理-濾波
    為了消除外界環境對圖像採集的幹擾,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰以及提高圖像處理速度需要對圖像進行預處理操作,主要是對圖像進行濾波和增強操作。使用的方法可以分為空間域處理和頻率域處理兩類。空間域指圖像平面本身,這類圖像處理方法用各種模板直接與圖像進行卷積運算,實現對圖像的處理。
  • Python+OpenCV的基礎圖像處理操作匯總
    通過在CMD(命令提示符)中發出以下命令來安裝opencv python(這是一個用於python的非正式預構建opencv包):opencv-contrib-python(包含main和contrib模塊)opencv-python-headless(與opencv-python相同,但沒有
  • Python 圖像處理 OpenCV (1):入門
    /官方 Demo :https://github.com/opencv/opencv/blob/master/samples/python圖書推薦圖書的話我就推薦一本吧,如果要看書學習絕對不能錯過的「Learning OpenCV 3」,當然,是英文原版的,中文版的話翻譯有點慘不忍睹,對英文閱讀壓力大的同學可以中英文對照著看:
  • 「Python+cv2」Python安裝opencv及圖像的基本操作
    Python環境opencv的安裝1、檢查是否安裝python環境3、安裝opencvpython環境下opencv的安裝:pip3 install opencv-pythonpython opencv安裝因為我已經安裝,所以會出現安裝位置的提示。
  • 「python opencv計算機視覺零基礎到實戰」九模糊
    一、學習目標了解什麼是卷積了解模糊的使用方法與應用目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰」 第四節色彩空間
  • 基於opencv 的圖像處理入門教程
    形心檢測對彩色圖片採用蒙版(mask)提取圖片的文字(OCR)檢測和修正歪曲的文字顏色檢測去噪/ccc013/CodesNotes/tree/master/opencv_noteshttps://github.com/ccc013/CodesNotes/blob/master/opencv_notes/opencv_image_process_tutorial.ipynb1.
  • opencv-python獲取圖像:面向對象與面向過程
    這裡需要注意以下,opencv讀取圖片默認通道為BGR的格式,當在其他UI用戶界面顯示圖像時注意轉換一下通道順序,例如BGR轉換成RGB:Image1=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)下面讀取一張圖片並顯示
  • 使用Python+OpenCV實現圖像數據採集
    在Anaconda或命令提示符中鍵入conda create -n opencv python=3.6這將在Python版本3.6中創建一個名為opencv的新環境,可以用正在使用的任何版本替換它。下一步,輸入pip install opencv-python你已經成功安裝了cv2! 現在你可以開始拍照了。
  • 基於 opencv 的圖像處理入門教程
    所以本文主要是介紹用 OpenCV 實現一些基本的圖像處理操作,本文的目錄如下所示:原文地址:https://likegeeks.com/python-image-processing/安裝OpenCV 的安裝還是比較簡單的,直接用 pip 命令在命令行安裝即可,輸入以下命令:pip install opencv-python驗證是否安裝成功,可以運行 python 命令,然後分別輸入以下命令:
  • 【視覺與圖像】Python+OpenCV教程入門篇
    要安裝OpenCV,只需cmd下的一條指令:pip install opencv-pythonpip是Python的包管理器,如果你還沒安裝Python,強烈推薦安裝Anaconda,它包含了大量的科學計算包,不用後期一個個安裝。即使你已經裝了Python也沒有影響,Anaconda相當於虛擬環境,互不幹擾。
  • python利用opencv實現證件照換底
    opencv今天就給大家介紹一下python利用opencv庫進行藍底換紅底或者白底照片的操作。1.強大的opencv庫說到圖像處理,不得不提opencv庫。它是一個跨平臺的計算機視覺庫,可以運行在不同作業系統上,它由一些列c函數和少量c++函數組成,並提供python,matlab等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。我們這裡用的opencv-python 就是opencv的python API接口。
  • opencv教程-圖像平滑、二值化
    1:圖像平滑圖像平滑也就是模糊處理,去噪處理。這裡我們先來了解以下幾個詞:低頻分量:圖像種亮度/灰度變化比較平緩的部分。高頻分量:圖像種亮度/灰度變化比較大的部分,比如噪點。低通濾波:去除高頻分量,保留低頻分量,可用來去噪。高通濾波:去重低頻分量,保留高頻分量,可用來做邊界檢測。
  • Python中如何利用Opencv打開視頻或圖像並用PyQt控制項顯示
    OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS作業系統上,使用起來十分方便,把它與PyQt結合起來,就可以順利的操作視頻、圖像了。具體安裝請自行百度,這裡介紹使用方法。
  • 「python opencv 計算機視覺零基礎實戰」第一節
    前置條件說明:本系列opencv實戰教程將從基礎到實戰,若只是簡單學習完python也可以通過該教程完成一般的機器學習編程;文中將會對很多python的基礎內容進行講解,但由於文章定位的原因將不會贅述過多的基礎內容,基礎內容進行第一次講解後第二次將不會過多贅述,本文主要講解的是opencv相關知識。
  • 使用Python+OpenCV實現神經網絡預處理人臉圖像的快速指南
    注意:本文中使用的所有靜態圖像都來自 https://imgflip.com/memetemplates圖片載入我們將使用imread()函數加載圖像,指定文件的路徑和mode,第二個參數對於動態運行通道和像素轉換非常重要。
  • 基於OpenCV的圖像分割處理!
    它特別適用於目標和背景佔據不同灰度級範圍的圖像。它不僅可以極大的壓縮數據量,而且也大大簡化了分析和處理步驟,因此在很多情況下,是進行圖像分析、特徵提取與模式識別之前的必要的圖像預處理過程。閾值處理是指剔除圖像內像素值高於閾值或者低於閾值得像素點。例如,設定閾值為127,將圖像內所有像素值大於127的像素點的值設為255;將圖像內所有像素值小於127的像素點的值設為0。
  • Python下opencv使用筆記(一:簡單操作與幾何變換)
    上次分享了一個關於python下opencv的所有相關資料,詳細可參考下載:珍藏資料-學習OpenCV與計算機視覺-有這些就夠了1.圖像簡單讀取、顯示與儲存首先關於python想說的是,單純的官網下載的python並不大,是一個最初的python,進行一些簡單的操作時可以的,但是當你進行複雜一點的時候,就需要許多第三方的安裝包,比如numpy等等,這些庫安裝進去說起來也不是很複雜,網上有很多教程,但是當許多的包安裝的時候,有的庫包並沒有你的電腦的版本,等等還有許多因素導致你的庫包安裝不進去,想想還是挺麻煩的
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 「python opencv視覺零到實戰」八、圖片選區操作
    一、學習目標了解什麼是ROI了解floodFill的使用方法如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 如何快速簡單的安裝opencv-python
    這樣就會從清華鏡像安裝opencv-contrib-python庫。最新版本為4.1.1 ----2019-8-28在opencv-contrib-python 版本中含有額外模塊( Extra modules ),而 opencv-python 版本中只含有基礎模塊。