ノートOpenCVの開発(XIV):線形フィルタリングのための基本的なアルゴリズム - フィルタリングブロック

テキストは、元の記事がある場合は、許可なしに複製してはならない
オリジナルのブロガーのブログのアドレスの:https://blog.csdn.net/qq21497936
元ブロガーがナビゲーションブログ:https://blog.csdn.net/qq21497936/article/details / 102 478 062
この記事のブログのアドレス:https://blog.csdn.net/qq21497936/article/details/104458554

ディレクトリ

序文

デモ

プロフェッショナル用語と概念

畳み込み演算

平滑化

画像フィルタリング

フィルタ

リニアフィルタ

フィルターとファジー

演算子をフィルタリングリニア芸術の分野

正規化されました

フィルタブロック

デモ

ソースデモ

プロジェクトテンプレート:バージョン番号v1.9.0に対応

ピットへ

レンジアンカー:ピットへ

 


OpenCVの開発ボックス

OpenCVの開発ノート(四角):使用mingw530_32 コンパイルopenCV3.4.1のソースコード、ビルドQt5.9.3 OpenCVのの開発環境。」

" OpenCVの開発ノート():OpenCVのプレゼンテーションは、コンパイルされました "

" OpenCVの開発ノート(B):CVUIのインタフェース "

OpenCVの開発ノート(C):OpenCVのイメージコンセプトと基本的な操作。」

OpenCVの開発ノート(d)は:OpenCVの写真やビデオデータを取得し、店。」

OpenCVの開発ノート(V):OpenCVの読み出し動作カメラ

OpenCVの開発ノート(VI):OpenCVの基礎となるデータ構造、色、および色空間変換機能

OpenCVの開発ノート(7):OpenCVの基本的なグラフィックス描画します

OpenCVの開発ノート(VIII):OpenCVの一般的な操作のタイミング、スケーリング、回転、ミラーリング

OpenCVの開発ノート(IX):OpenCVの領域画像(ROI )全体、部分混合画像

OpenCVの開発ノート10):OpenCVの画像色チャネル分離画像の色と、マルチチャンネルミキシング

" OpenCVの開発ノート(XI):OpenCVのコンパイルのサポートGPU(CUDA)が勝利-QT-MINGW32の開発加速コンパイラを。"

" OpenCVの開発ノート(XII):OpenCVのコンパイルのサポートGPU(CUDA)WIN-QT-msvc2015の開発加速するコンパイラ(opencv3.4.0 、cuda9.0 、VS2015)を "

OpenCVの開発ノート(XIII):OpenCVの画像のコントラスト、明るさ調整

OpenCVの開発ノート(XIV):線形フィルタリングのための基本的なアルゴリズム- ブロックフィルタ

OpenCVの開発ノート(XV):リニアフィルタリングアルゴリズムの基礎- 平均値フィルタ

OpenCVの開発ノート(XVI):線形フィルタリングのための基本的なアルゴリズム- ガウスフィルタ

OpenCVの開発ノート(17):線形フィルタリングアルゴリズムとの比較のための基礎- ブロック、平均、ガウス

OpenCVの開発ノート(XVIII):非線形フィルタリングアルゴリズムの基礎- メディアンフィルタリング

OpenCVの開発ノート(XIX):非線形フィルタリングアルゴリズムに基づい-バイラテラルフィルタリング

「OpenCVの開発ノート(XX):アルゴリズムの比較のための非線形フィルタリングの基礎 - バイラテラルフィルタリングの値」:解放されます

「OpenCVの開発ノート(XXI):形態学的フィルタリングアルゴリズムの基礎 - インフレ」:解放されます

「OpenCVの開発ノート(XXII):形態学的フィルタリングアルゴリズムの基礎 - 腐食」:解放されます

「OpenCVの開発ノート(XXIII):形態学的フィルタリングアルゴリズムの基礎 - (腐食の最初の拡張後)オープン操作」:公開されます

「OpenCVの開発ノート(24):形態学的フィルタリングアルゴリズムの基礎 - (腐食の最初の拡張後)開閉動作」:公開されます

「OpenCVの開発ノート(XXV):形態学的フィルタリングアルゴリズムの基礎 - 白い帽子」:解放されます

「OpenCVの開発ノート(26):形態学的フィルタリングアルゴリズムの基礎 - ブラックハット」:解放されます

サプリメントを続けて...

 

    ノートOpenCVの開発(XIV):線形フィルタリングのための基本的なアルゴリズム - フィルタリングブロック

 

序文

提供されるBenpianが正式OpenCVのアルゴリズムの基本アルゴリズムを学習する、学習アルゴリズムを入力した後、画像処理アルゴリズムのいくつかの実用化は、結果として得られるマルチリンクの論理集積治療処理の他のデータの開発と相まって、基本的なアルゴリズムの様々な必要最終結果の全体のプロセス。

 

デモ

 

プロフェッショナル用語と概念

畳み込み演算

      ベース畳み込み演算に接触しようとしています。

平滑化

大面積の画像を投影する画像平滑化手段は、低周波成分、トランクセクションまたは抑制画像ノイズ及び高周波数成分画像処理方法の干渉は、目的は、輝度画像勾配を平滑化することで、勾配突然変異は、画像品質を向上させる、減少させました。

補間法、線形:含む方法画像平滑化平滑化法、コンボリューション法などを。ノイズによるこのような画像処理方法線形平滑化方法の使用に、ごま塩ノイズとして、異なるそのような平滑化。

画像フィルタリング

画像のフィルタリングは、ノイズ画像を保存する条件下抑圧対象画像を指し、治療効果の品質を直接その後の画像処理及び分析の有効性に影響を与えるので、さらなる特徴を詳述する、必須画像前処理操作であり、そして信頼性。

       画像フィルタの二つの目的がある:特徴パターン画像として認識される対象物の特徴を抽出するが、他の画像処理の要件を満たすためにあるデジタル化に、画像は、ノイズ混入排除します。

フィルタ

       、ウィンドウに似たフィルタ係数を加重する際に、画像上のウィンドウに入れた画像の平滑化フィルタ、窓から画像の外観。

       フィルターには多くの種類がありますが、フィルタは、OpenCVのも一般的に使用される線形フィルタフィフスを数多く提供しています:

  • ファンクションブロックフィルタ-BoxBlur:リニア
  • 平均フィルタ(技術平均化フィルタ)-Blur関数:線形
  • -GaussianBlurガウスフィルタ機能:リニア
  • -MedianBlurメディアンフィルタ機能:リニア
  • -BilateralFilterバイラテラルフィルタリング機能:非線形

リニアフィルタ

       線形フィルタ:線形フィルタ入力信号周波数は、多くの場合、不要な周波数または所望の周波数の数から選択を排除するために使用されます。

       いくつかの一般的な線形フィルタを次のように

  • ローパスフィルタ:低周波数を可能にすることによって、
  • ハイパスフィルタ:高い周波数を可能にすることにより、
  • バンドパスフィルタ:によって周波数の範囲を許可します。
  • 帯域阻止フィルタ:周波数の範囲を通って他の周波数を可能にすることによる組織。
  • オールパスフィルタ:のみの位相関係を変更することにより、すべての周波数を可能にします。
  • ノッチフィルタ:狭い周波数範囲を介して、組織が、特別なバンドストップフィルタです。

フィルターとファジー

       フィルタリングされた信号は、動作の特定の周波数帯域でフィルタリング抑制することが重要な尺度であるとの干渉を防止しています。ガウス分布がガウスフィルタ関数の関数としての動作をフィルタリングする手段をフィルタリング、ローパスフィルタリング及びハイパスフィルタリングに分割することができるフィルタリング、ガウシアンぼかし操作をローパスガウススイスの鮮鋭化を高いが、通過します。

  • フィルタリング動作のガウシアンフィルタ関数の関数としてフィルタリング手段ガウス。
  • ガウスぼかしフィルタは、ガウスローパスあります

演算子をフィルタリングリニア芸術の分野

       画素オペレータの周りに決定サブピクセルの所定の最終的な出力画素値を使用してフィールド演算子(ローカルオペレータ)。直線技術をフィルタリングする共通フィールド演算子である、出力画素は、加重値と入力画素に依存します。

正規化されました

       処理すべき量を統一し、直感的な定量化に対処するために、例えば(0,1)として、範囲内にスケーリングされる正規化正規化、。

 

フィルタブロック

       ブロックは、画像ブロックをぼかすフィルタを用いてフィルタリングします。

       ブロックプロトタイプフィルタの機能は以下のとおりです。

void boxFilter(InputArray src,   
            OutputArray dst,
            int ddepth, 
            Size ksize, 
            Point anchor=Point(-1, -1), 
            bool normalize = true, 
            int borderType = BORDER_DEFALT)
  • パラメータ:InputArrayは一般CV ::マットを入力し、画像チャネルの任意の数を扱うことができます。ノートは、しかしながら、画像の深さはCV_8U、CV_16U、CV_16S、CV_32F、CV_64Fの一つとして扱われるべきです。
  • パラメータ二; OutputArrayタイプ、出力対象画像は、元画像を必要とし、同じサイズと種類を持っています。
  • 三つのパラメータ:int型は、深さを表す-1原画像を用いて出力画像の深さ。
  • 四つのパラメータ:サイズ型ksize、カーネルのサイズ。3x3の核の大きさを表すために一般的に使用サイズ(H、W)カーネルのサイズを示すために、サイズ(3,3)。
  • 参数五:Point类型,表示锚点(值被平滑的那个点)。注意:默认值Point(-1,-1)。如果点是负值,就表示取核的中心为锚点。
  • 参数六:bool类型normalize,默认为true,表示内核是否被其区域归一化。
  • 参数七:int类型的borderType,用于推断图像外部像素的某种边界模式,使用默认值BORDER_DEFULAT,一般无需使用。

其中:

 

Demo

 

Demo源码

void OpenCVManager::testBoxFilter()
{
    QString fileName1 = "E:/qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/1.jpg";
    cv::Mat matSrc = cv::imread(fileName1.toStdString());

    cv::String windowName = _windowTitle.toStdString();
    cvui::init(windowName);

    if(!matSrc.data)
    {
        qDebug() << __FILE__ << __LINE__
                 << "Failed to load image:" << fileName1;
        return;
    }

    cv::Mat dstMat;
    dstMat = cv::Mat::zeros(matSrc.size(), matSrc.type());
    cv::Mat windowMat = cv::Mat(cv::Size(dstMat.cols * 3, dstMat.rows),
                                matSrc.type());
    bool isBoxFilter = true;
    int ksize = 3;      // 核心大小
    int anchor = -1;    // 锚点, 正数的时候必须小于核心大小,即:-1 <= anchor < ksize
    cvui::window(windowMat, dstMat.cols, 0, dstMat.cols, dstMat.rows, "settings");
    while(true)
    {
        windowMat = cv::Scalar(0, 0, 0);
        // 原图先copy到左边
        cv::Mat leftMat = windowMat(cv::Range(0, matSrc.rows),
                                    cv::Range(0, matSrc.cols));
        cv::addWeighted(leftMat, 1.0f, matSrc, 1.0f, 0.0f, leftMat);
        // 中间为调整方框滤波参数的相关设置
        // 是否方框滤波
        cvui::checkbox(windowMat, 375, 10, "boxFilter", &isBoxFilter);
        cvui::printf(windowMat, 375, 40, "ksize");
        cvui::trackbar(windowMat, 375, 50, 165, &ksize, 1, 10);
        if(anchor >= ksize)
        {
            anchor = ksize - 1;
        }
        cvui::printf(windowMat, 375, 100, "anchor");
        cvui::trackbar(windowMat, 375, 110, 165, &anchor, -1, ksize-1);
        cv::boxFilter(matSrc,
                      dstMat,
                      -1,
                      cv::Size(ksize, ksize),
                      cv::Point(anchor, anchor),
                      isBoxFilter);
        // 效果图copy到右边
        // 注意:rang从位置1到位置2,不是位置1+宽度
        cv::Mat rightMat = windowMat(cv::Range(0, matSrc.rows),
                                     cv::Range(matSrc.cols * 2, matSrc.cols * 3));
        cv::addWeighted(rightMat, 0.0f, dstMat, 1.0f, 0.0f, rightMat);
        // 更新
        cvui::update();
        // 显示
        cv::imshow(windowName, windowMat);
        // esc键退出
        if(cv::waitKey(25) == 27)
        {
            break;
        }
    }
}

 

工程模板:对应版本号v1.9.0

       对应版本号v1.9.0

 

入坑

入坑一:锚点的范围

原因:

锚点的位置(x和y)不能超过或者等于内核的大小,opencv会错误宕机(可以通俗理解为:数组越界宕机)

解决方法:

       锚点可以无限小,但是到-1再往下下已无意义,当时-1是,就代表中心,如x为-1代表x为内核中心,对应y也是,一般默认是cv::Point(-1,-1)就代表内核的中心。

       但是有效果的范围大小应该小于ksize的大小。

       -1 <= 锚点x < 内核ksize的x

       -1 <= 锚点y < 内核ksize的y。


原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/104458554

发布了239 篇原创文章 · 获赞 259 · 访问量 43万+

おすすめ

転載: blog.csdn.net/qq21497936/article/details/104458554