Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで画像をASCIIアート(テキスト画像)に変換する方法

この記事では、与えられた画像をテキストベースの画像――いわゆる「ASCIIアート」――に変換する方法を紹介します。


以下のPythonプログラムは、入力画像を受け取ると、まずグレースケール画像へ変換し、その明るさに応じて異なるASCII文字を割り当ててパターンを作り出します。最終的な出力は、プレーンなASCII文字の連なりから構成されるテキストベースの画像になります。

処理の流れ

プログラムは主に以下の関数で構成されています。

  • resize_image(): 元画像のアスペクト比を維持しながら、指定した幅(デフォルトは25px)に縮小します。
  • make_grey(): 画像をグレースケール(Lモード)に変換します。
  • pixel_to_ascii(): 各ピクセルの輝度値(0〜255)を範囲幅25で除算し、その商をインデックスとしてASCII文字リストから対応する文字を取得します。
  • image_to_ascii(): リサイズ・グレースケール化・文字変換を順に実行し、1行あたりnew_width文字ごとに改行を挿入したASCIIアート文字列を生成します。
  • convert_image(): 指定されたパスから画像ファイルを開き、変換結果を同じ名前の.txtファイルとして保存します。

変換に使用する文字リストASCII_CHARSには、「#」「%」「*」「:」「@」など11種類の記号が登録されており、ピクセルの明るさに応じてこれらの文字が使い分けられることで、画像の濃淡がテキストのパターンとして表現されます。

サンプルコード

from PIL import Image
import os

ASCII_CHARS = [ '#', '?', '%', '.', 'S', '+', '.', '*', ':', ',', '@']

def resize_image(image, new_width=25):
    (input__width, input__height) = image.size
    aspect_ratio = input__height/float(input__width)
    changed_height = int(aspect_ratio * new_width)
    changed_image = image.resize((new_width, changed_height))
    return changed_image

def make_grey(image):
    return image.convert('L')

def pixel_to_ascii(image, range_width=25):
    pixels_in_image = list(image.getdata())
    pixels_to_chars = [ASCII_CHARS[pixel_value//range_width] for pixel_value in pixels_in_image]
    return "".join(pixels_to_chars)

def image_to_ascii(image, new_width=25):
    image = resize_image(image)
    image = make_grey(image)
    pixels_to_chars = pixel_to_ascii(image)
    len_pixels_to_chars = len(pixels_to_chars)
    image_ascii = [pixels_to_chars[index: index + new_width] for index in range(0, len_pixels_to_chars, new_width)]
    return "\n".join(image_ascii)

def convert_image(image_filepath):
    try:
        image = Image.open(image_filepath)
    except Exception as e:
        print("Unable to open image file {image_filepath}.".format(image_filepath=image_filepath))
        print(e)
        return
    image_ascii = image_to_ascii(image)
    f = open(os.path.splitext(image_filepath)[0]+'.txt','w')
    f.write(image_ascii)
    f.close()

convert_image('D:\\button.jpg')

実行結果

上記のコードを実行すると、次のような結果が得られます。

入力画像

Pythonで画像をASCIIアート(テキスト画像)に変換する方法

出力画像(ASCIIアート)

Pythonで画像をASCIIアート(テキスト画像)に変換する方法


変換結果は、元画像と同じ名前のテキストファイル(例:「button.txt」)に保存されます。等幅フォントで表示すると、ASCII文字の濃淡によって元の画像の形状が再現されていることを確認できます。

  1. Pythonでフォトモザイクを実装する方法をわかりやすく解説

    フォトモザイク(Photomosaic)とは、1枚の画像を正方形のグリッドに分割し、その各マスを別の画像や色のブロックに置き換える技法です。離れた場所から見ると元の画像がはっきりと見えますが、近づいて観察すると、さまざまな色の小さなブロックが集まって構成されていることが分かります。この記事では、Pythonの「photomosaic」というモジュールを使って、簡単にフォトモザイク画像を作成する方法をご紹介します。photomosaicモジュールのインストールまずは以下のコマンドでphotomosaicモジュールをインストールします。依存関係としてscikit-learnモジュールも同時にダウン

  2. PythonのSunPyライブラリで太陽画像をプロットする方法

    Pythonでは、SunPyというパッケージを使って太陽画像を作成・表示することができます。SunPyには、各地の太陽観測所や太陽研究機関が提供する陽子フラックスや電子フラックスなど、さまざまな太陽観測データが含まれています。 SunPyは、以下のコマンドで簡単にインストールできます。 pip install sunpy AIA画像とは ここではサンプルとしてAIA画像をプロットします。AIA(Atmospheric Imaging Assembly:大気圏撮像装置)は、NASAの太陽観測衛星SDO(Solar Dynamics Observatory)に搭載された観測機器の一つで、太陽大気を