點擊上方「AI算法與圖像處理」,選擇加"星標"或「置頂」python
重磅乾貨,第一時間送達算法
在濾波、變換、縮放等任務中,圖像分割具備重要的意義。圖像分割是將不一樣的對象劃分爲不一樣的部分,並將這些區域以明顯的顏色或者記號標記出來。圖像分割是使用輪廓、邊界框等概念進行其餘高級計算機視覺任務(例如對象分類和對象檢測)的基礎。良好的圖像分割爲咱們後續的圖像分類以及檢測奠基了基礎。
在本文裏,咱們將介紹基於顏色的圖像分割,並經過OpenCV將其實現。
小夥伴
可能會問,當咱們擁有像Caffe和Keras這樣的工具時,爲何要使用擁有21年曆史的OpenCV庫。
與Caffe和Keras等現代SOTA DL方法相比,OpenCV雖然在準確性方面有一些落後,可是運行速度相較於上述方法具備得天獨厚的優點。
即便
使
用
最著名的神經網絡框架之一的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:img = 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做爲邊界的圖像。所使用的代碼和程序運行結果在下面給出:
res = cv.bitwise_and(img,img, mask= mask)
那麼經過上面的方式,咱們就實現了基於顏色的圖像分割,感興趣的小夥伴們能夠經過上面的代碼和步驟進行嘗試,看看可否知足本身的圖像分割需求。
最後的最後求一波分享!編程
《Scikit-Learn、Keras 與 TensorFlow 機器學習實用指南》第二版 PDF