C#とエンボスフィルタを用いて、画像の輪郭部分を浮き出しする方法について紹介します。
## エンボスフィルタ(C#)
エンボスフィルタ(Emboss Filter)は、輪郭部分を浮き出しする空間フィルタです。
画像のエンボス加工によく使われます。
■入力画像(左)、出力画像(右)
– | 原理についてはこちら |
---|---|
参考 | ■【画像処理】エンボスフィルタで輪郭部分を浮き出し |
今回はこれをC#で実装してみました。
## サンプルコード
サンプルプログラムのソースコードです。
uusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; using System.Drawing.Imaging; namespace ConsoleApp1 { class Program { static void Main(string[] args) { // 画像の読み込み(グレースケールに変換) byte[,] img = LoadImageGray("src.jpg"); // フィルタ用のカーネル const int kernelSize = 3; // カーネルサイズ double[,] kernel = new double[kernelSize, kernelSize]{ {-2.0, -1.0, 0.0}, {-1.0, 1.0, 1.0}, { 0.0, 1.0, 2.0}}; // フィルタ処理 byte[,] img2 = Filter(img, kernel); // 画像保存 SaveImage(img2, "dst.jpg"); } // 画像をグレースケール変換して読み込み static byte[,] LoadImageGray(string filename) { Bitmap img = new Bitmap(filename); int w = img.Width; int h = img.Height; byte[,] dst = new byte[w, h]; // bitmapクラスの画像ピクセル値を配列に挿入 for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { // グレイスケールに変換 dst[j, i] = (byte)((img.GetPixel(j, i).R + img.GetPixel(j, i).B + img.GetPixel(j, i).G) / 3); } } return dst; } static void SaveImage(byte[,] src, string filename) { // 画像の幅・高さ int w = src.GetLength(0); int h = src.GetLength(1); Bitmap img = new Bitmap(w, h); // ピクセル値のセット for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { img.SetPixel(j, i, Color.FromArgb(src[j, i], src[j, i], src[j, i])); } } // 画像の保存 img.Save(filename); } static byte[,] Filter(byte[,] src, double[,] kernel) { // 画像の幅・高さ int w = src.GetLength(0); int h = src.GetLength(1); // カーネルサイズ int kernelSize = kernel.GetLength(0); // 出力画像用の配列 byte[,] dst = new byte[w, h]; // 畳み込み処理 for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { double sum = 0; for (int k = -kernelSize / 2; k <= kernelSize / 2; k++) { for (int n = -kernelSize / 2; n <= kernelSize / 2; n++) { if (j + n >= 0 && j + n < w && i + k >= 0 && i + k < h) { sum += src[j + n, i + k] * kernel[n + kernelSize / 2, k + kernelSize / 2]; } } } dst[j, i] = Double2Byte(sum); } } return dst; } // double型をbyte型に変換 static byte Double2Byte(double num) { if (num > 255.0) return 255; else if (num < 0) return 0; else return (byte)num; } } }
- | 関連ページ |
---|---|
1 | ■C#で画像処理入門 |
2 | ■C#入門】基礎文法とサンプル集 |
コメント