有人知道后处理算法从二值化图像中删除鬼对象吗?问题:
当我使用例如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计算每个“集群”的中心,然后根据重新计算的中心将元素重新分配给集群.在每个元素(即像素)是一维的并且仅需要两个簇的简单情况下,阈值仅仅是两个聚类中心的平均值.
我应该补充说,此方法适用于您发布的示例图像,但可能不适用于其他人(例如您在另一个问题中发布的图像).但没有进一步的信息,我认为这个解决方案有效.
输出: