从直方图密度自动查找最佳图像阈值

bhe*_*ers 7 python opencv image-processing histogram

我希望在显示器上执行光学字符识别(OCR),并希望程序在不同的光照条件下工作.为此,我需要处理和阈值图像,使每个数字周围没有噪声,允许我检测数字的轮廓并从那里执行OCR.我需要使用的阈值适应这些不同的光照条件.我尝试过自适应阈值处理,但我无法让它工作.

我的图像处理很简单:加载图像(i),灰度i(g),将直方图均衡应用于g(h),并将二进制阈值应用于阈值= t的h.我已经使用了几个不同的数据集,并发现使OCR工作的最佳阈值一致地位于(h)的直方图中的最高密度范围内(没有间隙的图的唯一部分).直方图(h). 值t = [190,220]对于OCR是最佳的

直方图(h).值t = [190,220]对于OCR是最佳的.可以在此处找到描述我的问题的更完整的图像集:http://imgur.com/a/wRgi7

我当前的解决方案,但有点笨拙和缓慢,检查:

    1. There must be 3 digits
    2. The first digit must be reasonably small in size
    3. There must be at least one contour recognized as a digit
    4. The digit must be recognized in the digit dictionary
Run Code Online (Sandbox Code Playgroud)

除非所有案例都被接受,否则阈值将增加10(从较低值开始)并再次尝试.

我可以识别(h)直方图上的最佳阈值这一事实可能只是确认偏差,但我想知道是否有一种方法可以提取该值.这与我之前使用直方图的方式不同,后者更多的是寻找峰值/谷值.

我正在使用cv2进行图像处理,使用matplotlib.pyplot进行直方图.

Cat*_*ree 0

我还建议使用自动阈值方法,如 Otsu 方法(这里对该方法有很好的解释)。

在 Python OpenCV 中,本教程解释了如何进行 Otsu 的二值化。

如果你想尝试其他自动阈值方法,你可以看看ImageJ / Fiji软件。例如,本页总结了所有已实现的方法。


灰度图像:

灰度

结果:

结果

如果你想重新实现这些方法,你可以查看Auto_Threshold插件的源代码。我在这个演示中使用了斐济。