天天看點

opencv contrib是什麼_手把手教你使用圖像處理利器OpenCV

opencv contrib是什麼_手把手教你使用圖像處理利器OpenCV

作者:Muhammad Junaid Khalid

翻譯:老齊

與本文相關的圖書推薦:《資料準備和特征工程》

opencv contrib是什麼_手把手教你使用圖像處理利器OpenCV

概要

在本文中,将學習如何使用Python語言進行圖像處理,我們不會局限于一個單獨的庫或架構,然而,有一個庫的使用率将會是最高的,那就是OpenCV。我們一開始會讨論一些圖像處理,然後繼續探讨不同的應用/場景,也就是圖像處理的用武之地。開始吧!

什麼是圖像處理?

在深入研究圖像處理的方法之前,重要的是要了解什麼是圖像處理,特别是這項技術在處理大量圖檔方面的角色。圖像處理完整的說法是“數字圖像處理”,經常使用圖像處理的領域是“計算機視覺”。對這兩個術語不要混淆,圖像處理算法和計算機視覺(CV)算法都以圖像為輸入,然而,在圖像進行中,輸出也是圖像,而在計算機視覺中,輸出可以是關于圖像的一些特征或資訊。

為什麼需要圖像處理?

我們收集或生成的資料大部分是原始資料,也就是說,由于一些可能的原因,這些資料不适合直接用于應用程式。是以,我們需要首先分析它,執行必要的預處理,然後使用它——特别推薦《資料準備和特征工程》,此書即為這方面最佳讀物。

例如,我們正在嘗試建構一個關于貓的分類器。我們的程式會把一個圖像作為輸入,然後告訴我們這個圖像是否包含一隻貓。建構這個分類器的第一步是收集數百張含有貓的圖檔。一個常見的問題是,收集的所有圖檔的大小都不相同,是以在将它們提供給模型進行訓練之前,需要調整它們的大小或者把它們進行預處理,使尺寸符合标準。

為什麼圖像處理對于任何計算機視覺應用序都是必不可少的?以上提到的隻是衆多原因之一。

預備知識

為了輕松地學習本文内容,你需要已經具備如下知識。

首先,應該具備一定的程式設計語言技能,本文使用的是Python語言,如果尚未掌握此語言,推薦閱讀《跟老齊學Python:輕松入門》或《Python大學實用教程》。

opencv contrib是什麼_手把手教你使用圖像處理利器OpenCV

其次,你應該了解什麼是機器學習以及它的基本工作原理。因為在本文中我們将使用一些機器學習算法來進行圖像處理。

另外,如果你之前接觸過或掌握了OpenCV的基本知識,也會有所幫助。但這不是必需的。

還有,你一定要了解圖像在記憶體中究竟是如何表示的。每幅圖像都由一組像素表示,即像素值矩陣。對于灰階圖像,像素值的範圍是0到255,它們表示該像素的強度。例如,如果你有一個20×20維的圖像,它将由一個20x20的矩陣表示(像素值總共是400)。

如果你正在處理彩色圖像,你應該知道它有三個通道——紅、綠、藍(RGB)。是以,一個彩色圖像有三個這樣的矩陣。

安裝

注意: 由于我們将通過Python使用OpenCV,是以你必須會實用它,前面推薦了關于Python的書籍。下面依次說明在不同作業系統中OpenCV的安裝方法:

  • Windows
  • MacOS
  • Linux

要檢查是否安裝成功,請在Python互動模式中運作以下指令:

必備的基礎知識

在進行圖像處理之前,要先做一些準備。

在本文中,我們将使用以下圖像:

opencv contrib是什麼_手把手教你使用圖像處理利器OpenCV

注意: 為了在本文中顯示該圖像,對其進行了縮放,但是我們使用的圖像原始大小約為1180x786。

你可能注意到圖像現在是彩色的,這意味着它由三個顔色通道表示,即紅色、綠色和藍色。我們将把圖像轉換成灰階,并使用下面的代碼将圖像分割成單獨的通道。

找到圖像細節

使用

imread()

函數加載圖像後,我們可以得到關于它的一些簡單屬性,比如像素的數量和尺寸:

Output:

将圖像分割成單獨的通道

現在,我們将使用OpenCV将圖像分割成紅色、綠色和藍色的部分,并顯示它們:

為了簡單起見,我們隻顯示灰階圖像。

opencv contrib是什麼_手把手教你使用圖像處理利器OpenCV

圖像門檻值

門檻值的概念非常簡單。正如上面在圖像表示中所讨論的,像素值可以是0到255之間的任何值。假設我們想要将一幅圖像轉二值化,即指定一個像素值為0或1。為此,我們可以設定門檻值。例如,如果門檻值(T)為125,那麼所有大于125的像素将被指派為1,所有小于或等于該值的像素将被指派為0。下面,我們通過代碼來更好地了解它。

将下面的圖像用上述方法進行轉換:

opencv contrib是什麼_手把手教你使用圖像處理利器OpenCV

輸出:

opencv contrib是什麼_手把手教你使用圖像處理利器OpenCV

正如你所看到的, 二值化之後,出現了兩個區域,即黑色區域(像素值0)和白色區域(像素值1)。原來, 我們設定的門檻值正好在圖像的中間,這就是為什麼黑白值在那裡被分割。

應用

1:去除圖像中的噪聲

現在你已經對圖像處理的概念和用途有了基本的了解,接下來讓我們來了解一下它的一些具體應用。

在大多數情況下,我們收集的原始資料有噪聲,也就是說,不需要的特征使圖像很難被感覺。雖然這些圖像可以直接用于特征抽取,但是算法的準确性會受到很大的影響。這就是為什麼在将圖像傳遞給算法以獲得更好的精度之前,要對圖像進行處理的原因。

有許多不同類型的噪聲,如高斯噪聲,椒鹽噪聲等。我們可以通過應用濾波器來去除圖像中的噪聲,或者至少将其影響降到最低。在濾波器方面也有很多選擇,每一個濾波器都有不同的優點。是以,對于特定類型的噪聲來說,總有一個是最好的。

為了更好地了解這一點,我們将在上面的玫瑰色圖像的灰階版本中添加“鹽和胡椒粉”噪聲,然後嘗試使用不同的濾波器去除圖像中的噪聲,看看哪一個最适合這種類型。

好的,我們已經把噪聲添加到玫瑰圖像,這是它現在的樣子:

opencv contrib是什麼_手把手教你使用圖像處理利器OpenCV

讓我們現在應用不同的濾波器,并記下觀察結果,即每個濾波器降噪的效果。

銳化濾波器

在有椒鹽噪聲的圖像上應用濾波器得到的圖像如下所示。通過與原始灰階圖的對比,我們可以看出,它把圖像調得太亮了,也無法突出玫瑰上的亮點。是以,我們可以得出結論,銳化濾波器并不能去除噪聲。

銳化濾波器輸出:

opencv contrib是什麼_手把手教你使用圖像處理利器OpenCV

中值濾波器

在有噪聲的圖像上應用中值濾波器,得到的圖像如下所示。通過與原始灰階圖像的對比,我們可以看出,與上面的核方法一樣,圖像的亮度調高了很多,然而,它能夠突出玫瑰上的亮斑(即噪聲)。是以,我們可以說,中值濾波器是比銳化濾波器更好的選擇,但它仍然不能完全恢複原始圖像。

中值濾波器輸出:

opencv contrib是什麼_手把手教你使用圖像處理利器OpenCV

逆諧波均值濾波器

注意: 對這些濾波器的工作原理的闡述,超出了本文範疇,讀者可以在網上搜尋,我們還是從應用的層面來研究。

在有椒鹽噪聲的圖像上應用逆諧波均值濾波器(https://en.wikipedia.org/wiki/Contraharmonic_mean)得到的圖像如下圖所示。通過與原始灰階圖像的對比,我們可以看到:它幾乎完美再現了原始圖像。它的強度或亮度級别與原圖是相同的,它突出了玫瑰上的亮點。是以,我們可以得出結論,逆諧波均值濾波器在處理椒鹽噪聲方面是非常有效的。

逆諧波均值濾波器輸出:

opencv contrib是什麼_手把手教你使用圖像處理利器OpenCV

現在我們已經找到了最佳濾波器,它可以有效地把有噪聲的圖像恢複到原始圖像。我們可以繼續下一個應用了。

2:使用Canny算子進行邊緣檢測

到目前為止,我們使用的玫瑰圖像的背景是不變的,也就是黑色的,是以,我們将把這個應用用于不同的圖像,以更好地展示算法的功效。原因是,如果背景是恒定的,邊緣檢測任務就變得相當簡單,這不是我們所希望的。

在本文開始部分,我們提到了一個關于貓的分類器。現在我們延用這個例子,看看圖像處理如何在其中扮演一個完整的角色。

在分類算法中,首先掃描圖像尋找“對象”。也就是說,當你輸入一幅圖像時,算法會找到圖像中的所有對象,然後将它們與你試圖尋找的對象進行特征比較。對于貓分類器,它會将在圖像中找到的所有對象與貓圖像的特征進行比較,如果找到比對項,它會告訴我們輸入圖像中包含了一隻貓。

對于這個貓分類器,僅以一張貓的圖像為例,以下是我們将要使用的圖像:

opencv contrib是什麼_手把手教你使用圖像處理利器OpenCV

邊緣檢測輸出:

opencv contrib是什麼_手把手教你使用圖像處理利器OpenCV

正如你所看到的,圖像中包含對象的部分(在本例中是一隻貓)已經通過邊緣檢測用虛線标出或分隔開。現在你一定想知道,什麼是邊緣檢測的Canny算子,它是怎麼工作的?現在就讨論一下。

要了解上述内容,需要讨論三個關鍵步驟。首先,它對圖像進行降噪,降噪方式與前面讨論的方式類似。其次,它使用每個像素的一階導數來找到邊緣。這背後的邏輯是,在邊緣存在的地方,會有一個突然的強度變化,導緻一階導數值達到峰值,進而使該像素成為“邊緣像素”。

最後,進行滞後門檻值化;上面我們說過,在一個邊緣的一階導數值會有一個峰值,但是我們沒有說:這個峰值需要有多高,才能被歸類為一個邊緣——這叫做門檻值!在本文的前面,我們讨論了什麼是簡單的門檻值。遲滞門檻值法是在此基礎上的一種改進,它利用兩個門檻值來代替一個門檻值。這背後的原因是,如果門檻值過高,我們可能會錯過一些真正的邊緣(真負例),如果門檻值過低,我們會得到很多被歸類為邊緣的點,而實際上不是邊緣(假正例)。一個門檻值設定為高,一個設定為低,将所有高于“高門檻值”的點辨別為邊緣,然後對所有高于“低門檻值”但低于“高門檻值”的點進行評估;邊緣上的點确定之後,與邊緣點靠近或相鄰的點也被确定為邊緣,其餘的點被丢棄。

這些是Canny算子用于識别圖像邊緣的基本概念/方法。

譯者注: Canny算子是澳洲計算機科學家約翰·坎尼(John F. Canny)于1986年開發出來的一個多級邊緣檢測算法,其目标是找到一個最優的邊緣.

結論

在本文中,我們學習了如何在不同的平台(如Windows、MacOS和Linux)上安裝OpenCV,以及如何驗證安裝成功。OpenCV是Python中最流行的圖像處理庫。

接着我們讨論了什麼是圖像處理,以及它在機器學習的計算機視覺領域中的應用。我們讨論了一些常見的噪聲類型,以及如何使用不同的濾波器将噪聲從圖像中去除,以便在應用中使用這些圖像。

此外,我們還了解了圖像處理如何在高端應用(如:對象檢測或分類)中發揮不可或缺的作用。請注意,這篇文章隻是冰山一角,數字圖像處理還有更多的内容,不可能在一篇短文中全部涵蓋。請關注微信公衆号「老齊教室」,這裡還會刊發有關圖像處理的文章。

原文連結:https://stackabuse.com/introduction-to-image-processing-in-python-with-opencv/

搜尋技術問答的公衆号:老齊教室

opencv contrib是什麼_手把手教你使用圖像處理利器OpenCV

在公衆号中回複:老齊,可檢視所有文章、書籍、課程。

覺得好看,就點這裡👇👇👇