image-processing - 自适应阈值二值化 : post-processing for removing ghost objects

标签 image-processing

有人知道从二值化图像中去除幽灵对象的后处理算法吗?问题:
当我使用例如 niblack 方法或 bernsen 对图像进行二值化时,
它会产生很多噪音。我在红书或者网络上写过关于二值化的文章,都说Niblack等人的二值化方法需要后期处理,
但是他们没有说它是什么,后处理操作。所以请,如果有人知道,请告诉我。
编辑:
原图:

alt text http://i.piccy.info/i4/20/63/b970ab2ca66e997f421e969a1657.bmp

Bernsen 阈值 winsize 31,对比度差 15:

alt text http://i.piccy.info/i4/32/55/2f1e0293311119986bd49529e579.bmp

Bernsen 阈值 winsize 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 方法窗口 size-31,k_value 0.2:

alt text http://i.piccy.info/i4/c0/fd/1f190077abba2aeea89398358fc0.bmp

编辑2:
如您所见,Niblack 阈值产生了很多噪音。
如果我缩小窗口大小,黑色方块内部会变得有点白。
Bernsen 更好 - 噪音更少,但即使我将对比度差异更大,
但是有一个问题,我现在无法生成图像,换句话说,问题是:
如果图像包含一些颜色接近白色的物体,并且背景为白色,
所以如果有一个区域(例如线)是黑色的,那么这个方法会忽略对象并且结果是错误的。
那是因为 Bernsen 方法使用这个公式:
在每个像素计算对比度差异
差异=maximum_grayscale_value - minimum_grayscale_value
然后用diff计算阈值,
但在我上面写的情况下,我们的最大值为 255
和最小值为 0。
所以阈值为 128,
但实际物体颜色在 128 以上(接近白色)。

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

最佳答案

使用 K-means 完成 Python 程序,K-means 是一种用于寻找最佳量化间隔的工具:

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

关于image-processing - 自适应阈值二值化 : post-processing for removing ghost objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2363245/

相关文章:

python - OpenCV - 使用实时摄像头检测托盘中丢失的硬币

c# - 如何将 32bpp 图像转换为索引格式?

image - 在 matlab 中查找感兴趣对象的总像素?

c++ - 具有散乱字符的图像的倾斜角度检测

c++ - FFmpeg 中 RGB 到 YUV 的转换错误

android - 使用后置摄像头计算场景亮度

python - 我应该在openCV中使用哪种HSV颜色范围来滤除蓝色像素?

python - 如何从图像创建 4D numpy 数组?

c# - 在哪里可以找到 C# 的反锐化蒙版?

opencv - 使用opencv进行图像变形