使用OpenCV進行顏色分割


點擊上方AI算法與圖像處理」,選擇加"星標"或「置頂」python

重磅乾貨,第一時間送達算法


在濾波、變換、縮放等任務中,圖像分割具備重要的意義。圖像分割是將不一樣的對象劃分爲不一樣的部分,並將這些區域以明顯的顏色或者記號標記出來。圖像分割是使用輪廓、邊界框等概進行其餘高級計算機視覺任務(例如對象分類和對象檢測)的基礎。良好的圖像分割爲咱們後續的圖像分類以及檢測奠基了基礎。

在計算機視覺中主要有3種不一樣的圖像分割類型:
1.顏色分割或閾值分割
2.語義分割
3.邊緣檢測

在本文裏,咱們將介紹基於顏色的圖像分割,並經過OpenCV將其實現。 小夥伴 可能會問,當咱們擁有像Caffe和Keras這樣的工具時,爲何要使用擁有21年曆史的OpenCV庫。 與Caffe和Keras等現代SOTA DL方法相比,OpenCV雖然在準確性方面有一些落後,可是運行速度相較於上述方法具備得天獨厚的優點。
跨框架進行圖像分類任務的CPU性能比較

即便 使 最著名的神經網絡框架之一的YOL Ov 3進行對象檢測時,其運行速度也是不盡如人意的 此外, Darknet使用OpenMP(應用程序編程接口)進行編譯的時間幾乎是OpenCV的18倍。這更加說明了使用OpenCV的速度是比較快速的。
在OpenCV和Darknet上進行YOLOv3培訓時CPU性能

顏色分割可用於檢測身體腫瘤、從森林或海洋背景中提取野生動物的圖像,或者從單一的背景圖像中提取其餘彩色物體。下面幾幅圖是圖像分割的幾個典型示例。:

醫學中的顏色分割

     
    
顏色分割示例

從以上示例中能夠看出,儘管OpenCV是一種更快的方法,可是它對於圖像的分割結果並非很是的理想,有時會出現分割偏差或者錯誤分割的狀況

接下來咱們將介紹如何經過OpenCV對圖像進行顏色的分割。這裏咱們有一張含有鳥的圖片,咱們的目標是經過顏色分割嘗試從圖片中提取這隻鳥。

含鳥的圖片

首先咱們導入完成該任務所需的全部庫和這張圖像:
import cv2 as cvimport matplotlib.pyplot as pltfrom PILimport Image!wget -nv https://static.independent.co.uk/s3fs-public/thumbnails/image/2018/04/10/19/pinyon-jay-bird.jpg -O bird.pngimg = Image.open('./bird.png')

接下來咱們使用濾波器對該圖像進行預處理,對圖像進行模糊操做,以減小圖像中的細微差別。在OpenCV中提供了4個內置的濾波器,以知足用戶對圖像進行不一樣濾波的需求。這4種濾波器的使用方式在下面的代碼中給出。 可是,針對於本文中須要分割的圖像,咱們並不須要將4種濾波器都使用。

blur = cv.blur(img,(5,5))blur0=cv.medianBlur(blur,5)blur1= cv.GaussianBlur(blur0,(5,5),0)blur2= cv.bilateralFilter(blur1,9,75,75)

下圖是圖像濾波模糊後的結果:
模糊後的圖像

若是小夥伴對圖像濾波感興趣,能夠在這裏進行了解 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_filtering/py_filtering,這裏再作過多的介紹。

接下來咱們須要將圖像從BGR(藍綠色紅色)轉換爲HSV(色相飽和度值)。爲何咱們要從BGR空間中轉到HSV空間中?由於像素B,G和R的取值與落在物體上的光相關,所以這些值也彼此相關,沒法準確描述像素。相反,HSV空間中,三者相對獨立,能夠準確描述像素的亮度,飽和度和色度。
hsv = cv.cvtColor(blur2, cv.COLOR_BGR2HSV)
這個操做看似很 ,但當咱們嘗試找到要提取的閾值或像素範圍時,它會使咱們的工做變得更加簡單。

接下來是「顏色分割」的最重要一步,即「閾值分割」。這裏咱們將肯定要提取的全部像素的閾值。 使用OpenCV 進行顏色分割中最重要步 驟—— 閾值分割 ,這多是一個至關繁瑣的任務。 即便咱們 可能想到經過使用顏色選擇器工具來了解像素值,可是 仍然須要進行不斷的嘗試,以便在全部像素中獲取指望的像素,有些時候這也多是一項艱鉅的任務。 具體操做以下:
low_blue = np.array([55, 0, 0])high_blue = np.array([118, 255, 255])mask = cv.inRange(hsv, low_blue, high_blue)
上面代碼中最後一行的「Mask」將全部不在描述對象範圍內的其餘像素進行覆蓋。程序運行結果以下圖所示:
Mask

接下來,運行最後的代碼以顯示由Mask做爲邊界的圖像。所使用的代碼和程序運行結果在下面給出:
res = cv.bitwise_and(img,img, mask= mask)
從顏色分割中提取圖像

那麼經過上面的方式,咱們就實現了基於顏色的圖像分割,感興趣的小夥伴們能夠經過上面的代碼和步驟進行嘗試,看看可否知足本身的圖像分割需求。

最後的最後求一波分享!編程

   
     
 
    
    
    
     
     
              
     
 
    
回覆「TF2」,獲取
《Scikit-Learn、Keras 與 TensorFlow 機器學習實用指南》第二版 PDF

endswift


我的微信
請註明: 地區+學校/企業+研究方向+暱稱
若是沒有備註不拉羣!

本文分享自微信公衆號 - AI算法與圖像處理(AI_study)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。微信

相關文章
相關標籤/搜索