ASCII ART边缘检测


19

就像标题所说的那样,我正在考虑要竞争一种必须检测ASCII艺术的边缘的问题。

该代码应接受黑白ASCII码作为输入。甲乙/ W ASCII技术被定义为(由我)的ASCII技术只有一种非白色空格字符的(在我们的情况下:一asteriks *)。并作为输出产生标准ASCII技术(所有ASCII字符被接受的)应该记住所述第一的contourn。

在输出中使用多个字符的目的是使某些边缘更平滑。例如,可以让这一输入

     *** 
   ****
 ******
******
****** 
 ******
   ****
     ***

可能变成:

      ___
    _/   ) 
  _/    /
 /      |
|      /
|      \
 \      |
  `\     |
     \___)

输入\n分隔的字符串作为输入。每行最多包含一个80字符。未指定行数。

这是我的示例Python3程序:

import fileinput as f
import re as r
import copy as c
a,s,p='*',' ','+'
def read(n):
    s=[list(' '*n)]
    for l in f.input():
        if(len(l)>n):l=l[:n]
        k=list(r.sub('[^ ^\%c]'%a,'',' '+l+' '))
        s.append(k+[' ']*(n-len(k)))
    s.append([' ']*n)
    return s
def np(s):
    s=c.deepcopy(s)
    for l in s[1:-1]:
        for w in l[1:-1]: print(w,end='')
        print()
def grow(i):
    o=c.deepcopy(i)
    for x in range(1,len(o)-1):
        for y in range(1,len(o[x])-1):
            if(i[x][y]==a): o[x-1][y-1]=o[x-1][y+1]=o[x-1][y]=o[x+1][y]=o[x+1][y-1]=o[x+1][y+1]=o[x][y+1]=o[x][y-1]=a

    return o
def diff(i,o):
    c=[]
    for x in range(0,len(i)):
        l=[]
        for y in range(0,len(i[x])):
            if(i[x][y]==a and o[x][y]==s): l.append(p)
            else: l.append(s)
        c.append(l)
    return c
I=read(80)
np(diff(grow(I),I))

输入:

在下面,我将程序的两个输入都放入。这是80x70的ASCII ART。这意味着它有70行,每行80个字符,每个行之间用分隔\n

此输入文件仅包含空格和星号*,每个ASCII艺术作品最多包含80列。

如果您发现更好的艺术品,请告诉我!

                                              *************
                                          *****          *****                   
                                     ******                  ***                 
                                    ***                         ****             
                             *********                             **            
                          ***********                               **           
                     ******   *******                                **          
                 *****       *******      ***                         **         
              ****          ********     *****                          *        
             **            *********     *****                    *****  *       
           ***            *********     *******                  ******  **      
          **             **********     *******                  ******   **     
         **              **********    *******                  ********   *     
        *               ***********   ******                    ********   *     
       **              ************   *****                     ********    *    
       *               ************    ***                       ********   *    
      *               *************                               ******    *    
     *                *************                                 ***     *    
    **                *************                                         *    
    *                **************                                         *    
   **                *************                                         **    
   *                 *************                                         **    
  **                *************                                          ***   
 ***                *************                                          ****  
 **                 ************                                           ****  
 **                *************                                           ****  
 **                *************           *****                           ****  
 **                *************          **   **          **              ****  
 **                 ************          *     *         ** **            ****  
 *                  ************          **   **        **   **           ****  
 *                  *************        *******         **   ***          ****  
 *                  ************          *****           *******          ****  
 *                   ************         ***               *****          ****  
**     *             *************                          ****          *****  
**    ***            **************                                      *****   
*    *****            *************                                     ******   
** *******             **************                                  *******   
**********             ***************              *                *********   
**********              *****************          ***             ***********   
***********              *******************                    **************   
***********               **********************            ******************   
************              *****************     **     ***********************   
*************             ******************      ****     *******************   
**************            ******************              ********************   
****************           ******************              *******************   
***************           *******************              *******************   
****************           ******************              ******************    
******************         ******************             *******************    
*******************         *****************             *******************    
*********************      ******************           ********************     
*********************************************          *********************     
**********************************************       ***********************     
************************     *****************      ************************     
 **********************       ******************* **************************     
 *********************        *********************************************      
 *********************        ****************************  ***************      
 ********************         **************************    ***************      
 ********************         *********************         ***************      
 *******************          ********************         ****************      
 ******************           *****************            ****************      
 *****************             ****************            ***************       
 *****************             ****************            ***************       
 *****************             *****************           ***************       
  ****************             *****************           ***************       
   **************              ******************          ***************       
                                 ****************          ****************      
                                  **************            ***************      
                                                             **************      
                                                              ************       

可能的输出:

可能的输出可能是:

                                         +++++             ++++
                                    ++++++     ++++++++++     +++
                                   ++      +++++        +++++   +++++
                            ++++++++   +++++                ++++    ++
                         ++++         ++                       ++++  ++
                    ++++++           ++                           ++  ++
                +++++      +++       +   +++++                     ++  ++
             ++++     +++++++       ++  ++   ++                     ++  ++
            ++    +++++   ++        +   +     +                  +++++++ ++
          +++  ++++      ++         +  ++     ++                ++     ++ ++
         ++   ++        ++         ++  +       +                +      ++  ++
        ++  +++         +          +  ++       +               ++      +++  +
       ++  ++          ++          + ++       ++               +        +++ +
      ++ +++          ++           + +      +++                +        + + ++
      +  +            +            + +     ++                  +        ++++ +
     ++ ++           ++            + ++   ++                   ++        + + +
    ++ ++            +             +  +++++                     ++      ++ + +
   ++ ++             +             +                             +++   ++  + +
   +  +             ++             +                               +++++   + +
  ++ ++             +              +                                      ++ +
  +  +              +             ++                                      +  +
 ++ ++             ++             +                                       +  ++
++  +              +             ++                                       +   ++
+   +              +             +                                        +    +
+  ++             ++            ++                                        +    +
+  +              +             +         +++++++                         +    +
+  +              +             +        ++     ++        ++++            +    +
+  +              +             +        +  +++  +       ++  +++          +    +
+  +              ++            +        + ++ ++ +      ++  +  ++         +    +
+ ++               +            ++      ++  +++  +      +  +++  ++        +    +
+ +                +             +      +       ++      +  +++   +        +    +
+ +                +            ++      ++     ++       ++       +        +    +
+ +   +++          ++            ++      +   +++         +++     +       ++    +
  +  ++ ++          +             ++     +++++             +    ++      ++     +
  + ++   ++         +              +                       ++++++      ++     ++
 ++++     +         ++             +++                                ++      +
  +       +          ++              ++            +++              +++       +
          +           +               ++++        ++ ++           +++         +
          ++          ++                 ++++     +   +        ++++           +
           +           ++                   +++++ +++++    +++++              +
           ++           ++                      +++   ++++++                  +
            ++           +                 +++++  +++++                       +
             ++          +                  +  +++    +++++                   +
              +++        +                  ++   ++++++  +                    +
                +        ++                  +           ++                   +
               ++        +                   +            +                   +
                +++      ++                  +           ++                  ++
                  ++      +                  +           +                   +
                   +++    ++                 +         +++                   +
                     ++++++                  +        ++                    ++
                                             ++     +++                     +
                                              +    ++                       +
                        +++++                 ++++++                        +
+                      ++   ++                   +                          +
+                     ++     +                                             ++
+                     +      +                            ++               +
+                    ++      +                          ++++               +
+                    +       +                     ++++++ ++               +
+                   ++       +                    ++      +                +
+                  ++        +                 ++++       +                +
+                 ++         ++                +          +               ++
+                 +           +                ++         +               +
+                 +           +                 +         +               +
++                +           +                 ++        +               +
 ++              ++           +                  +        +               ++
  ++++++++++++++++            +++                +        +                +
                                ++              ++        ++               +
                                 ++++++++++++++++          ++              +
                                                            ++            ++
                                                             ++++++++++++++

这也是上述脚本产生的输出。当然,这并不是最好的输出,而且我敢肯定,可以轻松地产生一个更平滑的输出。

因为这是一场人气竞赛,我希望投票将与雅致和输出质量成正比!(我也想可以通过combinig获得良好的结果,aplay并且gimp-cli)对于输出的方式没有严格的规定。


请定义将在所有答案中使用的输入以进行比较。大熊猫恕我直言。
AL

输入的每一行的长度是否需要恒定?熊猫的第一行比其他行短(末尾缺少空格)。
AL 2014年

输入文件是否仅包含一个字符和空格?
AL

谢谢您的提问,我认为熊猫不是太大:每本ASCII艺术作品都有80列。我没有说过,但是列的最大值应该是80。是的,输入文件仅包含星号和空格。再次感谢,我在问题中添加了这些信息。
Antonio Ragagnin 2014年

那是熊猫吗?我以为那是史努比。...–
贾斯汀

Answers:


14

高尔夫脚本

我认为高尔夫在该网站上很受欢迎,因此,GolfScript提交始终适合参加人气比赛。

n%.0=,' '[*]\1$++{0\0++{42=}%[{.}*]);2/}%{.}*]);2/{zip{~+2base' /\-\|/ /\| -   '=}%n+}%

您可以在这里尝试使用自己的ascii艺术代码。注意,要求所有行的长度都相同。

例:

                                              /------------\                      
                                          /---  ---------   --\                   
                                     /----  ---/         \---  -\                 
                                    /   ---/                 \--\---\             
                             /------   /                        \--  \            
                          /--         /                            \  \           
                     /----  --       |                              \  \          
                 /---  ----/ /       /    /--\                       \  \         
              /--  ---/     /       |    /    \                       \-\\        
             /  --/        /        |    |    |                   /----\\\\       
           /-  /          /         /   /      \                 /     | | \      
          /  -/          /         |    |      |                 |     | \  \     
         /  /            |         |   /       /                /       \ \ |     
        //-/            /          |  /      -/                 |       |  ||     
       / |             /           |  |     /                   |       |  \\\    
       | /             |           |  \    /                    \        \  ||    
      ///             /            |   \--/                      \       /  ||    
     ///              |            |                              \-    /   ||    
    / |               |            |                                \--/    ||    
    | /              /             |                                        ||    
   / |               |             /                                       / |    
   | /               |            |                                        | |    
  / |               /             /                                        |  \   
 /  |               |            |                                         |   \  
 |  /               |            /                                         |   |  
 | |               /            |                                          |   |  
 | |               |            |          /----\                          |   |  
 | |               |            |         /  --  \         /-\             |   |  
 | |               \            |         | /  \ |        /  \-\           |   |  
 | /                |           |         | \  / |       /  /\  \          |   |  
 ||                 |            \       /   --  /       | |  |  \         |   |  
 ||                 |            /       \      /        \  --   |         |   |  
 ||                 \            \        |   -/          \-     |         |   |  
/ |    /\            |            \       \--/              |    /        /    |  
| |   /  \           |             \                        \---/        /     /  
| /  /    \          \             |                                    /     |   
| \/-     |           \             -\                                 /      |   
|         |            |              \             /\               /-       |   
|         |            \               --\         /  \            /-         |   
|          \            \                 --\      \--/         /--           |   
|          |             \                   ---\           /---              |   
|           \             |                 ----\-\    /----                  |   
|            \            |                 \   \-\---\\---                   |   
|             \           |                 |     \---/   /                   |   
|              -\         \                  \            \                   |   
|               /         /                  |             |                  |   
|               \         \                  |             |                  /   
|                -\        |                 |            /                  |    
|                  \       \                 |            |                  |    
|                   -\     /                 |          /-                   /    
|                     -----                  |         /                    |     
|                                             \      /-                     |     
|                        ----                 |     /                       |     
\                       /    \                 --\/-                        |     
 |                     /      |                                             /     
 |                    |       |                            -               |      
 |                    /       |                          -/ |              |      
 |                   |        |                     ----/   |              |      
 |                   /        |                    /       /               |      
 |                  /         |                 --/        |               |      
 |                 /          \                |           |               /      
 |                |            |               |           |              |       
 |                |            |                \          |              |       
 \                |            |                |          |              |       
  \               /            |                 \         |              |       
   \-------------/             \-                |         |               \      
                                 \               /         \               |      
                                  \-------------/           \              |      
                                                             \             /      
                                                              \-----------/       

1
Golfscript 总是很重要。
Nit 2014年

呵呵,使用超过1个字符会使熊猫看上去很生气+1。
Magic Octopus Urn'8

6

Python代码主要依靠正则表达式来完成任务。

def edge_detect(st): 
    width = len(max(st.split('\n'), key=len))       
    #Pad the image with extra blank lines above and below
    st = '{{0: <{0}}}\n{{1}}\n{{0: <{0}}}'.format(width).format('', st.rstrip('\n'))     
    return re.sub(r"""                     #Match a non space character
                      (?<=\s.{{{0}}})[^\s]|#When the char above is a space  
                      [^\s](?=.{{{0}}}\s) |#When the char below is a space       
                      (?<=\s)[^\s]|        #When the previous char is a space   
                      [^\s](?=\s)          #When the following char is a space   
                   """.format(width),                               
                   '+',                    #Replace it with edge character '+'
                   st,
                   flags=re.X|re.S).replace('*',' ')  # And finally replace all 
                                           # non-space character with spaces

*输出

>>> print edge_detect(st)
                                              +++++++++++++                      
                                          +++++          +++++                   
                                     ++++++                  +++                 
                                    +++                         ++++             
                             +++++++++                             ++            
                          ++++      +                               ++           
                     ++++++   +    ++                                ++          
                 +++++       ++    +      +++                         ++         
              ++++          ++     +     ++  +                          +        
             ++            ++     ++     +   +                    +++++  +       
           +++            ++      +     ++    +                  ++   +  ++      
          ++             ++       +     +    ++                  +    +   ++     
         ++              +        +    ++  +++                  ++     +   +     
        +               ++        +   ++  ++                    +      +   +     
       ++              ++         +   +  ++                     +      +    +    
       +               +          +    +++                       +     ++   +    
      +               ++          +                               +   ++    +    
     +                +           +                                 +++     +    
    ++                +           +                                         +    
    +                ++          ++                                         +    
   ++                +           +                                         ++    
   +                 +          ++                                         ++    
  ++                ++          +                                          + +   
 +++                +          ++                                          +  +  
 ++                 +          +                                           +  +  
 ++                ++          +                                           +  +  
 ++                +           +           +++++                           +  +  
 ++                +           +          ++   ++          ++              +  +  
 ++                 +          +          +     +         ++ ++            +  +  
 +                  +          +          ++   ++        ++   ++           +  +  
 +                  +          ++        ++  +++         ++   + +          +  +  
 +                  +          +          + +++           + +++ +          +  +  
 +                   +          +         +++               +  ++          +  +  
++     +             +           +                          ++++          ++ ++  
++    +++            +            +                                      ++  +   
+    ++  +            +           +                                     ++   +   
++ +++   +             +            +                                  ++    +   
+  +     +             +             +              +                +++     +   
+        +              +              ++          +++             +++       +   
+         +              +                ++                    ++++         +   
+         +               +               ++++++            +++++            +   
+          +              +               +     ++     ++++++                +   
+           +             +                +      ++++     +                 +   
+            +            +                +              ++                 +   
+             ++           +                +              +                 +   
+             +           ++                +              +                ++   
+              +           +                +              +                +    
+                +         +                +             ++                +    
+                 +         +               +             +                ++    
+                   +      ++               +           +++                +     
+                     ++++++                +          ++                  +     
+                      +++++                 +       +++                   +     
+                     ++     +               +      ++                     +     
 +                   ++       +                ++ +++                     ++     
 +                   +        +                   +      ++               +      
 +                  ++        +                        +++  +             +      
 +                  +         +                   ++++++    +             +      
 +                 ++         +                  ++         +             +      
 +                ++          +               ++++         ++             +      
 +               ++           +               +            +             ++      
 +               +             +              +            +             +       
 +               +             +              +            +             +       
 +               +             +               +           +             +       
  +             ++             +               +           +             +       
   ++++++++++++++              +                +          +             +       
                                 +             ++          +              +      
                                  ++++++++++++++            +             +      
                                                             +           ++      
                                                              ++++++++++++  

另一个

print edge_detect(st)
     +++
   ++ + 
 ++   + 
+    +  
+    +  
 ++   + 
   ++ + 
     +++ 

5

蟒蛇

使用渐变操作来识别边缘:

from numpy import gradient, zeros
import matplotlib.pylab as plt
b = open("file").readlines()
bi = zeros((len(b),len(b[0])))
e = enumerate
for i,l in e(b):
    for j,c in e(l):
        if(c=="*"): bi[i][j]=1
g = gradient(bi,.5,.5)
g = (abs(g[0])+abs(g[1]))>=1.
plt.subplot(2,1,1)
plt.imshow(bi,cmap='Greys'), plt.show()
plt.subplot(2,1,2)
plt.imshow(g*1,cmap='Greys'), plt.show()

香蕉和熊猫的输出

要进行ASCII输出,应将部分绘图替换为:

r = range
s = ""
for i in r(len(b)):
    for j in r(len(b[0])):
        if(g[i][j]!=0): 
            s+="*"
        else:
            s+=" " 
    s +="\n"
print s

ASCII输出:

香蕉:

   *** ** 
 **** **  
***   **  
*    **   
*    **   
***   **  
 **** **  
   *** ** 

熊猫:

                                          *************** ****                    
                                     ******   *************  ***                  
                                    ***   *****          ***** *****              
                             ******** *****                  ****  **             
                          ********** **                         ******            
                     ******  *      **                             ****           
                 *****    *****     **    ***                       ****          
              ****   ****** **     **    *****                       ****         
             **  *****     **      **   **   **                   **** * *        
           *******        **       **   **   **                  **********       
          ** **          **       **   **     **                **    ******      
         *****          **        **   **     **                **    ** ****     
        ****            **        **  **    ***                **      ** * *     
       ****            **         ** **    ***                 **      ** ***     
      ****            **          ** **   **                   **      **  ***    
      ***             **          **  *****                     **      ** * *    
     * *             **           **   ***                       ***   **  * *    
    ***              **           **                              ******   * *    
   ****              **           **                                ***    * *    
   * *              **            **                                       * *    
  ****              **           **                                       ****    
  * *               **           **                                       ****    
 ****              **           **                                        ** **   
** **              **           **                                        **  **  
****               **          **                                         **  **  
****              **           **          *****                          **  **  
****              **           **         **   **          **             **  **  
****              **           **        *********        *****           **  **  
****               **          **        * *   * *       *******          **  **  
* *                **          **        *********      **** ****         **  **  
* *                **           **      **  *****       ******* **        **  **  
* *                **          **        **  ***         ** **  **        **  **  
* *    *            **          **       ******           ***   **        **  **  
***   ***           **           **       ***              ******        **   **  
 **  ** **          **            **                        ****        **   **   
** ***   **          **           ***                                  **    **   
 ****    **           **           ***              *                ***     **   
  *      **           **             ****          ***             ****      **   
         **            **             ******      *****         *****        **   
          **            **               *******   ***      *******          **   
          **             **                *   ***     *********             **   
           **            **               **************   *                 **   
            **           **                **   ***  *******                 **   
             ***         **                **     ****   **                  **   
              ***         **                **            **                 **   
              **         **                 **            **                 **   
               ***        **                **            **                **    
                ***       **                **           **                 **    
                  ***      **               **          ***                 **    
                   *********                **         ***                 **     
                     ******                 **       ***                   **     
                        *****                **     ***                    **     
*                      *******               **** ***                      **     
**                    **     **               ******                       **     
**                   **      **                  *        **              **      
**                   **      **                         *****             **      
**                  **       **                    ******* **             **      
**                  **       **                   ******   **             **      
**                 **        **                ****       **              **      
**                **         **               ****        **              **      
**               **           **              **          **             **       
**               **           **              **          **             **       
**               **           **               **         **             **       
 **              **           **               **         **             **       
  ****************            ***               **        **             **       
   **************              ***              **        **              **      
                                 ****************          **             **      
                                  **************            **            **      
                                                             **          **       

一根香蕉?对我来说是个飞旋镖。:)
AL

4

Mathematica

假定panda包含原始字符串,以下代码将获取轮廓边缘的像素并将其替换为“ +”。

t = (Most /@ Partition[Take[Characters@panda, {61, 5636}], 82]) /. {"*" -> 1, " " -> 0};
Grid[ImageData[EdgeDetect[Image[t]]] /. {1 -> "+", 0 -> " "}, Spacings -> 0]

熊猫


怎么运行的

Partition[Take[Characters@panda, {61, 5636}], 82] 将字符串分成字符行。

Most 删除换行符。

Image[t]]] 将0和1的矩阵转换为图像。

EdgeDetect 查找图像的边缘。

ImageData 获取图像的二进制矩阵。

/. {1 -> "+", 0 -> " "} 用适当的字符替换每个0和1。

Grid 显示Ascii艺术。


4

爪哇

这将检查行和行的顶部,左侧,右侧或底部是否有任何内容,并根据这些内容从数组保存符号中选择一个值,该值用于使用边生成新图稿!

输出示例:

                                              /^^^^^^^^^^^\                      
                                          /^^^/          \_^^\                   
                                     /^^^^/                  \^\                 
                                    / /                         /^^\             
                             /^^^^^^ /                             \\            
                          /^^_      |                               \\           
                     /^^^^/   |     /                                \\          
                 /^^^/       /     |      /^\                         \\         
              /^^/          /      |     /   \                          /        
             //            /       /     |   |                    /^^^\  /       
           /^/            /       |     /     \                  /    |  \\      
          //             /        |     |     /                  |    |   \\     
         //              |        |    /    _/                  /      \   |     
        /               /         |   /    /                    |      |   \     
       //              /          |   \   /                     \      |    /    
       \               |          |    \_/                       \      \   |    
      /               /           |                               \_   /    |    
     /                |           |                                 \_/     |    
    //                |           |                                         |    
    |                /            /                                         |    
   //                |           |                                         /|    
   |                 |           /                                         ||    
  /|                /           |                                          | \   
 / /                |           /                                          |  \  
 ||                 |          |                                           |  |  
 ||                /           |                                           |  |  
 ||                |           |           /^^^\                           |  |  
 ||                \           |          //   \\          /\              |  |  
 |/                 |          |          |     |         // /\            |  |  
 |                  |          |          |\   //        /|   |\           |  |  
 |                  |           \        /  ^^^/         \|   | \          |  |  
 |                  \          |          |  _/           \^^^  |          |  |  
 |                   |          \         \_/               |   /          |  |  
/|     /             |           \                          \__/          /   /  
|/    / \            \            \                                      /   |   
|    /   \            \           |                                     /    |   
|\ /^    |             |           ^\                                  /     |   
| ^      |             \             \              /                /^      |   
|        |              \             ^^\          /_\             /^        |   
|         \              \               ^^\                    /^^          |   
|         |               |                _^^^\            /^^^             |   
|          \              |               |     /\     /^^^^                 |   
|           \             |                \      /^^\     |                 |   
|            \            \                |              /                  |   
|             ^\           |                \              |                 |   
|             |           /                 |              |                 /   
|              \           |                |              |                |    
|               ^\         \                |             /                 |    
|                 \         |               |             |                 /    
|                  ^\      /                |           /^                 |     
|                    ^^^^^^                 |          /                   |     
|                       _____                \       /^                    |     
\                      /     \               |      /                      |     
 |                    /       |               ^^\ /^                       /     
 |                   |        |                  ^        __              |      
 |                   /        |                         _/  |             |      
 |                  |         |                    ____/    |             |      
 |                  /         |                   /         |             |      
 |                 /          |                __/         /              |      
 |                /           \               |            |              /      
 |               |             |              |            |             |       
 |               |             |              |            |             |       
 \               |             |               \           |             |       
  \              /             |               |           |             |       
   \____________/              \_               \          |             |       
                                 \              /          \              \      
                                  \____________/            \             |      
                                                             \            /      
                                                              \__________/       
     /^\
   /^ | 
 /^   / 
/    |  
\    |  
 \_   \ 
   \_ | 
     \_\

码:

package com.ruuhkis.asciiedge;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ASCIIEdge {

    public static void main(String[] args) {
        try {
            if (args.length > 0) {
                for (String arg : args) {
                    new ASCIIEdge().detach(new FileInputStream(new File(arg)));
                }
            } else {
                new ASCIIEdge().detach(new FileInputStream(new File("art.txt")));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private void detach(InputStream is) throws IOException {
        BufferedReader bw = new BufferedReader(new InputStreamReader(is));

        StringBuilder artBuilder = new StringBuilder(100);

        int longestLineLength = 0;
        int numLines = 0;

        String line = null;

        while ((line = bw.readLine()) != null) {
            artBuilder.append(line + System.getProperty("line.separator"));

            if (line.length() > longestLineLength) {
                longestLineLength = line.length();
            }

            numLines++;

        }

        bw.close();

        char[][] artBuffer = new char[numLines][longestLineLength];

        String[] lines = artBuilder.toString().split(
                System.getProperty("line.separator"));

        for (int i = 0; i < lines.length; i++) {
            lines[i].getChars(0, lines[i].length(), artBuffer[i], 0);
            for (int j = lines[i].length(); j < longestLineLength; j++) {
                artBuffer[i][j] = ' ';
            }
        }

        detach(artBuffer, longestLineLength, numLines);
    }

    private void detach(char[][] artBuffer, int longestLineLength, int numLines) {
        char[][] outputBuffer = new char[numLines][longestLineLength];
        for (int i = 0; i < numLines; i++) {
            for (int j = 0; j < longestLineLength; j++) {
                ;

                int horizontalEdge = isHorizontalEdge(artBuffer[i], j,
                        longestLineLength);
                int verticalEdge = isVerticalEdge(artBuffer, i, j, numLines);

                char[][] result = { { '/', '^', '\\' }, { '|', ' ', '|' },
                        { '\\', '_', '/' } };

                outputBuffer[i][j] = result[verticalEdge + 1][horizontalEdge + 1];
                ;

            }

            System.out.println(outputBuffer[i]);
        }
    }

    private int isVerticalEdge(char[][] chars, int row, int col, int numLines) {
        boolean canBeEdge = chars[row][col] != ' ';
        boolean upperEdge = row - 1 < 0 || chars[row - 1][col] == ' ';
        boolean lowerEdge = row + 1 >= numLines || chars[row + 1][col] == ' ';

        return (canBeEdge && (upperEdge || lowerEdge)) ? upperEdge ? -1 : 1 : 0;
    }

    private int isHorizontalEdge(char[] chars, int index, int length) {
        boolean canBeEdge = chars[index] != ' ';
        boolean leftEdge = index - 1 < 0 || chars[index - 1] == ' ';
        boolean rightEdge = index + 1 > length - 1 || chars[index + 1] == ' ';
        return (canBeEdge && (leftEdge || rightEdge)) ? leftEdge ? -1 : 1 : 0;
    }

}

附言 第一次来这里,不要粗暴:D Pps。熊猫看起来很伤心:(


我向您保证,在制作此ASCII艺术时,没有熊猫受到伤害
Antonio Ragagnin 2014年

2

Python(ascii->图片->边缘滤镜-> ascii)

我有点被骗了,我将ascii文本转换为图像,然后在其上运行PIL边缘检测过滤器。然后,我反转图像并将其转换回ascii文本:

from PIL import Image, ImageFilter, ImageOps
import random
from bisect import bisect

greyscale = [" "," ",".,-","_ivc=!/|\\~","gjez2]/(YL)t[+T7Vf","mdK4ZGbNDXY5P*Q","W8KMA","#%$"]
zonebounds=[36,72,108,144,180,216,252]

f=open('input.txt', 'r')
lines=f.readlines()
f.close()

width=82
height=len(lines)

im = Image.new("RGB", (width,height), "white")
pixels = im.load()

y=0
for line in lines:
    x=0
    for px in line:
        if px != ' ' and x < width:
            pixels[x,y] = (0,0,0)
        x+=1
    y+=1

im=im.resize((width, height),Image.BILINEAR)
im=im.convert("L")
im=im.filter(ImageFilter.FIND_EDGES)
im=ImageOps.invert(im)

str=""
for y in range(0,im.size[1]):
    for x in range(0,im.size[0]):
        lum=255-im.getpixel((x,y))
        row=bisect(zonebounds,lum)
        possibles=greyscale[row]
        str=str+possibles[random.randint(0,len(possibles)-1)]
    str=str+"\n"
print str

结果如下:

$#$$#%$$$$$$%%$$$%$$$$%$###%%#%%%$##$$$%%#$#%#              $%%%%$$%$###$$%%%##%##
%                                   $%%$$$     %#$%$$$#$$     $%#               # 
%                                  %%      $%$#$        $$$$%   %#%#%           # 
%                           %$#$%%$$   #%$$%                %%%%    %$          # 
$                        #$$$         %$                       $###  #%         $ 
%                   #%$#$#           $%                           %#  #$        # 
#               #%$%#      $##       $   $%%$%                     $$  $%       # 
%            $%#%     $##%$%$       ##  $%   %#                     $$  %$      $ 
%           %$    %$%$$   %#        $   #     #                  $#$#$$$ $$     % 
%         $%#  $##%      ##         #  #%     %$                #$     #% %%    % 
%        #$   #$        %$         %$  #       %                $      $$  $$   # 
#       $%  $%#         %          #  ##       #               $%      %#%  $   # 
%      #%  #%          %#          # $$       $%               $        $$# $   % 
%     #% $$%          %%           % $      $%#                #        % $ ##  $ 
%     $  %            #            # %     %%                  %        #$#$ #  # 
%    $% $%           #%            % %$   #%                   %%        # $ %  % 
$   $$ %$            %             #  %#$%%                     ##      $$ # $  % 
#  $% #$             $             $                             #$$   $%  % $  $ 
%  %  %             #%             #                               %$#%#   $ $  % 
# $$ #%             $              #                                      ## #  % 
$ %  #              $             #$                                      #  $  % 
%$$ ##             %#             %                                       $  $$ # 
$$  %              #             $%                                       #   #$% 
$   $              %             %                                        %    $# 
$  %#             #%            $%                                        #    #$ 
%  %              #             $         #%$##%$                         %    %# 
$  $              #             $        $%     $#        %#%%            #    %% 
#  %              #             #        %  $%$  %       %%  %%#          %    $# 
%  #              #%            #        # ## $# #      %#  %  %$         $    #$ 
$ $%               %            $%      $%  $$$  %      $  #$#  %#        %    #$ 
# %                $             $      #       $%      $  #$%   %        $    $$ 
% %                $            $%      %#     ##       $$       $        #    ## 
% #   ###          %#            #%      $   %%$         #$%     #       %#    %% 
  #  %% $#          #             ##     ##%$#             #    %#      $$     %# 
  % %%   $$         %              %                       ##$%$#      %%     #%% 
 #%$%     #         #$             ##%                                %#      % % 
  %       %          %%              $#            %#%              $%$       $ % 
          $           #               $$$%        #$ %$           %##         $ # 
          #%          $%                 %$#%     %   $        %%$#           # $ 
           %           ##                   #%##$ #$#$$    %#%%%              % % 
           $%           $%                      $##   %##$$%                  # % 
            %#           %                 ##$##  ##$#$                       % # 
             $%          #                  %  %#$    $$#%#                   # % 
              #%%        %                  ##   %$##$%  #                    # $ 
                %        %$                  $           %$                   % % 
               %%        #                   $            %                   $ # 
                %%#      #%                  #           ##                  $$ $ 
                  %$      $                  %           #                   %  % 
                   %##    #%                 $         %#$                   #  # 
                     %#$##%                  $        #%                    %$  $ 
                                             $$     #%$                     $   # 
                                              #    ##                       #   $ 
                        #%%$%                 $%#%$%                        %   $ 
#                      $%   %$                   #                          %   $ 
#                     %#     #                                             $#   % 
%                     #      %                            $#               $    $ 
%                    %#      #                          #$#%               $    % 
$                    $       #                     %%%$#$ #$               %    # 
$                   $%       $                    %%      $                $    % 
#                  #$        %                 #%#%       %                $    % 
%                 $%         ##                #          %               #$    $ 
%                 #           #                %$         %               #     # 
$                 #           $                 #         #               %     % 
%$                #           $                 %$        %               $     # 
##%              #%           %                  #        $               %$    % 
# ##%#%$$#%#%$$#%#            #%$                #        %                #    % 
#                               ##              ##        $#               $    # 
%                                $##$#%$#$$$#$$%%          $$              #    % 
$#%#$#$$#$##$%#$%#$$$$%#$#%%#$%#$$#%%%%$%%$%$#%$##%%$#$$##%#$%            #$%$$$$$

引用的来源(用于灰度图像到ASCII的转换):http : //stevendkay.wordpress.com/2009/09/08/generating-ascii-art-from-photographs-in-python/


我喜欢!我曾经尝试使用以下命令来执行此操作:(convert将ASCII图像转换为图像);GIMP-命令行(执行边缘检测);和aplay(以ASCII艺术形式渲染图像)。但失败了:p(并欢迎来到Codegolf)
Antonio Ragagnin 2014年

2
谢谢!我心想,如何才能以最小的返工率利用图像卷积方面已经进行的所有工作。我还想输出一种以上的字符来“融合”文本行,这使它更具复古感。过去,Ascii艺术家使用文本绘画程序进行绘制,并使用不同的符号来制作这样的图案。在相关说明中,还有Quake的一个版本,该版本重新绘制了ascii中的像素。这是非常超现实的。
blakesteel 2014年

1

44

这是一个懒惰的版本,它只是找到边缘,它不会尝试找到流行的形状并选择合适的字符

“算法”只是查找所有与左侧或左侧不同的单元格,然后使用数组语言魔术将布尔矩阵转换回ASCII格式

有一个小的技巧可以在所有内容的开头留出额外的空间,或者它会将左侧和顶部视为“边缘”-这样仍然可以,但是稍后我可以将其删除

$ cat o.k
f:{(1_~~':" ",)'x}
g:{(f x)|+f@+x}
h:{-1" +"g@0:`$,/$x;}

h@*.z.x
\\
$ 

与规格中的样本大致相同的输出

在回旋镖/香蕉上:

$ cat b.txt
     ***
   ****
 ******
******
******
 ******
   ****
     ***
$ q o.k -q b.txt
     +++
   ++  +
 ++    +
+     +
+     +
++    ++
 +++   +
   +++ +
$ 

1

蟒蛇

这是“ highpass”过滤器的非常简单的Python版本:)。它检查像素是否至少被其4个侧面包围。这是我有史以来的第一批Python代码之一,因此请保持谨慎。

import sys
s = open("ascii.txt",'r').read().split("\n")
def px(x,y):
  try:
    v = s[x][y]
  except IndexError:
    v = ' '
  return v
def r(x,y):
  return '{:<3}'.format(s[x][y-1:y+2])
def v(x,y):
  return (px(x,y)==' ' or r(x,y)=='***' and px(x-1,y)=='*' and px(x+1,y)=='*') and ' ' or '*'
for row in range(len(s)):
  for cell in range(len(s[row])):
    sys.stdout.write(v(row,cell))
  print

输出:

                                              *************
                                          *****          *****                   
                                     ******                  ***                 
                                    * *                         ****             
                             ******* *                             **            
                          ****      *                               **           
                     ******   *     *                                **          
                 *****       *     *      ***                         **         
              ****          *      *     *   *                          *        
             **            *       *     *   *                    *****  *       
           ***            *       *     *     *                  *    *  **      
          **             *        *     *     *                  *    *   **     
         **              *        *    *    **                  *      *   *     
        *               *         *   *    *                    *      *   *     
       **              *          *   *   *                     *      *    *    
       *               *          *    ***                       *      *   *    
      *               *           *                               **   *    *    
     *                *           *                                 ***     *    
    **                *           *                                         *    
    *                *            *                                         *    
   **                *           *                                         **    
   *                 *           *                                         **    
  **                *           *                                          * *   
 * *                *           *                                          *  *  
 **                 *          *                                           *  *  
 **                *           *                                           *  *  
 **                *           *           *****                           *  *  
 **                *           *          **   **          **              *  *  
 **                 *          *          *     *         ** **            *  *  
 *                  *          *          **   **        **   **           *  *  
 *                  *           *        *  ****         **   * *          *  *  
 *                  *          *          *  **           ****  *          *  *  
 *                   *          *         ***               *   *          *  *  
**     *             *           *                          ****          *   *  
**    * *            *            *                                      *   *   
*    *   *            *           *                                     *    *   
** **    *             *           **                                  *     *   
* *      *             *             *              *                **      *   
*        *              *             ***          ***             **        *   
*         *              *               ***                    ***          *   
*         *               *                *****            ****             *   
*          *              *               *     **     *****                 *   
*           *             *                *      ****     *                 *   
*            *            *                *              *                  *   
*             **           *                *              *                 *   
*             *           *                 *              *                 *   
*              *           *                *              *                *    
*               **         *                *             *                 *    
*                 *         *               *             *                 *    
*                  **      *                *           **                 *     
*                    ******                 *          *                   *     
*                       *****                *       **                    *     
*                      *     *               *      *                      *     
 *                    *       *               *** **                       *     
 *                   *        *                  *        **              *      
 *                   *        *                         **  *             *      
 *                  *         *                    *****    *             *      
 *                  *         *                   *         *             *      
 *                 *          *                ***         *              *      
 *                *           *               *            *              *      
 *               *             *              *            *             *       
 *               *             *              *            *             *       
 *               *             *               *           *             *       
  *              *             *               *           *             *       
   **************              **               *          *             *       
                                 *              *          *              *      
                                  **************            *             *      
                                                             *            *      
                                                              ************   

您能添加输出吗?
AL 2014年

1
哇,谢谢格式化。找不到Python高亮显示。输出已添加。
2014年

别客气。:) AFAIK,突出显示要求使用语言的文件扩展名:<!-- language: lang-py -->
AL 2014年

1

[R

对于矩阵中的每个点,如果字符被左右,左,上和下的星号包围,则将其隐藏。这很幼稚,但效果很好。

text = scan(commandArgs(T)[1], what='raw', sep="\n", quiet=T)

height = length(text); width = max(sapply(text, nchar))

mat_2 = mat = matrix(unlist(strsplit(text, '')), height, width, byrow=T)

for (y in 1:nrow(mat_2)) {
    for (x in 1:ncol(mat_2)) {
        if (
            ((x < ncol(mat)) && (mat[y, x + 1] == '*')) # right
            &&
            ((x > 1) && (mat[y, x - 1] == '*')) # left
            &&
            ((y > 1) && (mat[y - 1, x] == '*')) # top
            &&
            ((y < nrow(mat)) && (mat[y + 1, x] == '*')) # bottom
        ) {
            mat_2[y,x] = ' '
        }
    }
}

for (a in 1:nrow(mat_2)) {
    cat(paste(mat_2[a,], collapse=""), "\n")
}

用法: Rscript script.r input_.txt

输出量

                                              *************                       
                                          *****          *****                    
                                     ******                  ***                  
                                    * *                         ****              
                             ******* *                             **             
                          ****      *                               **            
                     ******   *     *                                **           
                 *****       *     *      ***                         **          
              ****          *      *     *   *                          *         
             **            *       *     *   *                    *****  *        
           ***            *       *     *     *                  *    *  **       
          **             *        *     *     *                  *    *   **      
         **              *        *    *    **                  *      *   *      
        *               *         *   *    *                    *      *   *      
       **              *          *   *   *                     *      *    *     
       *               *          *    ***                       *      *   *     
      *               *           *                               **   *    *     
     *                *           *                                 ***     *     
    **                *           *                                         *     
    *                *            *                                         *     
   **                *           *                                         **     
   *                 *           *                                         **     
  **                *           *                                          * *    
 * *                *           *                                          *  *   
 **                 *          *                                           *  *   
 **                *           *                                           *  *   
 **                *           *           *****                           *  *   
 **                *           *          **   **          **              *  *   
 **                 *          *          *     *         ** **            *  *   
 *                  *          *          **   **        **   **           *  *   
 *                  *           *        *  ****         **   * *          *  *   
 *                  *          *          *  **           ****  *          *  *   
 *                   *          *         ***               *   *          *  *   
**     *             *           *                          ****          *   *   
**    * *            *            *                                      *   *    
*    *   *            *           *                                     *    *    
** **    *             *           **                                  *     *    
* *      *             *             *              *                **      *    
*        *              *             ***          ***             **        *    
*         *              *               ***                    ***          *    
*         *               *                *****            ****             *    
*          *              *               *     **     *****                 *    
*           *             *                *      ****     *                 *    
*            *            *                *              *                  *    
*             **           *                *              *                 *    
*             *           *                 *              *                 *    
*              *           *                *              *                *     
*               **         *                *             *                 *     
*                 *         *               *             *                 *     
*                  **      *                *           **                 *      
*                    ******                 *          *                   *      
*                       *****                *       **                    *      
*                      *     *               *      *                      *      
 *                    *       *               *** **                       *      
 *                   *        *                  *        **              *       
 *                   *        *                         **  *             *       
 *                  *         *                    *****    *             *       
 *                  *         *                   *         *             *       
 *                 *          *                ***         *              *       
 *                *           *               *            *              *       
 *               *             *              *            *             *        
 *               *             *              *            *             *        
 *               *             *               *           *             *        
  *              *             *               *           *             *        
   **************              **               *          *             *        
                                 *              *          *              *       
                                  **************            *             *       
                                                             *            *       
                                                              ************  
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.