C#クリップボードの画像にバイラテラルフィルタを適用

OpenCVSharpコンピュータ

OpenCVには多数の画像フィルターがあるのですがペイントソフトなどで活用する方法がないか考えてみました。

多くのペイントソフトでは画像をコピーするとクリップボードにビットマップとして記憶されます。C#でそのビットマップを取り出し、OpenCVのフィルタを適用しクリップボードに戻してあげます。その後ペイントソフトに貼り付けるとフィルタ適用後の画像が張り付きます。

// 
// クリップボードの画像にバイラテラルフィルタを適用
// 

using System;
using System.Windows.Forms;
using System.Drawing;

using OpenCvSharp;
using OpenCvSharp.Extensions;

// コンパイル
// csc ClipBilateral.cs /r:OpenCvSharp.dll /r:OpenCvSharp.Extensions.dll

class Prog {

    const int d = 9;
    const double sigmaColor = 75.0;
    const double sigmaSpace = 75.0;

    // エントリーポイント
    [STAThread]
    static void Main() {

        // クリップボードからビットマップを取得
        Bitmap canvas = (Bitmap)Clipboard.GetImage();
        if (canvas == null) {
            Console.WriteLine("クリップボードに画像無し");
            return;
        }

        // バイラテラルフィルタ適用
        using(var src = BitmapConverter.ToMat(canvas))
        using(var dst = new Mat()) {
            Cv2.BilateralFilter(src, dst, Prog.d, Prog.sigmaColor, Prog.sigmaSpace);
            canvas = BitmapConverter.ToBitmap(dst);
        };

        // クリップボードにビットマップをセット
        Clipboard.SetImage(canvas);
    }
}// class

今回はサンプルとしてバイラテラルフィルタで試していますが、フィルタの適用を部分を別のフィルタに差し替えることが出来ます。
Windows10付属のペイントなどはほとんどフィルタは存在しませんが、この方法を使えば疑似的にフィルタ機能を付与することが出来ます。

また、GUIのフォームでフィルタやオプションを選べるようにしたりプレビュー画面を作成するのも面白そうだと思います。

コメント