发布于 2017-05-30 04:12:34
在图像中“填充裂缝”的最广泛使用的方法之一是膨胀腐蚀。简单地说,你让你的二值图像在边缘“生长”,所以裂缝被填充,然后你反转过程,使它在边缘“收缩”--但是,当裂缝被填充时,图像中就没有关于它们的信息,所以它们被填充了。也许,你可以用它,然后看看你的原始图像和膨胀腐蚀后的图像之间的区别:如果没有什么裂缝,那么就不会有什么不同,如果有很多裂缝,就会有很多不同。
例如。让我们将图像转换为二进制黑白掩码:
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)对于“好”bean,它给出了72个不同的像素,对于它给出的1158个“坏”像素。
可以通过使用更复杂的阈值处理功能来进一步改进,例如,基于Otsu和抓取切割:
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 (尽管有一个不幸的工件-见下文),而对于“坏”的bean,它提供741。或者,如果你可以改变你的图片的背景,只需在那里放置一些明亮的绿色/蓝色的床单,然后采取你的照片和使用色度键。
这就是它的外观,从左到右:原始图像(第1列),基本阈值,膨胀,侵蚀,otsu/地堑阈值,膨胀,侵蚀。重要的是第2栏和第4栏以及第5栏和第7栏之间的区别。

https://stackoverflow.com/questions/44225541
复制相似问题