基于OpenCV實戰(zhàn)的圖像處理:色度分割
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達

通過HSV色階使用彩色圖像可以分割來分割圖像中的對象,但這并不是分割圖像的唯一方法。為什么大多數人偏愛色度而不是RGB / HSV分割?
可以獲得RGB / HSV通道之間的比率。
可以使用由輔助顏色和其他顏色的混合物組成的目標色塊。
我們將色度分割定義為利用RG通道的色度空間從圖像中提取目標的過程。后者構成了一個二維顏色表示,它忽略了與強度值相關的圖像信息。我們通過觀察不同顏色通道的比例來實現這一點,并使用標準化的RGB空間來映射它。因此,為了計算圖像的RG色度,我們使用以下方程式:

我們主要只看r和g方程,因為從那里我們可以直觀地計算b通道,讓我們使用我們的老朋友Python將色度分割付諸實踐。在繼續(xù)執(zhí)行之前,請安裝以下庫:
from skimage.io import imread, imshowimport matplotlib.pyplot as pltimport numpy as np
本文實踐操作將使用此圖像:

圖像處理步驟:
步驟1:計算圖像的RG色度
這是通過使用引言中定義的方程式完成的。
步驟2:計算顏色值的2D直方圖(原始圖像)
這是通過使R和色度值均變平并將其輸入hist2d函數中來實現的。
通過這一點,可以注意到什么顏色或一組顏色構成了我們的圖像。
步驟3:選擇參考圖片補丁
從感興趣的對象生成補丁。在這種情況下,我們將草莓細分。因此,將要選擇的補丁將是草莓的補丁。
步驟4:計算補丁的RG色度
重復步驟1,但在步驟3中使用圖像補丁
步驟5:計算顏色值的2D直方圖(色標)
重復步驟2,但在步驟3中使用圖像
到目前為止,我們已經獲得了相關圖像的RG色度值。現在,我們進行下一步-參數分割。
第6步:參數細分
此步驟要求我們擬合高斯分布,該分布將確定屬于感興趣顏色的像素。在執(zhí)行此操作之前,應從感興趣的對象(參考補?。┯嬎闫骄岛蜆藴势?。然后將這些反饋給高斯分布函數。
步驟1-6的代碼實現如下實現:
#image chromaticity valuesfruits_R = fruits[:,:,0]*1.0/fruits.sum(axis=2)fruits_G = fruits[:,:,1]*1.0/fruits.sum(axis=2)#patchpatch_strw = fruits[60:90,50:90,:]#patch chromaticity valuespatch_R = patch_strw[:,:,0]*1.0/patch_strw.sum(axis=2)patch_G = patch_strw[:,:,1]*1.0/patch_strw.sum(axis=2)#mean and stdev calculation of patchstd_patch_R = np.std(patch_R.flatten())mean_patch_R = np.mean(patch_R.flatten())std_patch_G = np.std(patch_G.flatten())mean_patch_G = np.mean(patch_G.flatten())#gaussian functiondef gaussian(p,mean,std):return np.exp(-(p-mean)**2/(2*std**2))*(1/(std*((2*np.pi)**0.5)))x = np.linspace(0,1)y = gaussian(x,mean_patch_R,std_patch_R)#plottingfig, ax = plt.subplots(2, 3, figsize=(20, 7))ax[0,0].scatter(fruits_R.flatten(),fruits_G.flatten())ax[0,0].set_title('RG Chromaticity', size=14)ax[0,1].hist2d(fruits_R.flatten(), fruits_G.flatten(),bins=100,cmap='binary');ax[0,1].set_title('Color Values 2D Histogram', size=14)ax[0,2].imshow(patch_strw)ax[0,2].set_title('Strawberry Patch', size=14)ax[1,0].scatter(patch_R.flatten(),patch_G.flatten())ax[1,0].set_title('Patch RG Chromaticity', size=14)ax[1,1].hist2d(patch_R.flatten(), patch_G.flatten(),bins=100,cmap='binary')ax[1,1].set_title('Patch Color Values 2D Histogram', size=14)ax[1,2].plot(x,y)ax[1,2].set_title('Gaussian Plot', size=14)fig.suptitle('Strawberry', size = 30)

綜上所述,類似于彩色圖像分割方法,存在一個任意確定的閾值。嘗試并嘗試使用這些值,然后選擇將返回最理想輸出的值。同樣,在最終圖中,盡管草莓被清楚地分割了,但仍然捕獲了無關的信息。這是進行形態(tài)學操作以方便進一步清潔圖像的地方,因此分割與以往一樣準確。
— — 完 — —

交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據研究方向邀請進入相關微信群。請勿在群內發(fā)送廣告,否則會請出群,謝謝理解~

