C#での画像処理 – 実践編

C#での画像処理、3回目の今回でおしまいです;オィ

今回のプログラム、構想はあるのですが作りこみが必要になるので概要だけさらって終わりにしようかと思います、万が一興味を持った方は作りこんでみてください;オィ

お題はASCIIアート。画像を適切なサイズにリサイズして2値化した上で画素値を元に文字に置き換えるという簡単な処理で実現できます。つまり、イメージはこういうこと。

taiou

ただ上のような3×3の画素値こんな簡単な対応付けでも2^9 = 512パターンを用意しなければなりません。これが厄介、文字にならない場合どうするんだってのもありますし。そこでここでは画素値に基づいて文字の濃さを割り当ててみます。

白は画素値でいうと255ですが文字の’ ’に割り当て、黒は画素値でいうと0ですが、文字の’轟’ というインクをいっぱい使いそうな文字に割り当て、その間の灰色は密度が合いそうな文字を選択する、という方式です。VGAの画像を1/16に圧縮した後で1画素ごとに文字に割り当ててみます。

ImageToChar.cs

namespace NormalizeCorrelation
{
    using System;
    using System.Text;

    internal class ImageToChar
    {
        MonochromeImage image;

        internal ImageToChar(MonochromeImage srcImage){
            // 適宜必要な変換
            image = srcImage.ScalingHalf().ScalingHalf().ScalingHalf().ScalingHalf();
        }

        public override string ToString()
        {
            StringBuilder builder = new StringBuilder();
            for (int y = 0; y < image.Height; y++)
            {
                for (int x = 0; x < image.Width; x++)
                {
                    builder.Append(ByteToChar(image[x, y]));
                }
                builder.Append(Environment.NewLine);
            }
            return builder.ToString();
        }

        private Char ByteToChar(Byte dat)
        {
            if (dat > 240)
            {
                return ' ';
            }
            if (dat > 200)
            {
                return '、';
            }
            if (dat > 150)
            {
                return '。';
            }
            if (dat > 125)
            {
                return 'ー';
            }
            if (dat > 100)
            {
                return 'い';
            }
            if (dat > 80)
            {
                return 'に';
            }
            if (dat > 65)
            {
                return 'た';
            }
            if (dat > 50)
            {
                return 'な';
            }
            if (dat > 25)
            {
                return '@';
            }
            if (dat > 10)
            {
                return 'ぜ';
            }
            if (dat > 0)
            {
                return '車';
            }
            return '轟';
        }
    }
}

image

動かすとこんな感じ。何が写ってるのかわかりにくいですが、手前にキーボードと私の手、奥にPCディスプレイがあります。TextBoxはMultilineをTrueにしたうえで、フォントを等幅フォントにしておきます。

ASCIIアートソフトを作りこんでみたい方はフォントを大きくしたり、プロポーショナルにしたりすると難易度はどんどん上がっていきます。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中