使用opencv和python进行智能图像处理_使用OpenCV在Python中进行图像处理
編輯推薦:
本文將先討論一些圖像處理,然后再繼續介紹可以方便使用圖像處理的不同應用程序/場景,希望對您的學習有所幫助。
本文來自于tecdat
,由火龍果軟件Alice編輯、推薦。
介紹
在本教程中,我們將學習如何使用Python語言執行圖像處理。我們不會局限于單個庫或框架;但是,我們將最常使用的是Open
CV庫。我們將先討論一些圖像處理,然后再繼續介紹可以方便使用圖像處理的不同應用程序/場景。
什么是圖像處理?
重要的是要了解圖像處理的確切含義,以及在深入了解圖像處理的作用之前,圖像處理在大圖中的作用是什么。圖像處理最常被稱為“數字圖像處理”,而經常使用的領域是“計算機視覺”。請勿混淆。圖像處理算法和計算機視覺(CV)算法都將圖像作為輸入。但是,在圖像處理中,輸出也是圖像,而在計算機視覺中,輸出可能是有關圖像的某些特征/信息。
我們為什么需要它?
我們收集或生成的數據大部分是原始數據,即由于多種可能的原因,不適合直接在應用程序中使用。因此,我們需要先對其進行分析,執行必要的預處理,然后再使用它。
例如,假設我們正在嘗試構建cat分類器。我們的程序將圖像作為輸入,然后告訴我們圖像是否包含貓。建立該分類器的第一步是收集數百張貓圖片。一個普遍的問題是,我們抓取的所有圖片都不會具有相同的尺寸/尺寸,因此在將它們輸入模型進行訓練之前,我們需要將所有尺寸調整/預處理為標準尺寸。
這只是圖像處理對于任何計算機視覺應用必不可少的眾多原因之一。
先決條件
在繼續進行之前,讓我們討論一下需要了解的內容,以便輕松地學習本教程。首先,您應該掌握任何語言的基本編程知識。其次,您應該知道什么是機器學習以及它如何工作的基礎,因為本文中我們將使用一些機器學習算法進行圖像處理。另外,如果您在繼續學習本教程之前對Open
CV有任何了解或基礎知識,這將對您有所幫助。但這不是必需的。
為了遵循本教程,您一定要知道的一件事是圖像在內存中的準確表示方式。每個圖像由一組像素表示,即像素值矩陣。對于灰度圖像,像素值的范圍是0到255,它們代表該像素的強度。例如,如果您具有20
x 20尺寸的圖像,則將以20x20的矩陣(總共400個像素值)表示。
如果要處理彩色圖像,則應該知道它將具有三個通道-紅色,綠色和藍色(RGB)。因此,單個圖像將有三個這樣的矩陣。
安裝
注意:由于我們將通過Python使用OpenCV,因此隱含的要求是您的工作站上已經安裝了Python(版本3)。
windows
$ pip install
opencv-python
蘋果系統
$ brew install
opencv3 --with-contrib --with-python3
Linux
$ sudo apt-get
install libopencv-dev python-opencv
要檢查安裝是否成功,請在Python Shell或命令提示符中運行以下命令:
import cv2
您應該知道的一些基本知識
在我們繼續在應用程序中使用圖像處理之前,重要的是要了解哪種操作屬于此類,以及如何進行這些操作。這些操作以及其他操作將在以后的應用程序中使用。
對于本文,我們將使用以下圖像:
注意:為了在本文中顯示圖像,已對圖像進行了縮放,但是我們使用的原始大小約為1180x786。
您可能已經注意到圖像當前是彩色的,這意味著它由三個顏色通道表示,即紅色,綠色和藍色。我們將圖像轉換為灰度圖像,并使用下面的代碼將圖像分為單獨的通道。
查找圖像細節
在使用imread()函數加載圖像后,我們可以檢索有關圖像的一些簡單屬性,例如像素數和尺寸: print("Image
Properties")
print("- Number of Pixels: " + str(img.size))
print("- Shape/Dimensions: " + str(img.shape))
輸出:
Image Properties
- Number of Pixels: 2782440
- Shape/Dimensions: (1180, 786, 3)
將圖像分成單獨的通道
現在,我們將使用OpenCV將圖像分為紅色,綠色和藍色分量,顯示它們:
cv2_imshow(red)
# 顯示紅色通道
cv2_imshow(blue) #顯示藍色通道
cv2_imshow(green) #顯示綠色通道
cv2_imshow(img_gs) # 顯示灰色版本
為簡便起見,我們只顯示灰度圖像。
灰度圖像:
圖像閾值
閾值的概念非常簡單。如上面在圖像表示中所討論的,像素值可以是0到255之間的任何值。假設我們希望將圖像轉換為二進制圖像,即為像素分配0或1的值。為此,我們可以執行閾值化。例如,如果閾值(T)值為125,則所有值大于125的像素將被分配值為1,所有值小于或等于該值的像素將被分配值為0。通過代碼獲得更好的理解。
用于閾值的圖像:
import cv2
cv2_imshow(threshold)
如您所見,在生成的圖像中,已經建立了兩個區域,即黑色區域(像素值0)和白色區域(像素值1)。事實證明,我們設置的閾值正好在圖像的中間,這就是為什么在此處劃分黑白值的原因。
應用領域
#1:去除圖像中的噪點
既然您已經基本了解了什么是圖像處理及其用途,那么讓我們繼續學習它的一些特定應用程序。
在大多數情況下,我們收集的原始數據中有噪點,即使圖像難以感知的不良特征。盡管這些圖像可以直接用于特征提取,但是算法的準確性會受到很大影響。這就是為什么在將圖像處理傳遞給算法之前對其進行圖像處理以獲得更好的準確性的原因。
噪聲有很多不同的類型,例如高斯噪聲,胡椒噪聲等。我們可以通過應用濾鏡來去除圖像中的噪聲,或者將噪聲降到最低,或者至少將其影響降到最低。濾波器也有很多選擇,每個都有不同的強度,因此對于特定類型的噪聲來說是最佳選擇。
為了正確理解這一點,我們將在上面考慮過的玫瑰圖像的灰度版本中添加“鹽和胡椒”噪聲,然后嘗試使用不同的濾鏡從嘈雜的圖像中去除該噪聲,然后看看哪個是最好的-適合那種類型。
import numpy as np
cv2.imwrite('sp_05.jpg', sp_05)
好吧,我們在玫瑰圖像中添加了噪點,現在看起來是這樣:
嘈雜的圖像:
現在讓我們在其上應用不同的濾波器,并記下我們的觀察結果,即每個濾波器降低噪聲的程度。
帶有銳化內核的算術濾波器
# 對噪音圖像進行濾波
sharpened_img = cv2.filter2D(sp_05, -1, kernel_sharpening)
cv2_imshow(sharpened_img)
通過對帶有噪聲的圖像應用算術濾波器,生成的圖像如下所示。與原始灰度圖像進行比較后,我們可以看到它使圖像亮度過高,也無法突出玫瑰上的亮點。因此,可以得出結論,算術濾波器無法去除噪聲。
算術濾波器輸出:
中點濾波器
print("\n\n---Effects
on S&P Noise Image with Probability 0.5---\n\n")
midpoint(sp_05)
將中點濾鏡應用到噪聲的圖像上的結果圖像如下所示。與原始灰度圖像進行比較后,我們可以看到,就像上面的核方法一樣,圖像亮度過高。但是,它可以突出玫瑰上的亮點。因此,可以說它是比算術濾波器更好的選擇,但仍然不能完全恢復原始圖像。
諧諧波均值濾波器
注意:可以在網上輕松找到這些過濾器的實現,并且它們的工作原理超出了本教程的范圍。我們將從抽象/更高的層次來研究應用程序。
\
print("\n\n--- Effects on S&P Noise Image
with Probability 0.5 ---\n\n")
cv2_imshow(contraharmonic_mean(sp_05, (3,3), 0.5))
下面顯示了在噪聲下對圖像應用Contraharmonic Mean Filter 所得到的圖像。與原始灰度圖像進行比較后,我們可以看到它已復制了幾乎與原始圖像完全相同的圖像。其強度/亮度級別相同,并且也突出了玫瑰上的亮點。因此,我們可以得出結論,對諧波均值濾波器在處理鹽和胡椒噪聲方面非常有效。
既然我們已經找到了從嘈雜的圖像中恢復原始圖像的最佳過濾器,那么我們可以繼續下一個應用程序了。
2:使用Canny Edge Detector進行邊緣檢測
到目前為止,我們一直在使用的玫瑰圖像具有恒定的背景,即黑色,因此,對于該應用程序,我們將使用不同的圖像以更好地顯示算法的功能。原因是如果背景恒定,則邊緣檢測任務將變得非常簡單,我們不希望這樣做。
我們在本教程的前面討論了cat分類器,讓我們向前看這個示例,看看圖像處理如何在其中發揮不可或缺的作用。
在分類算法中,首先會掃描圖像中的“對象”,即,當您輸入圖像時,算法會在該圖像中找到所有對象,然后將它們與您要查找的對象的特征進行比較。如果是貓分類器,它將對圖像中找到的所有對象與貓圖像的特征進行比較,如果找到匹配項,它將告訴我們輸入圖像包含貓。
由于我們以cat分類器為例,因此公平地使用cat圖像是公平的。下面是我們將使用的圖像:
用于邊緣檢測的圖像:
import cv2
import numpy as np
from matplotlib import pyplot as plt
#顯示兩個圖片
plt.show()
邊緣檢測輸出:
如您所見,圖像中包含對象的部分(在這種情況下是貓)已通過邊緣檢測點到/分開了。現在您必須要知道,什么是Canny
Edge Detector,它是如何實現的?現在讓我們討論一下。
要理解上述內容,需要討論三個關鍵步驟。首先,它以與我們之前討論的相似方式對圖像執行降噪。其次,它在每個像素處使用一階導數來查找邊緣。其背后的邏輯是存在邊緣的點處,強度會突然變化,這會導致一階導數的值出現尖峰,從而使該像素成為“邊緣像素”。
最后,它執行磁滯門限;上面我們說過,邊上的一階導數的值有一個峰值,但是我們沒有說明峰值需要多高才能將其分類為邊緣-這稱為閾值!
在本教程的前面,我們討論了簡單的閾值化。磁滯閾值是對此的改進,它使用兩個閾值而不是一個。其背后的原因是,如果閾值太高,我們可能會錯過一些實際邊緣(真負值),而如果閾值太低,我們會得到很多歸類為實際上不是邊緣的邊緣(假正值)的點。)。將一個閾值設置為高,將一個閾值設置為低。所有高于“高閾值”的點都被標識為邊緣,然后評估所有高于低閾值但低于高閾值的點;被標識為邊的點附近或與之相鄰的點也被標識為邊,其余部分被丟棄。
這些是Canny Edge Detector算法用于識別圖像邊緣的基本概念/方法。
結論
在本文中,我們學習了如何在Windows,MacOS和Linux等不同平臺上安裝OpenCV(用于Python圖像處理的最流行的庫),以及如何驗證安裝是否成功。
我們繼續討論了什么是圖像處理及其在機器學習的計算機視覺領域中的用途。我們討論了一些常見的噪聲類型,以及如何在應用程序中使用圖像之前使用不同的濾鏡將其從圖像中去除。
此外,我們了解了圖像處理如何在諸如“對象檢測”或“分類”之類的高端應用中發揮不可或缺的作用。
總結
以上是生活随笔為你收集整理的使用opencv和python进行智能图像处理_使用OpenCV在Python中进行图像处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无短板!真我GT Neo5 SE官宣搭载
- 下一篇: 作为文房四宝之一古代的墨都是黑色的吗?蚂