OpenCVは画像接続ドメインを実現します。


画像の接続領域とは、画像の中で同じ画素値を有し、位置が隣接する画素からなる領域を指し、連通ドメイン分析とは、画像の中で互いに独立した接続領域を見つけてマークすることをいう。
一般的には、一つの接続ドメインには一つの画素値しか含まれていないので、画素値の変動が異なる接続領域を抽出する影響を防止するために、連通ドメイン分析で常に処理されるのは二値化された画像である。
4-近傍および8-近傍:

よく使われる画像近傍解析法には2回の走査法とシード充填法がある。二回のスキャン法は2回の画像を巡回します。初めて画像を遍歴すると、各非0ピクセルに数字ラベルを与えます。あるピクセルの上と左側の隣のピクセルに数字ラベルがある場合、両方の中の最小値を現在のピクセルのラベルとして取ります。そうでないと、現在のピクセルに新しい数字ラベルを付けます。初めて画像を巡回した時には、同じドメインに1つまたは複数の異なるラベルが付与される場合があります。
種充填法はコンピュータ画像学に由来し、いくつかの図形を充填するのが一般的である。この方法はまず、すべての非0ピクセルを一つのセットに入れ、その後、セットの中からランダムに一つの画素をシード画素として選択し、隣接関係に従ってシード画素のある接続領域を拡張し、拡張されたピクセルをセットの中から削除し、シード画素のある接続領域が拡張できなくなるまで、その後、セットの中からランダムに一つの画素を新しいシード画素として選択します。上記のプロセスは、セット内にピクセルがないまで繰り返される。

CV_EXPORTS_AS(connectedComponentsWithAlgorithm) int connectedComponents(InputArray image, OutputArray labels,
                                           int connectivity, int ltype, int ccltype);
  • イメージ:異なる接続領域を示す単一チャネル画像のデータタイプはCV_でなければなりません。8 Uです
  • Labels:異なる接続領域をマークした出力画像は、入力画像と同じサイズです。
  • connectivity:連通ドメインをマークする際に使用する近傍の種類、4は4-近傍を表し、8は8-近傍を表します。
  • ltype:出力画像のデータタイプは、CV_に対応しています。32 SとCV_16 Uの2種類のデータタイプ。
  • cltype:接続ドメインをマークする際に使用するアルゴリズムタイプフラグで、選択できるパラメータと意味はテーブルに
  • を与えます。

    この関数は、2値画像における接続ドメインの個数を計算し、画像において異なる接続ドメインを異なる数値ラベルでマークし、ラベル0は、画像における背景領域を表し、一方、関数は、intタイプのリターンデータを有し、画像における接続ドメインの数を表す。関数の最初のパラメータは、マーキングされたドメインの入力画像であり、入力された画像は必ずデータタイプのCV_である必要があります。8 Uの単一チャネルグレースケール画像は、二値化された二値画像が望ましい。関数の2番目のパラメータは、ドメインにラベルを付けた出力画像で、画像サイズは最初のパラメータの入力画像サイズと同じで、画像のデータタイプは関数の4番目のパラメータに関連しています。関数の3番目のパラメータは連結ドメインを統計する時に選択された近傍の種類で、関数は2つの近傍をサポートし、それぞれ4で4-近傍を表し、8は8-近傍を表します。関数の4番目のパラメータは出力画像のデータタイプで、選択できるパラメータはCV_です。32 SとCV_16 Uの2種類です。関数の最後のパラメータは、接続ドメインをマークする際のアルゴリズムのフラグであり、選択できるパラメータと意味は表で示しており、現在はGrana(BBDT)とWu(SAUF)の2つのアルゴリズムのみをサポートしています。 
    OpenCVは簡単な関数形式も与えた。
    
    int connectedComponents(InputArray image, OutputArray labels,
                                         int connectivity = 8, int ltype = CV_32S);
  • イメージ:異なる接続領域の画像の単一チャンネルをマーキングするには、データタイプはCV_でなければなりません。8 Uです
  • Labels:異なる接続領域をマークした出力画像は、入力画像と同じサイズです。
  • connectivity:連通ドメインをマークする際に使用する近傍の種類、4は4-近傍を表し、8は8-近傍を表し、デフォルトのパラメータは8です。
  • ltype:出力画像のデータタイプは、CV_に対応しています。32 SとCV_16 Uの2種類のデータタイプで、デフォルトのパラメータはCV_です。32 Sです。
  • この関数のプロトタイプは4つのパラメータしかありません。前の2つのパラメータはそれぞれ入力画像と出力画像を表します。3番目のパラメータは統計的な接続領域の時に選択された近傍の種類を表します。それぞれ4で4を表します。8は8-近傍を表します。パラメータのデフォルト値は8です。最後のパラメータは出力画像のデータタイプを表します。選択できるパラメータはCV_です。32 SとCV_16 Uの2つのパラメータのデフォルト値はCV_です。32 Sです。この関数のプロトタイプには2つのパラメータが標準値を持っています。使用時には少なくとも2つのパラメータが必要で、関数の呼び出しに極めて便利です。
    各接続領域の中心位置、矩形領域の大きさ、区域面積などの情報をさらに統計する。
    複雑な
    
    CV_EXPORTS_AS(connectedComponentsWithStatsWithAlgorithm) int connectedComponentsWithStats(InputArray image, OutputArray labels,
                                  OutputArray stats, OutputArray centroids,
                                  int connectivity, int ltype, int ccltype);
  • イメージ:異なる接続領域を示す単一チャネル画像のデータタイプはCV_でなければなりません。8 Uです
  • Labels:異なる接続領域をマークした出力画像は、入力画像と同じサイズです。
  • stats:異なる接続ドメイン統計情報を含むマトリックス、マトリックスのデータタイプはCV_32 Sです。マトリクスのi行目はラベルiの接続ドメインの統計特性で、格納されている統計情報の種類は表6-4で与えられます。
  • centroids:各接続ドメインのセントロイド座標、データタイプはCV_である。64 Fです
  • connectivity:連通ドメインをマークする際に使用する近傍の種類、4は4-近傍を表し、8は8-近傍を表します。
  • ltype:出力画像のデータタイプは、CV_に対応しています。32 SとCV_16 Uの2種類のデータタイプ。
  • cltype:接続ドメインで使用されるアルゴリズムタイプフラグをマークし、選択可能なパラメータおよび意味を表に示します。
  • この関数は、画像内の異なる接続ドメインタグを用いて、各接続ドメインの中心位置、矩形領域サイズ、領域面積などの情報を同時に集計することができます。関数の最初の2つのパラメータの意味はconnectedComponents()関数の最初の2つのパラメータの意味と一致し、入力画像と出力画像です。関数の3番目のパラメータは各接続ドメイン統計情報行列であり、画像にN個の接続ドメインがある場合、このパラメータ出力のマトリクスサイズはNである。×5,マトリクスの各ラインはそれぞれ接続ドメインの統計特性を保存しています。詳細な統計特性は表で示しています。i番目の接続領域を含む境界枠の水平長を読みたいなら、stats.at(i,CC_)を通じて(通って)STAT_WIDT H)またはstats.at(i,0)は読み取りを行います。関数の4番目のパラメータは各接続ドメインセントロイドの座標であり、画像にN個の接続ドメインがある場合、このパラメータ出力のマトリクスサイズはNである。×2,マトリクスの各ラインはそれぞれ接続ドメインセントロイドのx座標とy座標を保存し、Cntroids.at(i,0)とcentroids.at(i,1)によりそれぞれi番目の接続ドメインセントロイドのx座標とy座標を読み取ることができる。関数の5番目のパラメータは連結ドメインを統計する時に選択された近傍の種類で、関数は2つの近傍をサポートし、それぞれ4で4-近傍を表し、8は8-近傍を表します。関数の6番目のパラメータは出力画像のデータタイプで、選択できるパラメータはCV_です。32 SとCV_16 Uの2種類です。関数の最後のパラメータは接続ドメインをマークして使用するアルゴリズムであり、選択できるパラメータは上の表で与えられ、現在はGrana(BBDT)とWu(SAUF)の2つのアルゴリズムのみをサポートしています。 

    簡単な
    
    int connectedComponentsWithStats(InputArray image, OutputArray labels,
                                                  OutputArray stats, OutputArray centroids,
                                                  int connectivity = 8, int ltype = CV_32S);
    
    
  • イメージ:異なる接続領域を示す単一チャネル画像のデータタイプはCV_でなければなりません。8 Uです
  • Labels:異なる接続領域をマークした出力画像は、入力画像と同じサイズです。
  • stats:異なる接続ドメインの統計情報マトリックス、マトリックスのデータタイプはCV_32 Sです。マトリクスのi行目はラベルiの接続ドメインの統計特性で、格納されている統計情報の種類は表6-4で与えられます。
  • centroids:各接続ドメインのセントロイド座標、データタイプはCV_である。64 Fです
  • connectivity:連通ドメインをマークする際に使用する近傍の種類、4は4-近傍を表し、8は8-近傍を表し、デフォルトのパラメータ値は8です。
  • ltype:出力画像のデータタイプは、CV_のみ対応しています。32 SとCV_16 Uの2種類のデータタイプで、デフォルトのパラメータ値はCV_です。32 Sです。
  • この関数のプロトタイプは6つのパラメータしかなく、前の2つのパラメータはそれぞれ入力画像と出力画像を表し、第3のパラメータは各接続領域の統計情報を表し、第4のパラメータは各接続領域のセントロイド位置を表します。後の二つのパラメータはそれぞれ統計的な接続ドメインの時に選択された近傍の種類を表し、それぞれ4で4を表し、8は8-近傍を表し、パラメータのデフォルト値は8です。最後のパラメータは出力画像のデータタイプを表します。選択できるパラメータはCV_です。32 SとCV_16 Uの2つのパラメータのデフォルト値はCV_です。32 Sです。この関数のプロトタイプは2つのパラメータが標準値を持っています。使用時には少なくとも4つのパラメータが必要で、関数の呼び出しが非常に便利です。
    簡単な例
    
    //
    // Created by smallflyfly on 2021/6/16.
    //
     
    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
     
    #include <iostream>
     
    using namespace std;
    using namespace cv;
     
    int main() {
     
        Mat im = imread("rice.jfif");
        Mat gray;
        cvtColor(im, gray, CV_BGR2GRAY);
    //    resize(im, im, Size(0, 0), 0.5, 0.5);
     
        imshow("im", im);
     
        Mat im1;
        threshold(gray, im1, 125, 255, THRESH_BINARY);
     
        imshow("im1", im1);
    //    waitKey(0);
     
        RNG rng(10010);
        Mat out;
        int num = connectedComponents(im1, out, 8, CV_16U);
        vector<Vec3b> colors;
        for (int i=0; i<num; i++) {
            //              
            Vec3b vec = Vec3b(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));
            colors.push_back(vec);
        }
        Mat result = Mat::zeros(im.size(), im.type());
        for (int i = 0; i < im.rows; ++i) {
            for (int j = 0; j < im.cols; ++j) {
                int label = out.at<uint16_t>(i, j);
                if (label == 0) {
                    continue;
                }
                result.at<Vec3b>(i, j) = colors[label];
            }
        }
     
        imshow("result", result);
     
        Mat labels, stats, centroids;
        int count = connectedComponentsWithStats(im1, labels, stats, centroids, 8);
        cout << count << endl;
     
        for (int i = 1; i < count; ++i) {
            int x = centroids.at<double>(i, 0);
            int y = centroids.at<double>(i, 1);
            cout << x << " " << y << endl;
            circle(im, Point(x, y), 2, Scalar(0, 0, 255), -1);
            int xmin = stats.at<int>(i, CC_STAT_LEFT);
            int ymin = stats.at<int>(i, CC_STAT_TOP);
            int w = stats.at<int>(i, CC_STAT_WIDTH);
            int h = stats.at<int>(i, CC_STAT_HEIGHT);
     
            Rect rect(xmin, ymin, w, h);
            rectangle(im, rect, Scalar(0, 255, 255), 2);
            putText(im, to_string(i), Point(x+5, y), FONT_HERSHEY_SCRIPT_SIMPLEX, 1, Scalar(0, 0, 255), 2);
        }
     
        imshow("im", im);
     
        waitKey(0);
        destroyAllWindows();
     
        return 0;
     
    }
    簡単な二色図の効果は比較的に明らかです。  Baiduの写真を検索します 

    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。