プログラミングを解説したり、音楽の紹介とか、スポーツ・趣味の紹介とか。1人でも見てくれる人がいる限り、更新を続けます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
画像処理で画像上から顔の輪郭といったエッジを出したい時があります。エッジ検出の手法は、かなりたくさんありますが、その中でもシンプルなラプラシアンフィルターを紹介します。



ラプラシアンフィルターは、1ピクセルの周りを含めた9近傍に次のようなマスクをかけ足し合わせる処理を全てのピクセルで行います。
1 1 1
1 -8 1
1 1 1

前にやったローパスフィルター(平滑化)のときのマスクが
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9
だったので画像をぼかしているということがわかります。一方で、ラプラシアンフィルタのマスクを良く見ると、画像上の変化が大きい箇所で大きな値が出ることがわかります。

[2009/2/8追記]
お絵かきツールに、ラプラシアンフィルタを入れてみました。
興味ある方はお絵かきの方もぜひ!
えのぐひろば [http://www.enoguhiroba.net/]

プログラムのほうは、前にやった「bitmapを読み込む」、「実空間でローパスフィルターをかける」のプログラムを改造して作っています。
// C#で画像にラプラシアンフィルタをかけエッジ検出
// 画像の保存のために、2次元配列からbitmapクラスの
// SetPixelメソッドを使用しピクセル値をbitmapオブジェクトに
// 入れています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace LoadBitmap
{
    class Program
    {
        static void Main(string[] args)
        {
            Bitmap bitmap = new Bitmap("test.bmp");
            byte[,] data = new byte[bitmap.Width, bitmap.Height];

            // フィルタマスク
            const int MaskSize = 3;
            int[,] mask = new int[MaskSize, MaskSize] { {1,1,1},
                                                        {1,-8,1},
                                                        {1,1,1}};

            // bitmapクラスの画像ピクセル値を配列に挿入
            for (int i = 0; i < bitmap.Height; i++)
            {
                for (int j = 0; j < bitmap.Width; j++)
                {
                    data[j, i] = bitmap.GetPixel(j, i).B;
                }
            }

            // 画像処理後の2次元配列
            byte[,] moddata = new byte[bitmap.Width, bitmap.Height];
            // ローパスフィルターで画像処理
            for (int i = 0; i < bitmap.Height; i++)
            {
                for (int j = 0; j < bitmap.Width; j++)
                {
                    int sum = 0;
                    for (int k = -MaskSize / 2; k <= MaskSize / 2; k++)
                    {
                        for (int n = -MaskSize / 2; n <= MaskSize / 2; n++)
                        {
                            if (j + n >= 0 && j + n < bitmap.Width
                                && i + k >= 0 && i + k < bitmap.Height)
                            {
                                sum += data[j + n, i + k]
                                        * mask[n + MaskSize / 2,
                                            k + MaskSize / 2];
                            }
                        }
                    }
                    moddata[j, i] = (byte)sum;
                }
            }

            // bitmapクラスのSetPixelでbitmapオブジェクトに
            // ピクセル値をセット
            for (int i = 0; i < bitmap.Height; i++)
            {
                for (int j = 0; j < bitmap.Width; j++)
                {
                    bitmap.SetPixel(j, i,
                        Color.FromArgb(
                        moddata[j, i],
                        moddata[j, i],
                        moddata[j, i]));
                }
            }

            // 画像の保存
            bitmap.Save("outbmp.bmp");
        }
    }
}
ソースを全部載せてしまいましたw
今回のソースでは、BitmapクラスのSaveメソッドで画像の保存もしています。なので、結果画像を見ることができます。

http://colnagow61s.me.land.to/LaplacianFilter.zip
ソースコードを置いておきます。

独習C# 第2版
独習C# 第2版
posted with amazlet at 08.05.25
ハーバート・シルト
翔泳社
売り上げランキング: 14590
おすすめ度の平均: 4.5
5 買って良かった
4 GUIアプリケーションの習得は別の本で
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://thorshammer.blog95.fc2.com/tb.php/43-de16ec3d
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
QLOOKアクセス解析