OpenCVの開発ノート(31):あなたの二重のしきい値の脂肪赤深い理解を持つ8分(簡単なグラフィックスと外観+ +プログラムのソースコードを理解するために)

テキストは、元の記事がある場合は、許可なしに複製してはならない
オリジナルのブロガーのブログのアドレスの:https://blog.csdn.net/qq21497936
元ブロガーがナビゲーションブログ:https://blog.csdn.net/qq21497936/article/details / 102 478 062
この記事のブログのアドレス:https://blog.csdn.net/qq21497936/article/details/104858803
あなたの読者は、貧しい人間の知識と無限、または需要の変化を持っている、または専門家、あるいは自分自身の研究を見つけます

ディレクトリ

序文

デモ

デュアルしきい値

アウトライン

関数プロトタイプを閾値

そして、非動作関数プロトタイプ

ソースデモ

プロジェクトテンプレート:バージョン番号v1.26.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の開発ノート(XX のEr ):形態学的フィルタリングアルゴリズムの基礎- 腐食

OpenCVの開発ノート(XX サン):形態学的フィルタリングアルゴリズムの基礎- 開動作

OpenCVの開発ノート(XX シリコン):形態学的フィルタリングアルゴリズムの基礎- 開閉動作。」

OpenCVの開発ノート(XX ):形態学的フィルタリングアルゴリズムの基礎- 形態学的勾配

OpenCVの開発ノート(XX ):形態学的フィルタリングアルゴリズムのベース- トップハット(帽子)

OpenCVの開発ノート(XX チー):形態学的フィルタリングアルゴリズムの基礎- 黒い帽子

OpenCVの開発ノート(28):あなたは、画像しきい値を識別するために学ぶのでは

OpenCVの開発ノート(29):あなたが適応閾値画像識別の目的を学ぶと。」

OpenCVの開発ノート(30):あなたは、古典的な大津の画像認識で学ぶアルゴリズムのしきい値

OpenCVの開発ノート(31):あなたの二重のしきい値の脂肪赤深い理解を持つ8分(簡単なグラフィックスと外観+ +プログラムのソースコードを理解するために)。」

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

 

    OpenCVの開発ノート(31):あなたの二重のしきい値の脂肪赤深い理解を持つ8分(簡単なグラフィックスと外観+ +プログラムのソースコードを理解するために)

 

序文

なるように赤い太った男!

今日では、二重しきい値は、二重のしきい値は、アップグレードのしきい値上で動作するように理解され、キーはちょっと、そのような行動のポイントまたはピクセル行列を追加することであると述べました!見下したりしてはいけない、この操作は、特に別の画像処理、重畳画像では、将来の大規模なのに有用であり得ます。

 

デモ

 

デュアルしきい値

アウトライン

       画像が透明二重境界特性はデュアル閾値値化処理を優先することができる持っている、デュアル閾値動作は、下限閾値及び上限閾値、場合により低い閾値範囲内の画素の値を想定することができます内部に、閾値は、下限を下回る、到達上限は操作よりも高くありません。

       グレーレベル画像は、我々は中間体100〜200に閾値を必要とするとき、あなたは、下限100、上限200は、区間[0、100]及び{200255]と間隔を設定することができ、0〜255に分割されているものと(100、200)が分割されてもよいです。

       次の式にプッシュ:

関数プロトタイプを閾値

double threshold( InputArray src,
               OutputArray dst,
               double thresh,
               double maxval,
               int type );
  • パラメータ:一般CV ::マットを入力InputArray、及びマルチチャネル、8または32ビット浮動小数点(注処理することができる:例えばRGBのカラーチャンネルなどのマルチチャンネルTHRESH_BINARY処理を使用する場合、各チャネルは、閾値処理されますが、閾値はGよりも大きくなるように設定されている場合、次に比率RがGであってもよく、B大は、Bは、以下Rよりも、最大Rは、)上の閾値形態の他のタイプの赤です。
  • パラメータ二; outputArrayタイプ、出力対象画像は、元画像を必要とし、同じサイズと種類を持っています。
  • 三つのパラメータ: Double型の脱穀、しきい値。
  • 四つのパラメータ: Double型のMAXVAL、「THRESH_BINARY」列挙し、「THRESH_BINARY_INV」列挙が有効に一緒になります使用し、他の列挙は無視します。
  • 5つのパラメータ:タイプのint型、しきい値タイプ。

そして、非動作関数プロトタイプ

void bitwise_and(InputArray src1,
               InputArray src2,
               OutputArray dst,
               InputArray mask = noArray());
  • パラメータ: InputArrayタイプ、通常CV ::マット。
  • パラメータ2: InputArrayタイプ、通常CV ::マット。
  • 三つのパラメータ; outputArrayタイプ、出力対象画像は、元画像を必要とし、同じサイズと種類を持っています。
  • 四つのパラメータ: InputArray型マスク、マスク選択動作マスクは、指定された要素の8つのシングルチャンネル・アレイは、出力配列を変更します。

 

ソースデモ

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

    int width = 300;
    int height = 200;
    cv::resize(srcMat, srcMat, cv::Size(width, height));

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

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

    qDebug() << __FILE__ << __LINE__
             << "Succeed to load image, type =" << srcMat.type()
             << "channels = " << srcMat.channels();

    cv::Mat dstMat;
    dstMat = cv::Mat::zeros(srcMat.size(), srcMat.type());
    cv::Mat windowMat = cv::Mat(cv::Size(dstMat.cols * 3, dstMat.rows * 2),
                                srcMat.type());

    int minThresh = 100;
    int maxThresh = 200;
    int maxVal = 255;

    while(true)
    {
        windowMat = cv::Scalar(0, 0, 0);
        // 原图先copy到左边
        cv::Mat leftMat = windowMat(cv::Range(0, srcMat.rows),
                                    cv::Range(0, srcMat.cols));
        cv::addWeighted(leftMat, 1.0f, srcMat, 1.0f, 0.0f, leftMat);

        // 调整阈值化的参数thresh
        cvui::printf(windowMat, width * 2 + 50, 0 + height * 0, "minThresh");
        cvui::trackbar(windowMat, width * 2 + 50, 15 + height * 0, 200, &minThresh, 0, 255);

        // 调整阈值化的参数thresh
        cvui::printf(windowMat, width * 2 + 50, 60 + height * 0, "maxThresh");
        cvui::trackbar(windowMat, width * 2 + 50, 75 + height * 0, 200, &maxThresh, 0, 255);

        // 调整阈值化的参数maxval
        cvui::printf(windowMat, width * 2 + 50, 120 + height * 0, "maxVal");
        cvui::trackbar(windowMat, width * 2 + 50, 135 + height * 0, 200, &maxVal, 0, 255);

        // 转换成灰度图像
        cv::Mat grayMat;    // 多通道
        cv::Mat grayMat2;   // 单通道
#if 1
        // CV_XXXX 与 cv::COLOR_BGR2GRAY 实际并没有区别 是高低版本表现形式的问题
        cv::cvtColor(srcMat, grayMat2, CV_BGR2GRAY);
        cv::cvtColor(grayMat2, grayMat, CV_GRAY2BGR);
#else
        cv::cvtColor(srcMat, grayMat2, cv::COLOR_BGR2GRAY);
        cv::cvtColor(grayMat2, grayMat, cv::COLOR_GRAY2BGR);
#endif
        // 效果图copy
        cv::Mat rightMat = windowMat(cv::Range(srcMat.rows * 0, srcMat.rows * 1),
                                     cv::Range(srcMat.cols * 1, srcMat.cols * 2));
        cv::addWeighted(rightMat, 0.0f, grayMat, 1.0f, 0.0f, rightMat);

        {
            cv::Mat threadMatMin;
            cv::Mat threadMatMax;
            cv::Mat threadMatMin2;
            cv::Mat threadMatMax2;
            // 最小值的阈值化:低于最大值得置0,高于最小值的为255
            cv::threshold(grayMat2, 
                          threadMatMin,
                          minThresh, 
                          maxVal, 
                          cv::THRESH_BINARY);
            // 单通道转为3通道(窗口为3通道的mat)
            cv::cvtColor(threadMatMin, threadMatMin2, CV_GRAY2BGR);
            // 效果图copy
            cv::Mat mat1 = windowMat(cv::Range(srcMat.rows * 1, srcMat.rows * 2),
                                       cv::Range(srcMat.cols * 0, srcMat.cols * 1));
            cv::addWeighted(mat1, 0.0f, threadMatMin2, 1.0f, 0.0f, mat1);

            // 最大值的阈值化: 大于最大值的反倒置0,低于最大值的为255
            cv::threshold(grayMat2,
                          threadMatMax, 
                          maxThresh, 
                          maxVal, 
                          cv::THRESH_BINARY_INV);
            // 单通道转为3通道(窗口为3通道的mat)
            cv::cvtColor(threadMatMax, threadMatMax2, CV_GRAY2BGR);
            // 效果图copy
            cv::Mat mat2 = windowMat(cv::Range(srcMat.rows * 1, srcMat.rows * 2),
                                       cv::Range(srcMat.cols * 1, srcMat.cols * 2));
            cv::addWeighted(mat2, 0.0f, threadMatMax2, 1.0f, 0.0f, mat2);

            // 然后将两者进行与计算
            cv::bitwise_and(threadMatMin, threadMatMax, dstMat);
            // 单通道转为3通道(窗口为3通道的mat)
            cv::cvtColor(dstMat, dstMat, CV_GRAY2BGR);
            // 效果图copy
            cv::Mat center = windowMat(cv::Range(srcMat.rows * 1, srcMat.rows * 2),
                                       cv::Range(srcMat.cols * 2, srcMat.cols * 3));
            cv::addWeighted(center, 0.0f, dstMat, 1.0f, 0.0f, center);
        }

        // 更新
        cvui::update();
        // 显示
        cv::imshow(windowName, windowMat);
        // esc键退出
        if(cv::waitKey(25) == 27)
        {
            break;
        }
    }
}

 

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

       対応するバージョン番号v1.26.0


オリジナルのブロガーのブログのアドレス:https://blog.csdn.net/qq21497936
オリジナルのブロガーがナビゲーションブログ:https://blog.csdn.net/qq21497936/article/details/102478062を
この記事のブログのアドレス:HTTPS://ブログ.csdn.net / qq21497936 /記事/詳細/ 104858803

250元記事公開 ウォンの賞賛308 ビューに46万+を

おすすめ

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