2015-01-21 62 views
0

我有一大串单词,我期待以有趣的方式显示统计信息。我想打印每个单词,但在图像轮廓的边缘处有断点(由某种颜色指定),以使所有文本全部形成图像。将一大块文字变成图像的算法? (由图像边缘定义)

我意识到如果没有一个例子很难理解,所以我想要实现的几乎可以在this image中看到,其中爱丽丝梦游仙境的文本被打印出来形成爱丽丝和书中其他生物的图像;在http://www.litographs.com/

上有很多其他示例我想通过编程实现上述功能,但我不确定最初是从哪里开始的。我开始写出一个脚本来解析我的图像,并打印出与透明像素相对应的文本 - 但我很快意识到,也许我不是真的想要基于每个像素,而是可能是一个边缘基于检测的方法会更好。我也不确定字体大小是如何影响的。

是否有算法,我不知道这可能会帮助我实现这一目标?我正在使用Python/C,但我很高兴听到任何解决方案。

+0

如果您正在寻找能够实现“类似”的算法,那么您会失败,因为算法是确定性的。相反,请正式确定您的要求。 – akonsu 2015-01-21 00:46:11

+0

一个有效的点akonsu。我想通过编程的方式实现*精确*图像中显示的内容。 – triviante 2015-01-21 01:38:31

+0

你为什么不直接用scanline做scanline?你需要的是一个测量文本的渲染宽度的函数;一旦你有了,它或多或少是微不足道的。 – rici 2015-01-21 02:25:05

回答

1

转换为黑色/白色,然后转换为ASCII艺术,然后用您的文本替换ascii艺术。

PIL中的黑/白转换很容易。我得到了ASCII艺术从https://github.com/hit9/img2txt/blob/master/img2txt.py

import Image 

def to_ascii(img,maxLen=100.0): 

    #resize to maximum line length 
    width, height = img.size 
    rate = maxLen/max(width, height) 
    width = int(rate * width) # cast to int 
    height = int(rate * height) 

    img_small = img.resize((width, height)) 
    pixels = img_small.load() 

    string = ""   
    for h in xrange(height): 
     for w in xrange(width): 
      rgb = pixels[w, h] 
      if rgb == 0: 
       string += ' ' 
      else: 
       string += '#' 
     string += "\n" 

    return string 

def hashes_to_text(hash_art, text): 
    output = list(hash_art) 
    tidx = 0 
    for idx, char in enumerate(hash_art): 
     if char == '#': 
      output[idx] = text[tidx%len(text)] 
      tidx += 1 
    return ''.join(output) 

这样使用它:

#open your image file and convert to black/white 
image_file = Image.open('Desktop/350px-Wiktionary_small.svg.png') 
image_file = image_file.convert('1') # to black/white 

W = to_ascii(image_file) 
W = hashes_to_text(W,'Wikipedia') 
print W 

将这一形象

enter image description here

转换成

enter image description here

备注:查看image segmentaion算法以改进黑/白转换。

+0

这非常漂亮,但它只适用于固定宽度的字体。 – rici 2015-01-21 02:22:01

+0

这是一个非常聪明的方法,我没有考虑过。非常感谢! – triviante 2015-01-21 16:26:52