OpenCVスタディノートマスク操作

1つはマスク操作

         マトリックスのマスク操作は非常に簡単です。アイデアは、マスクマトリックス(カーネルとも呼ばれます)に従って、画像内の各ピクセルの値を再計算することです。マスクマトリックスの値は、隣接するピクセル値(ピクセル自体の値を含む)が新しいピクセル値にどの程度影響するかを示します。数学的な観点から、自分で設定した重みを使用して、ピクセル近傍の値の重み付き平均を作成します。

2.運用慣行

2.1ピクセル近傍に基づくマスク操作

/*!
 * \brief myMaskFun
 * \param srcImage
 * \return
 */
Mat myMaskFun(Mat srcImage)
{
    const int nChannels = srcImage.channels();
    Mat resultImage(srcImage.size(), srcImage.type());
    for (int j = 1; j < srcImage.rows - 1; j++)
    {
        const uchar* previous = srcImage.ptr<uchar>(j - 1);
        const uchar* current = srcImage.ptr<uchar>(j);
        const uchar* next = srcImage.ptr<uchar>(j + 1);
        uchar * output = resultImage.ptr<uchar>(j);
        for (int i = nChannels; i < nChannels*(srcImage.cols - 1); ++i)
        {
            *output++ = saturate_cast<uchar>(current[i - nChannels] + current[i + nChannels]
                + previous[i] + next[i]) / 4;
        }
    }

    //! 进行边界处理
    resultImage.row(0).setTo(Scalar(0));
    resultImage.row(resultImage.rows - 1).setTo(Scalar(0));
    resultImage.col(0).setTo(Scalar(0));
    resultImage.col(resultImage.cols - 1).setTo(Scalar(0));
    return resultImage;
}

2.2システム機能モード

/*!
 * \brief systemMaskFun
 * \param srcImage
 * \return
 */
Mat systemMaskFun(Mat srcImage)
{
    Mat resultImage(srcImage.size(), srcImage.type());
    //! 构造核函数因子
    Mat kern = (Mat_<float>(3, 3) << 0, 1, 0,
                                1, 0, 1,
                                0, 1, 0) / (float)(4);
    filter2D(srcImage, resultImage, srcImage.depth(), kern);
    return resultImage;
}

 filter2D関数については、付録1で詳しく説明しています。

コードの詳細は「OpenCVマスク操作の練習」にあります。

参考資料:

付録1:filter2D関数

フィルタ2D関数は、画像の畳み込みを計算する操作のためにOpenCVで提供されています。最初に、この関数を簡単に紹介します。

void filter2D( InputArray src, OutputArray dst, int ddepth,InputArray kernel,Point anchor=Point(-1,-1),double delta=0, int borderType=BORDER_DEFAULT );

 

この関数は、基本的に画像畳み込み操作を実装するために使用されます。最初の2つのパラメーターは、それぞれ入力画像と出力画像を表します。3番目のパラメーターddepthは、画像の深さを表します。この値が負の数に設定されている場合、画像の深さ入力ソース画像の深さは同じですが、それ以外の場合はソース画像の深さに応じて設定する必要があります

たとえば、src.depth()= CV_8Uの場合、ddepth = -1 / CV_16S / CV_32F / CV_64F、src.depth()= CV_16U / CV_16Sの場合、ddepth = -1 / CV_32F / CV_64F、src.depth()の場合= CV_32F、次にddepth = -1 / CV_32F / CV_64F、src.depth()= CV_64Fの場合、ddepth = -1 / CV_64F。

4番目のパラメーターkernelは、単一チャネルの浮動小数点行列である畳み込みカーネル演算子です。複数のチャネルに異なる畳み込みカーネル演算子の計算を適用する場合は、最初にそれらを単一のチャネルに分割してから、単一のチャネルで操作を実行する必要があります。パラメータanchorは、コンボリューションカーネルのアンカーポイントです。デフォルト値は(-1、-1)で、コンボリューションカーネルの中心を意味します。パラメータdeltaは平滑化係数であり、この値を使用して、ターゲット画像が生成される前にターゲット画像を平滑化できます。最後のパラメーターは境界タイプを表し、デフォルト値はBORDER_DEFAULT)です。

この関数は線形フィルタリング手法でよく使用されることに注意してください。畳み込みカーネル演算子によって計算された画像ターゲットポイントが画像の外側にある場合、指定された境界を補間する必要があります。この関数は、畳み込み演算ではなく、実際に画像の相関を計算します。計算式は次のとおりです。

О中0 <= x '<kernel.cols、0 <= y' <kernel.rows

付録2:色空間変換cvtColor()

void cvtColor(InputArray src、OutputArray dst、int code、int dstCn = 0);

パラメータの説明: 
。InputArraysrc:入力画像は、色空間変換される元の画像であり、Matクラスにすることができます
。OutputArraydst:出力画像は、画像を格納するために変換される色空間です。または、Matクラスにすることもできます 。intcode 
:変換されたコードまたは識別子、つまり、どのフォーマットの画像がどのフォーマットの画像に変換されるかを決定するために、後で詳しく説明し 
ます。intdstCn = 0:ターゲット画像のチャネル番号。値が0の場合、srcとコードによって決定されます。 

おすすめ

転載: blog.csdn.net/a8039974/article/details/104861383