如何确定边界框的高度以从字体图像中提取字形?

时间:2016-11-13 21:52:24

标签: python c graphics fonts

我有一个高而窄的图像,它有一个可打印的字符(ASCII 32到126),每行一个,从GIMP导出为' c' file:我使用它为嵌入式系统构建每像素1位字体结构。

/* GIMP RGB C-Source image dump (font.c) */

static const struct {
  unsigned int       width;
  unsigned int       height;
  unsigned int       bytes_per_pixel; /* 3:RGB, 4:RGBA */
  unsigned char      pixel_data[32 * 2400 * 3 + 1];
} gimp_image = {
  32, 2400, 3,
  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
...

我想找出3个描述的参数,行高,行间距和起始行偏移量。

我编写的代码告诉我图像中的哪些行是空白的:

#include "font.c"

#include <stdio.h>

struct image_attributes {
    unsigned int width, height, stride;
};

int main(int argc, char **argv)
{
    const struct image_attributes * const ia = (const struct image_attributes *)&gimp_image;
    unsigned int line_number, last_line, min_seperation;
    int last_state;

    min_seperation = UINT_MAX;

    for (line_number = 0; line_number < ia->height; line_number++) {
            const unsigned char * data;
            unsigned int line_width;
            int new_state;
            size_t index = line_number * ia->stride * ia->width;

            for (data = gimp_image.pixel_data + index, line_width = 0; *data && line_width < ia->width; line_width++, data += ia->stride) {
            }
            new_state = line_width < ia->width;
            if (!line_number) {
                    last_state = new_state ^ 1;
                    last_line = line_number;
            }

            if (last_state != new_state) {
                    if (!new_state) {
                            printf("%4d - ", line_number);
                    } else {
                            unsigned seperation = line_number - last_line;
                            printf("%4d = %d\n", line_number, seperation);
                            if (min_seperation > seperation) {
                                    min_seperation = seperation;
                            }
                    }
                    last_line = line_number;
            }
            last_state = new_state;
    }

    printf("%4d = %d\n", line_number, line_number - last_line);

    printf("\nMinimum Seperation = %d\n", min_seperation);
    return 0;
}

有了这个,我试图找出我的算法是什么。我将首先提供行高(在两行分隔的两个相似的字形之间),但我想想有一种方法可以做到这一点,而不需要先验信息。

我考虑的一个想法是查看连续的空行块之间的公约数。我认为这可能会导致投票机制,从而可以确定最有可能的线高,并从那里开始对空白行数据进行混叠以找到最佳拟合。

对于可能成功的方法的想法将不胜感激:我只限于我在Linux命令行中使用的内容(即&#39; c&#39;,Python,Perl等)

0 个答案:

没有答案