數(shù)據(jù)集
最近別人給了我一個(gè)生物數(shù)據(jù)分割的標(biāo)注數(shù)據(jù)集,讓我訓(xùn)練一下,發(fā)現(xiàn)這個(gè)數(shù)據(jù)集比較詭異,圖像格式是tif的16位的浮點(diǎn)數(shù),OpenCV讀取過來(lái)要顯示得先轉(zhuǎn)換,然后它的Mask是PNG的帶透明通道,最坑人的是Mask標(biāo)記都是1、只有相互連接的對(duì)象標(biāo)記才相互不同。官方給出的原始圖像解析以后是這樣:

OpenCV讀取顯示圖像樣本
OpenCV讀取tif格式16位的圖像在于imread的第二個(gè)參數(shù),默認(rèn)情況下會(huì)轉(zhuǎn)換為BGR彩色八位字節(jié)的圖像,如果這樣就是一片漆黑;這里選擇為-1表示不改變?cè)瓐D像的通道數(shù)據(jù)信息,這樣就可以讀取原始圖像數(shù)據(jù)了,然后轉(zhuǎn)換為32f的,再歸一化到0~1之間,直接顯示即可。代碼如下:
importnumpyasnp
img=cv.imread("D:/11111.tif",-1)#uint16
img_16=img.astype(np.float32)
cv.normalize(img_16,img_16,0,1,cv.NORM_MINMAX)
img_16.astype(np.float32)
result=np.uint8(img_16*255)
cv.imwrite('D:/tensor_cv2.jpg',result)

OpenCV讀取顯示Mask圖像
Mask圖像是帶透明通道的RGBA的圖像,但是實(shí)際上所有的標(biāo)注信息只存在于red通道中,所以讀取以后,直接拆分通道,然后把red通道數(shù)據(jù)作為灰度圖像處理,因?yàn)榛叶戎堤土耍@示的時(shí)候我給擴(kuò)大了點(diǎn)倍數(shù),直接把灰度圖像扔到聯(lián)通組件掃描的函數(shù)中,然后就可以看到結(jié)果了。相關(guān)代碼如下:
importnumpyasnp
img=cv.imread("D:/11111.png")#uint16
bb,gg,rr=cv.split(img)
h,w,c=img.shape
print(img.shape,img.dtype)
numOfcons,labels=cv.connectedComponents(rr)
colors=[]
foriinrange(numOfcons):
b=np.random.randint(0,256)
g=np.random.randint(0,256)
r=np.random.randint(0,256)
colors.append((b,g,r))
colors[0]=(0,0,0)
image=np.zeros((h,w,3),dtype=np.uint8)
forrowinrange(h):
forcolinrange(w):
image[row,col]=colors[labels[row,col]]
cv.imshow("coloredlabels",image)
cv.imwrite("D:/opencv_labels.png",image)
cv.imshow("bgr",rr*100)
cv.waitKey(0)
cv.destroyAllWindows()
標(biāo)記的Mask信息原圖

基于聯(lián)通組件查找以后的彩色顯示(注意白色粘連)

對(duì)比與解決
對(duì)比之后發(fā)現(xiàn),OpenCV中聯(lián)通組件掃描以后把不同標(biāo)簽的樣本粘連在一起了,這個(gè)是因?yàn)镺penCV尋找聯(lián)通組件只分為兩種值0為背景,非0就作為前景,不做灰度級(jí)別區(qū)分的聯(lián)通域識(shí)別,所以導(dǎo)致了粘連。這個(gè)時(shí)候,只要用skimage庫(kù)的函數(shù)來(lái)替換OpenCV的聯(lián)通組件掃描就可以避免粘連了,因?yàn)閟kimage庫(kù)的聯(lián)通組件掃描支持獨(dú)立標(biāo)簽分級(jí)。代碼演示如下:
importskimage.io
importskimage.morphology
#Loadoneimageafteruncompressingmasks.zip
gt=skimage.io.imread("D:/11111.png")
#Keepfirstchannelonly
gt=gt[:,:,0]
#Labelindependentconnectedcomponents
gt=skimage.morphology.label(gt)
colors=[]
foriinrange(150):
b=np.random.randint(0,256)
g=np.random.randint(0,256)
r=np.random.randint(0,256)
colors.append((b,g,r))
colors[0]=(0,0,0)
h,w=gt.shape
image=np.zeros((h,w,3),dtype=np.uint8)
forrowinrange(h):
forcolinrange(w):
image[row,col]=colors[gt[row,col]]
#Displayimageoruseasneeded
cv.imshow("coloredlabels",image)
cv.imwrite("D:/labels.png",image)
cv.waitKey(0)
cv.destroyAllWindows()
運(yùn)行結(jié)果對(duì)比 - 可以發(fā)現(xiàn)白色區(qū)域沒有粘連,成功分割!

希望OpenCV遲早有一天可以支持這種分級(jí)的區(qū)域聯(lián)通組件掃描算法。
審核編輯:劉清
-
圖像處理
+關(guān)注
關(guān)注
29文章
1342瀏覽量
59531 -
OpenCV
+關(guān)注
關(guān)注
33文章
652瀏覽量
44799
原文標(biāo)題:新知 | OpenCV4中聯(lián)通組件分析的一個(gè)缺點(diǎn)
文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
OpenCV4.8 CUDA編程代碼教程
OpenCV中自帶組件HighGUI怎么使用?
魯班貓0 -安裝opencv
CMake在Linux 6.1.1-1.0.0中搜索包opencv損壞了嗎?
中聯(lián)通公開招募3G電子渠道合作企業(yè)
基于opencv4和Yolo-Fastest,實(shí)現(xiàn)PC和單片機(jī)通信,控制步進(jìn)電機(jī)捕獲目標(biāo)
使用Raspberry Pi構(gòu)建一個(gè)OpenCV人群計(jì)數(shù)裝置
分享兩個(gè)OpenCV圖像處理與分析的問題
如何在Raspberry Pi 3上安裝OpenCV4庫(kù)
OpenCV4中SIFT算法概述
學(xué)習(xí)OpenCV4的系統(tǒng)化路線圖
OpenCV4中聯(lián)通組件分析的一個(gè)缺點(diǎn)
評(píng)論