読者です 読者をやめる 読者になる 読者になる

OpenCvSharpをつかう その5 (平滑化)

今回はcvSmoothを使った平滑化です。
ただし、画像に対して平滑化をかけるのではサンプルと比べて代わり映えもしませんので、ここでは普通のマネージ配列に対してガウシアンフィルタをかけてみます。今回はほとんど説明は無し。

平滑化

こんなメソッドを作れば、配列の中身を破壊的に変更してガウシアンフィルタをかけることができます。

static void Gaussian(float[] array, int size, double sigma)
{
    using (CvMat mat = new CvMat(array.Length, 1, MatrixType.F32C1, array))
    {
        Cv.Smooth(mat, mat, SmoothType.Gaussian, size, 0, sigma, 0);
    }
}

ここではfloat配列を渡していますが、これはどんな型でも良いわけではありません。cvSmoothでガウシアンフィルタを適用する場合は、「8ビット・16 ビット・32ビット浮動小数点画像」がサポートされています。すなわちC#の型で言うと byte・short・float が可能ということになります。その他の型であればあらかじめ変換が必要です。

cvSmoothも(ガウシアンフィルタの場合は)インプレースモードが可能です。よって、出力先を生成しておく必要なく処理が可能です。

まとめ

using System;
using System.Collections.Generic;
using OpenCvSharp;

namespace ConsoleApprication1
{
    static class Program
    {        
        static void Main()
        {
            // ランダムなfloat配列を作る
            Random rand = new Random();
            float[] array = new float[32];
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = rand.Next(0, 100);
            }

            // ガウシアン前の状態を表示
            PrintArray(array);

            // ガウシアンフィルタをかける
            Gaussian(array, 3, 5);
            // ガウシアン後の状態を表示
            PrintArray(array);

            Console.Read();
        }
        static void Gaussian(float[] array, int size, double sigma)
        {
            using (CvMat mat = new CvMat(array.Length, 1, MatrixType.F32C1, array))
            {
                Cv.Smooth(mat, mat, SmoothType.Gaussian, size, 0, sigma, 0);
            }
        }
        static void PrintArray<T>(IEnumerable<T> array)
        {
            foreach (T item in array)
            {
                Console.Write("{0} ", item);
            }
            Console.WriteLine();
        }
    }
}
95 60 86 32 16 81 26 10 38 40 62 14 29 94 17 26 17 40 77 43 7 13 47 30 65 25 77 17 73 81 8 7 

73.31525 68.91572 64.41446 59.98627 55.80156 52.00299 48.69533 45.93046 43.71385 42.00555 40.7334 39.81175 39.15342 38.68289 38.34426 38.10409 37.94926 37.88052 37.9031 38.0158 38.20041 38.41382 38.58516 38.61721 38.4001 37.82304 36.79551 35.26851 33.2418 30.77204 27.96791 24.97355 


平滑化とノンパラメトリック回帰への招待

平滑化とノンパラメトリック回帰への招待