C#とガウシアンフィルタを用いて、画像からノイズを除去する方法について紹介します。
## ガウシアンフィルタで画像のぼかし(C#)
ガウシアンフィルタは、画像の平滑化に使われるフィルタの1つです。
考え方は簡単で、「注目画素からの距離に応じて近傍の画素値に重みをかける」ということをガウス分布を利用して行います。
それにより、自然な平滑化をおこなうことができます。
– | ガウシアンフィルタの原理についてはこちら |
---|---|
参考 | ガウシアンフィルタによる画像のぼかし(ノイズ除去) |
今回はこれをC#で実装してみました。
## ソースコード
プログラムのソースコードです。
using 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]{ {1/16.0, 1/8.0, 1/16.0}, {1/8.0, 1/4.0, 1/8.0}, {1/16.0, 1/8.0, 1/16.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] = Byte2Int(sum); } } return dst; } // double型をbyte型に変換 static byte Byte2Int(double num) { if (num > 255.0) return 255; else if (num < 0) return 0; else return (byte)num; } } }
## 実行結果
プログラムの実行結果です。
元画像(左)とフィルタをかけた画像(右)
- | 関連ページ |
---|---|
1 | ■C#で画像処理入門 |
2 | ■C#入門】基礎文法とサンプル集 |
コメント