所需模块
numpy 1.18.1
PIL.Image 7.1.2
matplotlib 3.1.3
调参目标
上一节的binarization_adjusted函数有两个threshold参数,需要选定一组最合适的参数来保证第一步修边效果与第二步二值化效果。
整体感知
threshold1
该参数主要控制修边阈值,但在调参时发现其对第一步输出效果也有一定影响,当数值过于大时(大于等于130),第一步输出的图像中会夹杂很多黑点。
但如果数值较小(小于等于60),则会出现笔画缺失的情况。
原图
threshold1=60时第一次输出
第二次输出
可以看到“10”指数上的“7”被吞成了“1”,这对识别是非常不利的。
同时当threshold1增大时可以看到第一步输出的图笔画部分是逐渐突出显示的(黑色越来越深),这对第二步二值化也是有利的。
因此第一个参数较大时效果较好。
threshold2
第二个参数是二值化时的阈值,若像素点的值高于这个阈值则该点取值为255(白色),低于这个值则取值为0(黑色)。
当该值较大时(大于120)显示的黑像素点越多,容易使原图出现黑点。
如果该值太小(小于等于80)则空缺笔画出现较多。
综上,可以对两个阈值参数确定大致的范围。再对范围内的阈值进行组合来分别比较预处理效果。
调参准备
选定两个阈值的范围为
threshold1:85-120
threshold2:95-120
通过numpy数组中的arange与meshgrid来生成两个阈值的组合。
th1=np.arange(85,125,5)
th2=np.arange(95,125,5)
trials=[i for i in zip(np.meshgrid(th1,th2)[0].flatten(),np.meshgrid(th1,th2)[1].flatten())]
meshgrid在这里的作用就是搭配两个数组,生成所有搭配方式。下面将组合效果进行绘制,可以更加直观地观察搭配结果。
运行
plt.scatter(np.meshgrid(th1,th2)[0],np.meshgrid(th1,th2)[1])
结果
接下来分别查看各个图片输出情况
for group in trials:
t1,t2=group
print('*'*10)
print(t1,t2)
for each in path1:
path=path0+each
get_image(path,4096,t1,t2)
图片很多,输出比较慢。
调参结果
总体来说,当参数一比较小的时候,背景较亮的图容易缺失笔画,参数一较大时效果较好,但当两个参数都较大时,笔画较粗的线或者比较模糊的照片容易出现连片现象(笔画聚成一片黑),如下图。
同时,对于笔画较细的或者细节不明显的图像来说效果较差(参数较小时容易缺失,较大时容易连片)。
缺失
连片
对于背景较暗的图,需要单独设置参数,因为上面选取的范围下,暗图识别效果都很差。
原图
输出1
输出2
最终,下面几种组合是效果较好的组合
(110,115) (115,115) | (120,115) (115,120) (120,120) | (100,120) (105,120) (110,120) |
---|---|---|
亮图有略微空缺,总体较好 | 粗笔画有点连片,总体较好 | 总体较好 |