4

我在基于文本数字的图像上应用阈值。使用skimage.filters.try_all_threshold7 种阈值算法得到应用。我能够得到结果,但我正在考虑如何只选择 1 个结果将结果传递给下一个过程/动态选择 1 个最佳结果。

4

1 回答 1

1

您需要定义原始图像和二值化图像之间的相似性度量,然后选择最大化该度量的阈值方法。

演示

以下代码只是旨在让您走上正确的轨道。请注意,该函数similarity返回一个随机数,而不是一个合理的相似性度量。您应该自己实现它或用适当的函数替换它。

import numpy as np
from skimage.data import text
import skimage.filters
import matplotlib.pyplot as plt

threshold_methods = [skimage.filters.threshold_otsu,
                     skimage.filters.threshold_yen,
                     skimage.filters.threshold_isodata,
                     skimage.filters.threshold_li,
                     skimage.filters.threshold_mean,
                     skimage.filters.threshold_minimum,
                     skimage.filters.threshold_mean,
                     skimage.filters.threshold_triangle,
                     ]

def similarity(img, threshold_method):
    """Similarity measure between the original image img and and the
    result of applying threshold_method to it.
    """
    return np.random.random()

results = np.asarray([similarity(text(), f) for f in threshold_methods])    
best_index = np.nonzero(results == results.min())[0][0]    
best_method = thresholding_methods[best_index]
threshold = best_method(text())
binary = text() >= threshold

fig, ax = plt.subplots(1, 1)
ax.imshow(binary, cmap=plt.cm.gray)
ax.axis('off')
ax.set_title(best_method.__name__)
plt.show(fig)

等数据

编辑

显然,随机选择阈值方法是没有意义的(就像我在上面的玩具示例中所做的那样)。相反,您应该实现一个相似性度量,它允许您自动选择最有效的算法。一种可能的方法是计算错误分类误差,即错误分配给前景的背景像素的百分比,相反,错误分配给背景的前景像素的百分比。由于误分类误差是一种相似性度量而不是相似性度量,因此您必须选择使该度量最小化的方法,如下所示:

best_index = np.nonzero(results == results.min())[0][0]

请查看本文,了解有关此方法和其他阈值性能评估方法的详细信息。

于 2018-04-14T21:00:54.540 回答