有人知道后处理算法从二值化图像中删除鬼对象吗?问题: 当我使用例如niblack方法或bernsen二值化图像时, 它会产生很多噪音。我关于二值化的红皮书或互联网文章,他们都说Niblack和其他的二值化方法需要后处理步骤, 但他们并没有说它是什么,后处理操作。所以,如果有人知道,请打电话给我。 编辑: 原始图片:
alt text http://i.piccy.info/i4/20/63/b970ab2ca66e997f421e969a1657.bmp
伯恩森门槛获胜31,对比差15:
alt text http://i.piccy.info/i4/32/55/2f1e0293311119986bd49529e579.bmp
伯尔森门槛获胜31,对比差31:
alt text http://i.piccy.info/i4/2a/13/774508890030b93201458986bbd2.bmp
Niblack方法窗口大小-15,k_value 0.2:
alt text http://i.piccy.info/i4/12/4f/fa6fc09bcba7a7e3245d670cbfa5.bmp
Niblack方法窗口大小-31,k_value 0.2:
alt text http://i.piccy.info/i4/c0/fd/1f190077abba2aeea89398358fc0.bmp
EDIT2: 如您所见,Niblack阈值会产生很多噪音。 如果我减小窗口尺寸,黑色方块内部会变成白色。 伯尔森更好 - 噪音更小,但即使我使对比度差异更大, 但是有一个问题,我现在无法生成图像,在文字中,问题是: 如果图像包含一些颜色接近白色的对象,并且背景为白色, 因此,如果有一个黑色区域(对于检查线),则此方法忽略对象,结果是错误的。 那是因为Bernsen方法使用这个公式: 在每个像素处计算对比度差异 diff = maximum_grayscale_value - minimum_grayscale_value 然后差异用于计算阈值, 但在我上面写的情况下,我们的最大值为255 最小值为0。 因此阈值将为128, 但实际物体颜色高于128(接近白色)。
所以我需要使用一些后处理操作来正确地进行二值化。 有什么想法吗?
答案 0 :(得分:2)
使用K-means完成Python程序,这是一种用于查找最佳量化间隔的工具:
from scipy.misc import imread, imsave
def kmeans(file_in, file_out, maxiter):
X = imread(file_in)
thresh = X.mean()
for iter in range(maxiter):
thresh = (X[X<thresh].mean() + X[X>=thresh].mean())/2.0
X[X<thresh] = 0
X[X>=thresh] = 255
imsave(file_out, X)
return X, thresh
在每次迭代期间,K-means计算每个“集群”的中心,然后根据重新计算的中心将元素重新分配给集群。在每个元素(即像素)是一维的简单情况下,只需要两个聚类,阈值就是两个聚类中心的平均值。
我应该补充说,此方法适用于您发布的示例图像,但可能不适用于其他人(例如您在其他问题中发布的图像)。但是如果没有进一步的信息,我认为这个解决方案有效。
输出:
答案 1 :(得分:0)
听起来你的问题确实是一个细分问题......你正在抽出的图像类型是什么?
顺便说一下,我如何评论这个问题而不是回答它?
答案 2 :(得分:0)
问题可能已经过时,但对于那些仍然无法找到答案的人来说,在这些情况下应该使用的方法,即快速变化的背景图像不是局部灰度级阈值,而是局部特征阈值,它分析图像不是通过局部灰度级而是使用Stroke Width方法。你可以在网上寻找它。