我有一个高而窄的图像,它有一个可打印的字符(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等)