我有以下三种不同书写工具的笔迹样本:
看一下这篇文章,我可以看出前两个和最后两个之间有明显的区别。我的目标是确定每个字母的笔画粗细的近似值,这样我就可以根据它们的厚度或厚度进行分组。
到目前为止,我已尝试调查stroke width transform,但我一直在努力将其转化为我的榜样。
我能够对图像进行预处理,这样我就可以只使用相关测试的轮廓了。例如,最后一行是 thick :
答案 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)
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)
从分布图可以推断出图像中可能有三种可用的文本字体大小-[3、15、24]