使用OpenCV& amp;找到图像中墨迹笔划的宽度。 C ++

时间:2017-10-02 20:38:13

标签: c++ opencv image-processing handwriting-recognition

我有以下三种不同书写工具的笔迹样本:

enter image description here

看一下这篇文章,我可以看出前两个和最后两个之间有明显的区别。我的目标是确定每个字母的笔画粗细的近似值,这样我就可以根据它们的厚度或厚度进行分组。

到目前为止,我已尝试调查stroke width transform,但我一直在努力将其转化为我的榜样。

我能够对图像进行预处理,这样我就可以只使用相关测试的轮廓了。例如,最后一行是 thick

enter image description here

3 个答案:

答案 0 :(得分:2)

我建议您正在使用cv::findContours检测轮廓,然后比较边界矩形区域和轮廓区域。写较大系数的较粗(contourArea / boundingRectArea)将是。

答案 1 :(得分:0)

这种方法将为您提供帮助。这将计算笔划宽度。

def stroke_width(image):
    dist = cv2.distanceTransform(cv2.subtract(255,image), cv2.DIST_L2, 5)
    im = img_as_float(dist)
    coordinates = peak_local_max(im, min_distance=15)
    pixel_strength = []
    for element in coordinates:
        x = element[0]
        y = element[1]
        pixel_strength.append(np.asarray(dist)[x,y])
    mean_pixel_strength = np.asarray(pixel_strength).mean()
    return mean_pixel_strength

答案 2 :(得分:0)

使用SWTloc的Stroke Width Transform实现,为此的python实现可能会这样。完全披露:我是这个图书馆的作者。

from swtloc import SWTLocalizer
from swtloc.utils import imgshow

swtl = SWTLocalizer()
# Stroke Width Transform
imgpath = rawimage_path+'so5_img1.jpg'
swtl.swttransform(imgpaths=imgpath, text_mode = 'lb_df',
                  save_results=True, save_rootpath = 'swtres/',
                  ac_sigma = 1.0, gs_blurr =False,
                  minrsw = 3, maxrsw = 50, max_angledev = np.pi/3)
imgshow(swtl.swt_labelled3C)

enter image description here

all_sws = []
for k,v in swtl.components_props.items():
    all_sws.append(v['sw_median'])
import seaborn as sns
sns.displot(all_sws, bins=31)

enter image description here

从分布图可以推断出图像中可能有三种可用的文本字体大小-[3、15、24]