R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

ASCII art from R

There’s a plethora of suitable software freely available on the Internet, but I haven’t found a single R function that would allow conversion of images to ASCII art. I can’t quite figure out why, but I’ve always had a sore spot for ASCII art, so I had to cook a function of my own.

The following function reads an image from a local file or over the Internet, downscales it into suitable size, converts it into greyscale and finally replaces pixels with ASCII characters. Finally, the function prints the result on the screen.

artify<-function(path=NULL, resize.to=100) {
  require(EBImage)
 
  # What source are we supposed to read? 
  if(!is.null(path)) {
    if(grepl("www.|http:|https:", path)) {
      img<-readImage(path)
    } else {
      img<-readImage(path)
    }
  } else {
    img<-readImage(file.choose()) 
  }
 
  # Resize to a set pixel size 
  img<-resize(img, w=resize.to)
 
  # Downsample rows to account for the shapes of characters on the screen
  img<-resize(img, h=floor(ncol(img)/3*2), w=nrow(img))
 
  # Convert to greyscale
  dg<-channel(img, "grey")
  m<-dg@.Data
 
  # Transpose the image matrix
  m<-t(m)
 
  # Create a negative of the original
  m<-1-m
 
  # Replace pixels with characters
  m[m<0.1]<-" "
  m[m>=0.1 & m<0.2]<-"."
  m[m>=0.2 & m<0.3]<-","
  m[m>=0.3 & m<0.4]<-":"
  m[m>=0.4 & m<0.5]<-";"
  m[m>=0.5 & m<0.6]<-"o"
  m[m>=0.6 & m<0.7]<-"x"
  m[m>=0.7 & m<0.8]<-"%"
  m[m>=0.8 & m<0.9]<-"#"
  m[m>=0.9]<-"@"
 
  # Print the result to screen
  print(data.frame("ASCII ART FROM R"=apply(m, 1, function(x) paste(x, collapse=""))), row.names=F)
}

Once you’ve copied and pasted the function code from above to your R session, the function can be called as follows. As an example, let’s use the well-known picture of Abraham Lincoln from his Wikipedia page.

Call to the function:

artify("https://upload.wikimedia.org/wikipedia/commons/4/44/
Abraham_Lincoln_head_on_shoulders_photo_portrait.jpg", 50)

should generate something similar to this on the screen:

                                   ASCII.ART.FROM.R
  . ......,,..,,,,,,:,;:::;;::,,;,:;;;,:,::,:,,,,..
    ..........,,,,,,,,,,.,,,:,,:::,:::,,,,,,,,,,.,.
 ........,...,.,,,,,,..%#%::,::,::,:::,::,:,,.:.,,:
 .......,.,,,,,.,@##%%######%;:::::::::::,,,,,,,,,,
 ....,.,..,.,,.%###%%##@####@#:,;:::::::::::,,,,.:,
 ....,,,,,,,,,#%##%#####@#######%@::::::::::,,:,:,:
  ..,,,,.,,,,,#####@%#####:,.,#@###;:::::::,,,,,,,:
 ....,,..,,,,###@...........,,@###@:::::::::::,,,,:
 ...,,,,,,,,,#%............,,:,@@#;::::::::::,,.,,,
 ....,,,.,,,@%@......,,,,,,:::;@##@,:::,:::::,,:,,,
 ...,.,,,,,,@%;...........,::;;@###,,:::,:::,,,,.,.
 ...,,,,,,,,@##,..::,,.,.:;@@@%#@@@@,,:::,:::,,,...
 ...,,,,,,..:##.:@#@@@@,%@@@@#@%@###,,,,.:,,:,,,...
 ..,,,,,,,,,@;@.:#@##%;.@#@%%##@###%,,,,,,,,,,,....
 ...,,,...,,:,#,...,:,..:@@:;;;@#@%;,,,,,,,,.,... .
 ..,,,,,,,,,..@;...,....,%;:;:@%#%@,.,.,.,...,.... 
 ....,.,,,,.,.,#:,...:..:@#::@#@@@;.....,....,.....
 ...,,,,.,,,,.,%#;:,:.;###@@@##@@;.................
 ..,..,.,,,.....%%@#...@:@@@@%#@,.................,
 ...,,,.,...,..,@@@;;@@;%###%###;................ .
 .,........,..,.@%%%;;@@%#%#@@#@........,....... ..
 ..,,.....,,,,,..%####@%##@#@@#%...............   .
 ..,,,,,.,,,,,...@#########@@@@, ..................
 .,.,,,,,,,.,,....####@#@@@#@..@:..................
 ........,,...,.@  @@@@@@@.   @@@........ ...... ..
 .....,,.,,,,..%@ ..,:;,;@@;;;@@@#@@; .............
 .......,....@#@#.@#@@@@@#@@%#@###@@@@; ...........
 ...,,...,@%###@#;#@@%@%%@;@@%@@####@@@@#@@,.......
 ...,..;#@@###@@#.@@@%###%@@;@@@@###@@@@@@@@@%....,
 ,:@@@@@@@####@@#;%%##%@@;;:;@##@@@#@@@#@@@@##@#@@:
 :@@@@@@@#####@@#...........@@%###@@@@@#@@@##@@#@##
 @@@@@#@@##@@#@##..........#@#@##@@@@@@@###@@@@@#@@
 @@@@@@@@@@@#@@##.........%#%@@@#####@@####@@@@###@
 @@@@@@@@#@@#@@##........;#@%@@@@@@@#@@@###@@@###@@
 @@@@@@@###@#@@##,......,#@@#@@@@@@@@@@@###@@@###@@
 @@@@@@######@@##%.....;##@%@@@@@@@@@@@@###@@@@##@@
 @@@@@##@@###@####.....#@@@#@@@@@@@@@#@@##@#@@@@#@@
 @@@@@#@####@@####,.,.#@@@##@@@@@@@@@@@@#@#@@@###@@
 @@@@@@@@###@@@####..#@@@@#@@@@@@@@@@@@@%#@@#@##@@@
 @@@#@@@@###@@@####.@#@@@@##@@@@@@@@@@@@#@@@@@##@@#
 @@@@@@@#@@@@####@#.@#@@@@#@@@#@@@@##@@@@@@@@#@#@@#
 @@@@@@@@@@@@@@####@##@@@##@@#@@@@@@@@@@@@@@@@##@#@
 @@@@@@@@@@@@@@@###@#@@@@@@@@@#@@@@#@#@@@@@@@@#####
 @@@@@@@@@@@@@@@##@@#@@@@#@@@@@@@@@#####@@#@@@@@@@#

Presto!

One Response to “ASCII art from R”