語義分割後處理 消除雜波

2021-10-10 19:49:33 字數 3715 閱讀 6893

目錄

1.簡介

3.需要匯入的包

4.**

語義分割的結果會產生一些誤檢,這些誤檢的目標一般都是小目標,因此使用remove_small_objects()函式,將小目標給濾除掉。

# cv2.thresh_binary:大於閾值,返回最大值;小於等於閾值,返回0

# cv2.thresh_binary_inv:大於閾值,返回0;小於等於閾值,返回最大值

# cv2.thresh_tozero_inv:大於閾值,返回0;小於等於閾值,返回原值

# 類別:0(背景),1(當前車道),2(旁邊車道)

if i == 1:

# 對類1進行二值化,將灰度值不為1的畫素值全置為0

_, binary_image = cv2.threshold(src=binary_image, thresh=1.5, maxval=1, type=cv2.thresh_tozero_inv)

elif i == 2:

# 對類2進行二值化,將灰度值不為2的畫素值全置為0

_, binary_image = cv2.threshold(src=binary_image, thresh=1.5, maxval=2, type=cv2.thresh_binary)

else:

print("類別輸入錯誤,重新檢查,終止執行.")

exit(0)

詳細**如下:

def remove_small_objects(image,orininal_w,orininal_h,num_classes=3,threshold=5000,mode=true):

"""去除分割圖中的小目標

:param image: 語義分割**結果,且要經過以下兩步處理

1. 使用argmax()函式,選取每個通道最大值的索引

2. 去除lettor_box附加的黑邊

:param threshold: 濾除小目標面積的閾值,小目標面積小於該閾值,則將其濾除

建議選擇原圖面積的1/45. threshold = src_area // 45

:param orininal_w 網路輸入原圖寬

:param orininal_h 網路輸入原圖高(不是網路輸入尺寸,是輸入的尺寸)

:param num_classes 語義分割類別數

:return: 濾除小目標後的標籤圖,也可以說是分割結果圖單通道的

"""# 計算閾值,也可以手動設定,而不根據原圖面積動態設定

if mode:

threshold = (orininal_w * orininal_h) // 45

# 將分割結果轉化為pil.image屬性

image = image.fromarray(image)

# 將分割圖尺寸resize為原圖大小

image = image.resize((orininal_w, orininal_h), image.nearest)

# 將image屬性的圖轉化為numpy矩陣

image = np.asarray(image).copy() #要新增copy(),否則沒有許可權賦值操作

# 要返回的濾除小目標後的分割圖,單通道

pre_image = np.zeros(shape=(orininal_h, orininal_w),dtype=np.uint8)

# 迴圈濾除每個類別的雜波

for i in range(1, num_classes):

# 生成二值圖

binary_image = image.copy()

# cv2.thresh_binary:大於閾值,返回最大值;小於等於閾值,返回0

# cv2.thresh_binary_inv:大於閾值,返回0;小於等於閾值,返回最大值

# cv2.thresh_tozero_inv:大於閾值,返回0;小於等於閾值,返回原值

# 類別:0(背景),1(當前車道),2(旁邊車道)

if i == 1:

# 對類1進行二值化,將灰度值不為1的畫素值全置為0

_, binary_image = cv2.threshold(src=binary_image, thresh=1.5, maxval=1, type=cv2.thresh_tozero_inv)

elif i == 2:

# 對類2進行二值化,將灰度值不為2的畫素值全置為0

_, binary_image = cv2.threshold(src=binary_image, thresh=1.5, maxval=2, type=cv2.thresh_binary)

else:

print("類別輸入錯誤,重新檢查,終止執行.")

exit(0)

# 確定連通域,連通域就是單獨的一塊塊區域

# connectivity:確定幾畫素相連,可分為8畫素和4畫素

# num_labels:返回的連通域數量

# labels: 返回的標籤圖,畫素值根據連通域數量來設定,如3個連通域,則畫素值分別為0,1,2,3

# stats: 返回的連通域最小外接矩形(x_min,y_min,w,h,area),以numpy格式儲存,乙個

# 連通域資料佔一行,n個連通域資料,stats shape:[n,5],且在矩陣中的行數,就是

# labels中的畫素值,如連通域a在矩陣中m行(從0開始),則在labels中畫素值為m

# centroids 返回的最小外接矩形的中心點座標,格式和stats一樣

num_labels, labels, stats, centroids = cv2.connectedcomponentswithstats(

binary_image, connectivity=4, ltype=none)

# 去除標籤中的小目標--面積小於閾值的

# connectivity: 1表示4畫素連,2表示8畫素相連

imgs = morphology.remove_small_objects(ar=labels, min_size=threshold, connectivity=1)

# 將保留的大目標賦值到pre_image,最後形成完整分割圖

# 在大目標區域賦值相應的類別索引

pre_image[imgs>0] = np.uint8(i)

return pre_image

語義分割綜述

目前語義分割的流行框架可以分為前端 後端。前端採用fcn定位不同類別的物體,後端採用rf crf mrf 精確定位物體邊界。也就是說,前端解決 是什麼 what 後端解決 在 where 可以把語義分割網路分為兩類 以fcn為代表的編解碼器 encode decode 網路 以deeplab為代表的...

語義分割概述

影象語義分割 一 影象語義分割含義及原理 含義 對分割後的影象加上語義標籤 用不同的顏色代表不同類別的物體 就是給分割後影象中的每一類物體加上標籤,輸入一般是彩色深度 rgb d 影象。要求 1 分割得到的不同區域內部平整,其紋理和灰度有相似性 2 相鄰語義分割區域對分割所依據的性質有明顯的差異 3...

語義分割概述

本文大多來自方便讀 使用 影象語義分割 semantic segmentation 從字面意思上理解就是讓計算機根據影象的語義來進行分割,例如讓計算機在輸入下面左圖的情況下,能夠輸出右圖。語義在語音識別中指的是語音的意思,在影象領域,語義指的是影象的內容,對意思的理解,並對不同部分進行標註,圖中紅色...