我要判斷這個bean是正常還是缺陷檢測缺陷豆。 我試圖使用Canny方法(找到邊緣)等等......但我失敗了。 我只是用形狀來解決它(破碎的豆&不定形的豆...) 請給我一些想法來解決它。
對不起,我的英語不是我的第一語言。
我要判斷這個bean是正常還是缺陷檢測缺陷豆。 我試圖使用Canny方法(找到邊緣)等等......但我失敗了。 我只是用形狀來解決它(破碎的豆&不定形的豆...) 請給我一些想法來解決它。
對不起,我的英語不是我的第一語言。
在圖像中「填充裂縫」最廣泛使用的方法之一是擴張腐蝕。簡單地說,你可以讓你的二值圖像在邊緣「成長」,因此裂縫被填滿,然後你扭轉過程並使邊緣「收縮」 - 但是,由於裂紋已經被填滿,所以沒有關於他們留在圖像中,所以他們保持填充。也許,你可以使用它,然後看看你的原始圖像和擴大腐蝕後的圖像之間的差異:如果幾乎沒有裂紋,那麼幾乎沒有差別,如果有大量裂紋,有很大的區別。
例如。讓我們將圖像轉換爲二進制黑色和白色口罩:
def get_th_binary_mask(img):
gs = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gs, 0, 255, cv2.THRESH_BINARY)
mask = np.zeros(thresh.shape, np.uint8)
mask[thresh == 255] = 0
mask[thresh == 0] = 1
return mask
現在,只要求和矩陣,這讓我們的白色像素數的元素,擴張,侵蝕,和再次,減去的款項:
def get_de_difference(binary_image):
s_before = np.sum(binary_image)
kernel = np.ones((17, 17), np.uint8)
d = cv2.dilate(binary_image, kernel, 1)
d = cv2.erode(d, kernel, 1)
s_after = np.sum(d)
return abs(s_after - s_before)
對於「好」豆它使72個像素不同,對於「壞」一個它給1158
可以通過使用更復雜的閾值函數得到進一步改進,例如,基於大津和抓鬥:
def get_gc_binary_mask(img):
gs = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gs, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
mask = np.zeros(thresh.shape, np.uint8)
mask[thresh == 255] = cv2.GC_PR_BGD
mask[thresh == 0] = cv2.GC_FGD
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
cv2.grabCut(img, mask, (0, 0, 1365, 767), bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_MASK)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
return mask2
使用它而不是上一個給出的「良好」bean只有1個像素的差異(儘管是一個不幸的神器 - 見下文),而對於「壞」的豆它給741。改變你的照片的背景,在拍攝你的照片和使用色度鍵控之前,先將一些明亮的綠色/藍色表單放在那裏。
這是從左到右的樣子:原始圖像(第1列),基本閾值,擴張,腐蝕,otsu/grabcut閾值,擴張,腐蝕。第2列和第4列之間以及第5列和第7列之間的區別是重要的。
這個問題非常含糊。如果你有一大堆正常和缺陷的豆子,你可以使用TensorFlow來訓練AI。 否則,我會檢查長軸和短軸之間的比率,因爲有缺陷的bean看起來比較正常。 – Stein
感謝您的評論。我有一大堆豆子,所以我嘗試使用kNN(k-最近鄰居)。得到一些想法,我問。軸的比例好。但是,我想知道如何感知橢圓的裂紋部分。 – Taeyoon
計算重心(scipy做到這一點),然後通過重心做一些切線。如果其中一條線形帽子有兩個凸起,那它就是一個破碎的豆子,否則就沒事了。 – Stein