目錄
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 從字面意思上理解就是讓計算機根據影象的語義來進行分割,例如讓計算機在輸入下面左圖的情況下,能夠輸出右圖。語義在語音識別中指的是語音的意思,在影象領域,語義指的是影象的內容,對意思的理解,並對不同部分進行標註,圖中紅色...