图像处理 – 自适应阈值二值化:用于删除重影对象的后处理

有人知道后处理算法从二值化图像中删除鬼对象吗?问题:

当我使用例如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(接近白色).

所以我需要使用一些后处理操作来正确地进行二值化.
有什么想法吗?

最佳答案 使用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计算每个“集群”的中心,然后根据重新计算的中心将元素重新分配给集群.在每个元素(即像素)是一维的并且仅需要两个簇的简单情况下,阈值仅仅是两个聚类中心的平均值.

我应该补充说,此方法适用于您发布的示例图像,但可能不适用于其他人(例如您在另一个问题中发布的图像).但没有进一步的信息,我认为这个解决方案有效.

输出:

binary.bmp http://up.stevetjoa.com/binary.bmp

点赞