ホームページ  >  記事  >  バックエンド開発  >  C# でエッジ検出アルゴリズムを実装する方法

C# でエッジ検出アルゴリズムを実装する方法

王林
王林オリジナル
2023-09-20 11:00:43876ブラウズ

C# でエッジ検出アルゴリズムを実装する方法

#C でエッジ検出アルゴリズムを実装する方法

#エッジ検出は画像処理の分野で一般的に使用されるテクノロジであり、画像からオブジェクトを抽出するのに役立ちます。情報。広く使用されているプログラミング言語である C# は、エッジ検出アルゴリズムを簡単に実装することもできます。この記事では、2 つの一般的なエッジ検出アルゴリズムである Sobel 演算子と Canny 演算子を C# で実装する方法を紹介します。

    Sobel オペレーター
Sobel オペレーターは、勾配ベースのエッジ検出アルゴリズムです。画像内のピクセルのグレー値とその周囲のピクセルのグレー値の差を計算することで、その点がエッジ点であるかどうかを判断します。以下は、Sobel オペレーターを使用してエッジ検出を実装する C# コードの例です。

using System;
using System.Drawing;

namespace EdgeDetection
{
    class Program
    {
        static void Main(string[] args)
        {
            Bitmap image = new Bitmap("input.jpg"); // 读取输入图像
            Bitmap edgeImage = new Bitmap(image.Width, image.Height); // 创建输出图像

            int[,] sobelX = new int[,] { {-1, 0, 1}, {-2, 0, 2}, {-1, 0, 1} };
            int[,] sobelY = new int[,] { {1, 2, 1}, {0, 0, 0}, {-1, -2, -1} };

            for (int y = 1; y < image.Height - 1; y++)
            {
                for (int x = 1; x < image.Width - 1; x++)
                {
                    int gx = 0;
                    int gy = 0;

                    for (int j = -1; j <= 1; j++)
                    {
                        for (int i = -1; i <= 1; i++)
                        {
                            int gray = image.GetPixel(x + i, y + j).R;
                            gx += gray * sobelX[i + 1, j + 1];
                            gy += gray * sobelY[i + 1, j + 1];
                        }
                    }

                    int magnitude = (int)Math.Sqrt(gx * gx + gy * gy);
                    edgeImage.SetPixel(x, y, Color.FromArgb(magnitude, magnitude, magnitude));
                }
            }

            edgeImage.Save("output.jpg"); // 保存输出图像
        }
    }
}

上記のコードは、まず「input.jpg」という名前の画像を入力画像として読み取り、同じサイズの画像を作成します。入力画像ビットマップオブジェクトedgeImageを出力画像として。次に、Sobel オペレーターの 2 つのコア、sobelX と sobelY が定義され、入力イメージのピクセルがネストされたループを通過します。ピクセルごとに周囲のピクセルとのグレー値の差が計算され、その差分を使用してエッジ強度が計算され、最終的にエッジ強度がグレー値として出力画像に設定されます。

    Canny オペレーター
Canny オペレーターは、マルチステップ処理に基づくエッジ検出アルゴリズムです。 Sobel オペレーターと比較して、Canny オペレーターはエッジ位置決め機能が優れており、誤検出率が低くなります。以下は、Canny オペレーターを使用してエッジ検出を実装する C# コードの例です。

using System;
using System.Drawing;

namespace EdgeDetection
{
    class Program
    {
        static void Main(string[] args)
        {
            Bitmap image = new Bitmap("input.jpg"); // 读取输入图像
            Bitmap edgeImage = new Bitmap(image.Width, image.Height); // 创建输出图像

            // 首先使用高斯滤波对图像进行平滑处理
            // ...

            // 然后计算图像的梯度和方向
            // ...

            // 根据梯度大小和方向,应用非最大抑制和双阈值处理
            // ...

            edgeImage.Save("output.jpg"); // 保存输出图像
        }
    }
}

上記のコードでは、まず「input.jpg」という名前の画像を入力画像として読み取り、出力イメージと同じイメージ サイズのビットマップ オブジェクトedgeImage を入力します。次のいくつかのステップ (ガウス フィルタリング、勾配計算、非最大値抑制、二重しきい値処理) は、Canny オペレーターの重要なステップです。これらのステップを完了するには、関連する文献やチュートリアルを参照してください。

概要

この記事では、C# でエッジ検出アルゴリズムを実装するための 2 つの一般的な方法、Sobel 演算子と Canny 演算子を紹介します。これらのアルゴリズムを実装することで、画像から物体のエッジ情報を抽出することができます。読者は、自分のニーズや実際の状況に応じてアルゴリズムを調整および拡張して、より良いエッジ検出結果を得ることができます。

以上がC# でエッジ検出アルゴリズムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。