點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
本文轉(zhuǎn)自:機(jī)器學(xué)習(xí)算法那些事
在濾波、變換、縮放等任務(wù)中,圖像分割具有重要的意義。圖像分割是將不同的對(duì)象劃分為不同的部分,并將這些區(qū)域以明顯的顏色或者記號(hào)標(biāo)記出來。圖像分割是使用輪廓、邊界框等概念進(jìn)行其他高級(jí)計(jì)算機(jī)視覺任務(wù)(例如對(duì)象分類和對(duì)象檢測)的基礎(chǔ)。良好的圖像分割為我們后續(xù)的圖像分類以及檢測奠定了基礎(chǔ)。
在計(jì)算機(jī)視覺中主要有3種不同的圖像分割類型:在本文里,我們將介紹基于顏色的圖像分割,并通過OpenCV將其實(shí)現(xiàn)。小伙伴可能會(huì)問,當(dāng)我們擁有像Caffe和Keras這樣的工具時(shí),為什么要使用擁有21年歷史的OpenCV庫。與Caffe和Keras等現(xiàn)代SOTA DL方法相比,OpenCV雖然在準(zhǔn)確性方面有一些落后,但是運(yùn)行速度相較于上述方法具有得天獨(dú)厚的優(yōu)勢。跨框架進(jìn)行圖像分類任務(wù)的CPU性能比較即使使用最著名的神經(jīng)網(wǎng)絡(luò)框架之一的YOLOv3進(jìn)行對(duì)象檢測時(shí),其運(yùn)行速度也是不盡如人意的。此外,Darknet使用OpenMP(應(yīng)用程序編程接口)進(jìn)行編譯的時(shí)間幾乎是OpenCV的18倍。這更加說明了使用OpenCV的速度是比較快速的。
在OpenCV和Darknet上進(jìn)行YOLOv3培訓(xùn)時(shí)CPU性能顏色分割可用于檢測身體腫瘤、從森林或海洋背景中提取野生動(dòng)物的圖像,或者從單一的背景圖像中提取其他彩色物體。下面幾幅圖是圖像分割的幾個(gè)典型示例。:從以上示例中可以看出,盡管OpenCV是一種更快的方法,但是它對(duì)于圖像的分割結(jié)果并不是非常的理想,有時(shí)會(huì)出現(xiàn)分割誤差或者錯(cuò)誤分割的情況接下來我們將介紹如何通過OpenCV對(duì)圖像進(jìn)行顏色的分割。這里我們有一張含有鳥的圖片,我們的目標(biāo)是通過顏色分割嘗試從圖片中提取這只鳥。首先我們導(dǎo)入完成該任務(wù)所需的所有庫和這張圖像:import cv2 as cvimport matplotlib.pyplot as pltfrom PILimport Image!wget -nv https:img = Image.open('./bird.png')
接下來我們使用濾波器對(duì)該圖像進(jìn)行預(yù)處理,對(duì)圖像進(jìn)行模糊操作,以減少圖像中的細(xì)微差異。在OpenCV中提供了4個(gè)內(nèi)置的濾波器,以滿足用戶對(duì)圖像進(jìn)行不同濾波的需求。這4種濾波器的使用方式在下面的代碼中給出。但是,針對(duì)于本文中需要分割的圖像,我們并不需要將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)
如果小伙伴對(duì)圖像濾波感興趣,可以在這里進(jìn)行了解https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_filtering/py_filtering,這里再做過多的介紹。接下來我們需要將圖像從BGR(藍(lán)綠色紅色)轉(zhuǎn)換為HSV(色相飽和度值)。為什么我們要從BGR空間中轉(zhuǎn)到HSV空間中?因?yàn)橄袼谺,G和R的取值與落在物體上的光相關(guān),因此這些值也彼此相關(guān),無法準(zhǔn)確描述像素。相反,HSV空間中,三者相對(duì)獨(dú)立,可以準(zhǔn)確描述像素的亮度,飽和度和色度。hsv = cv.cvtColor(blur2, cv.COLOR_BGR2HSV)
這個(gè)操作看似很小,但當(dāng)我們嘗試找到要提取的閾值或像素范圍時(shí),它會(huì)使我們的工作變得更加簡單。
接下來是“顏色分割”的最重要一步,即“閾值分割”。這里我們將確定要提取的所有像素的閾值。使用OpenCV進(jìn)行顏色分割中最重要步驟——閾值分割,這可能是一個(gè)相當(dāng)繁瑣的任務(wù)。即使我們可能想到通過使用顏色選擇器工具來了解像素值,但是仍然需要進(jìn)行不斷的嘗試,以便在所有像素中獲取期望的像素,有些時(shí)候這也可能是一項(xiàng)艱巨的任務(wù)。具體操作如下:low_blue = np.array([55, 0, 0])high_blue = np.array([118, 255, 255])mask = cv.inRange(hsv, low_blue, high_blue)
上面代碼中最后一行的“Mask”將所有不在描述對(duì)象范圍內(nèi)的其他像素進(jìn)行覆蓋。程序運(yùn)行結(jié)果如下圖所示:接下來,運(yùn)行最后的代碼以顯示由Mask作為邊界的圖像。所使用的代碼和程序運(yùn)行結(jié)果在下面給出:res = cv.bitwise_and(img,img, mask= mask)
那么通過上面的方式,我們就實(shí)現(xiàn)了基于顏色的圖像分割,感興趣的小伙伴們可以通過上面的代碼和步驟進(jìn)行嘗試,看看能否滿足自己的圖像分割需求。下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~