0

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

在此处输入图像描述

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

到目前为止,我已经尝试研究stroke width transform,但我一直在努力将其转化为我的示例。

我能够对图像进行预处理,这样我就只剩下相关测试的轮廓了。例如,这是最后一行的粗体

在此处输入图像描述

4

3 回答 3

2

cv::findContours我建议像你一样检测轮廓,然后比较边界矩形区域和轮廓区域。写得越厚,系数(contourArea/boundingRectArea)就越大。

于 2017-10-02T20:40:24.333 回答
0

这种方法会帮助你。这将计算笔画宽度。

from skimage.feature import peak_local_max
from skimage import img_as_float


def adaptive_thresholding(image):
    output_image = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,21,2)
    return output_image


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



image = cv2.imread('Small3.JPG', 0)
process_image = adaptive_thresholding(image)
stroke_width(process_image)

于 2020-05-20T13:16:06.440 回答
0

使用SWTloc的 Stroke Width Transform 实现的 python 实现可能会像这样。

完全披露:我是这个库的作者。

编辑:发布 v2.0.0

转换图像

import swtloc as swt

imgpath = 'images/path_to_image.jpeg'
swtl = swt.SWTLocalizer(image_paths=imgpath)
swtImgObj = swtl.swtimages[0]
# Perform SWT Transformation with numba engine
swt_mat = swtImgObj.transformImage(auto_canny_sigma=1.0, gaussian_blurr=False,
                                   minimum_stroke_width=3, maximum_stroke_width=50,
                                   maximum_angle_deviation=np.pi/3)

转换结果


本地化字母

localized_letters = swtImgObj.localizeLetters()

字母本地化


绘制每个字母笔画宽度的直方图

import seaborn as sns
import matplotlib.pyplot as plt

all_sws = []
for letter_label, letter in localized_letters.items():
    all_sws.append(letter.stroke_widths_mean)
sns.displot(all_sws, bins=31)

直方图

从分布图中可以推断出图像中可能存在三种可用文本的字体大小 - [3, 15, 27]

于 2020-09-23T12:32:45.903 回答