[031]瞬間と瞬間のOpenCVの研究ノートのコンセプト詳細画像

ディレクトリ

I.はじめに

第二に、一瞬の概念を説明します

1、離散ケース

図2に示すように、連続的なケース

第三に、画像の幾何学瞬間

1、幾何学的な瞬間の概念

2、P + Qの最初の瞬間の画像

3、HU矩

1.原点瞬間

2.中心モーメント

3.正規中心モーメント

4、関連するAPI

1.Momentsクラス

2.moments機能

3.contourArea機能

4.arcLength機能

図5はコード

6、結果


I.はじめに

画像モーメントは、OpenCVの研究では、最後の内容を指摘しています。これを終了し、彼はフォローアップのエネルギーがあれば、研究ノートを終え、だけでなく、戦闘のいくつかのコードを書くために、ご支援をお願いいたします。

あなたがOpenCVのプレゼンテーション、学習のチュートリアル、コードの実用的な、一般的なエラーと解決策についての学習に関連する他のコンテンツを表示したい場合は、直接私のOpenCVのカテゴリーを見ることができます:

【OpenCVの系列】ます。https://blog.csdn.net/shuiyixin/article/category/7581855

あなたはより多くの首長と通信するために、コンピュータビジョン、OpenCVの、機械学習、深い学習やその他の関連技術についての詳細を学びたい場合は、今私たちに参加するには、次のFanger魏コードをスキャン!

 

第二に、一瞬の概念を説明します

今、この事は、この用語は、あまりにも多くの矩形を構成長方形であることができ、マトリックスは、私は瞬間を知りたいので、その特定のシーンを理解することが必要であり、m行n列の2次元配列です。

今日は、画像モーメント新しい概念であり、画像の瞬間について話した画像の瞬間である、我々は最初、理解する瞬間の数学を見なければならないので、この概念は、一瞬の数学から来ています。まず、その定義および関連する概念で見てみましょう:

数学や統計では、瞬間(モーメント)がある変数と分布の形態学的特徴のセットの尺度モーメント定義されているすべての変数がある場合、固定点の平均電力の偏差のポイントN次モーメントは次のように定義されているのN確率密度関数(確率密度関数、PDF)のそれらの可変パワーの積分積文献におけるN次モーメントは、一般に、シンボルμNで表されます。

直接可変トルクを使用して中心モーメントの除去は、平均値(中心モーメント)が呼び出された後に計算され、元の計算されたトルク(生モーメント)と呼ばれます

完成コンセプトの後、我々は最後の瞬間に長い鋸で式直感的な外観から来ます。

1、離散ケース

私たちのコンセプトの瞬間から、私たちは、第1の離散ケースを考えてみます。

k個のパワー(順序)で表される定数Aで表される離散ランダム変数Xが、存在すると仮定する。その後、我々は、以下の式を有します:

これは、点Aに関するXのk次モーメントと呼ばれています

定数Aがゼロであれば、我々は瞬間kがこの順序を呼び出すk番目の原点瞬間

この定数X Aは、私たちが呼ばれることを意味E(X)において、k次モーメントである場合のk次の中心モーメントは

最初の瞬間は、変数の数学的期待値(期待値)を示し重心の分布です。

変数二次モーメントは、分散(分散)であり、分散度を表します。

変数は、歪度(スキューネス)第三モーメント対称プロファイルからのずれの程度を表します。

第四のモーメントが可変尖度(尖度)であり、分布ピークの程度は、例えば、尖度= 0の正規分布係数を記載しました。

X、Y.:我々は2つの離散確率変数を使用している場合 A1、A2は、それぞれ、ランダム変数がpと、2つの定数に対応する表し、qは、我々は、以下の式を有する、電源(順番)を示します。

これは、p + qは最初の瞬間のA1、A2上のX、Yポイントと呼ばれています。

2つの定数が0であれば、我々は呼んで一瞬のp + q個のオーダー混合起源を

対応する二つの定数は、平均している場合、すなわち、A1 = E(X)、A2 = E(Y)は、 我々は呼び出しP + Q順序中心モーメントを混合します

 

図2に示すように、連続的なケース

次に、我々は継続的なケースを考えてみます。

連続したランダム変数x、k個のパワー(順序)で表される定数Aで表される単一変数F(X)の確率密度関数が存在すると仮定する。その後、我々は、以下の式を有します:

これは、点Aに関するXのk次モーメントと呼ばれています

結合確率X、Y、(x、y)はF二つの変数の密度:我々は2つの連続したランダム変数を持っている場合。A1、A2は、それぞれ、ランダム変数がpと、2つの定数に対応する表し、qは、我々は、以下の式を有する、電源(順番)を示します。

これは、P + Qの最初の瞬間のA1、A2上のX、Yポイントと呼ばれます。

 

第三に、画像の幾何学瞬間

1、幾何学的な瞬間の概念

モーメントの概念を理解し、我々は、画像の幾何学的な瞬間について話しようとしています。画像には、次の瞬間の概念:

モーメントであるオペレータの画像特徴を説明しました

ここで画像が単一チャネルで、グレースケール画像は、上記分散液の場合である行列、と等価です。行列上の各位置の範囲は、0〜255の整数です。

2、P + Qの最初の瞬間の画像

P + Q画像次モーメントは、以下の式を使用して定義されます。

ときのp + q = 0で、ゼロ次モーメント:

ときのp + q = 1で、一次モーメントです。

とき、P + Q = 2、二次モーメントです。

上記の結果により、我々は、その結果、固定点(0,0)に、この時間を画像座標と画像の重心の方向を取得することができます

画像の重心座標:

オブジェクトの形状の方向:

3、HU矩

HUモーメントの画像における瞬間がありますが、これは胡が1962年に提唱され、以下のとおりです。

(1)元の行列

(2)中心モーメント

(3)正規化された中心モーメント

 

1.原点瞬間

固定小数点のモーメント座標が原点(0,0)です。次のように式は次のとおりです。

 

2.中心モーメント

 

これは中心として固定点(X0、Y0)における中心モーメントです。

 

3.正規中心モーメント

正規化中心モーメントは、正規化処理を行うための中心的な瞬間です。

 

4、関連するAPI

1.Momentsクラス

、APIの前に次のように定義された瞬間のクラス、およそレットの話を話すこと:

class CV_EXPORTS_W_MAP Moments
{
public:
    //! the default constructor
    Moments();
    //! the full constructor
    Moments(double m00, double m10, double m01, double m20, double m11,
            double m02, double m30, double m21, double m12, double m03 );

    //! @name spatial moments
    CV_PROP_RW double  m00, m10, m01, m20, m11, m02, m30, m21, m12, m03;

    //! @name central moments
    CV_PROP_RW double  mu20, mu11, mu02, mu30, mu21, mu12, mu03;

    //! @name central normalized moments
    CV_PROP_RW double  nu20, nu11, nu02, nu30, nu21, nu12, nu03;
};

これは、2つのデフォルトコンストラクタと3重のデータ型を持っています

データの最初のセット:空間モーメント(空間モーメント)我々はゼロ次モーメント原点モーメント、最初の瞬間、二次モーメント及び第三モーメントに言及上記に対応します。

第2のデータセット:中心モーメント(中心モーメント)、我々は二次モーメントと第三モーメントの中心モーメントを言及上記に対応します。

第3のデータセット:中央正規化モーメントが(中心モーメントを正規化された)、我々は中心モーメントと二次モーメントの第三のモーメントを正規化言及上記に対応します。

 

2.moments機能

Moments moments( 
    InputArray array, 
    bool binaryImage = false 
);

次のように関数のパラメータは次のとおりです。

(1)InputArray类型的array,输入的光栅图像(单通道、8位或浮点二维数组)或二维点的数组。

(2)bool类型的binaryImage,如果为true,则所有非零图像像素都被视为1。该参数仅用于图像。

3.contourArea函数

double contourArea( 
    InputArray contour, 
    bool oriented = false 
);

函数参数含义如下:

(1)InputArray类型的contour,二维点(轮廓顶点)的输入向量,存储在std::vector或Mat中。

(2)bool类型的oriented,面向区域标志。如果为真,则函数将根据轮廓方向(顺时针或逆时针)返回带符号区域值。使用此功能,可以通过获取区域的符号来确定轮廓的方向。默认情况下,参数为false,这意味着返回绝对值。

4.arcLength函数

double arcLength( 
    InputArray curve, 
    bool closed 
);

函数参数含义如下:

(1)InputArray类型的curve,二维点的输入向量,存储在std::vector或Mat中。

(2)bool类型的closed,指示曲线是否闭合的标志。

 

5、代码展示

 

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

Mat src, gray_src;
int threshold_value = 80;
int threshold_max = 255;
const char* input_win = "【输入图像】";
const char* output_win = "【输出图像】";
const char* trackbar_title = "Threshold:";
RNG rng(12345);

void Demo_Moments(int, void*);
int main() {
	src = imread("E:/image/moments.png");
	if (!src.data)
	{
		cout << "could not load image !";
		waitKey(0);
		return -1;
	}
	cvtColor(src, gray_src, CV_BGR2GRAY);
	GaussianBlur(gray_src, gray_src, Size(3, 3), 0, 0);

	namedWindow(input_win, CV_WINDOW_AUTOSIZE);
	namedWindow(output_win, CV_WINDOW_AUTOSIZE);
	imshow(input_win, src);

	createTrackbar("Threshold", output_win, &threshold_value, threshold_max, Demo_Moments);
	Demo_Moments(0, 0);

	waitKey(0);
	return 0;
}

void Demo_Moments(int, void*) {
	Mat canny_output;
	vector<vector<Point>> contours;
	vector<Vec4i> hierachy;

	Canny(gray_src, canny_output, threshold_value, threshold_value * 2, 3, false);
	findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));

	vector<Moments> contours_moments(contours.size());
	vector<Point2f> ccs(contours.size());
	for (size_t i = 0; i < contours.size(); i++) {
		contours_moments[i] = moments(contours[i]);
		ccs[i] = Point(static_cast<float>(contours_moments[i].m10 / contours_moments[i].m00), static_cast<float>(contours_moments[i].m01 / contours_moments[i].m00));
	}

	Mat drawImg;// = Mat::zeros(src.size(), CV_8UC3);
	src.copyTo(drawImg);
	for (size_t i = 0; i < contours.size(); i++) {
		if (contours[i].size() < 100) {
			continue;
		}
		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
		printf("center point x : %.2f y : %.2f\n", ccs[i].x, ccs[i].y);
		printf("contours %d area : %.2f   arc length : %.2f\n", i, contourArea(contours[i]), arcLength(contours[i], true));
		drawContours(drawImg, contours, i, color, 1, 8, hierachy, 0, Point(0, 0));
		circle(drawImg, ccs[i], 1, color, 1, 8);
	}

	imshow(output_win, drawImg);
}

 

6、执行结果

center point x : 451.00 y : 295.00
contours 2 area : 6493.00   arc length : 307.08
center point x : 451.00 y : 295.00
contours 3 area : 6451.00   arc length : 304.74
center point x : 296.00 y : 296.00
contours 4 area : 7234.00   arc length : 318.39
center point x : 296.00 y : 296.00
contours 5 area : 7188.00   arc length : 316.05
center point x : 296.00 y : 296.00
contours 6 area : 5812.00   arc length : 285.42
center point x : 296.00 y : 296.00
contours 7 area : 5770.00   arc length : 283.08
center point x : 495.00 y : 196.00
contours 8 area : 7537.00   arc length : 326.39
center point x : 495.00 y : 196.00
contours 9 area : 7496.00   arc length : 324.05
center point x : 495.00 y : 196.00
contours 10 area : 6079.00   arc length : 293.42
center point x : 495.00 y : 196.00
contours 11 area : 6045.00   arc length : 291.08
center point x : 140.00 y : 158.00
contours 12 area : 9359.00   arc length : 367.36
center point x : 140.00 y : 158.00
contours 13 area : 9313.00   arc length : 365.02
center point x : 344.00 y : 128.00
contours 14 area : 5525.00   arc length : 306.45
center point x : 344.00 y : 127.00
contours 15 area : 5493.00   arc length : 304.11
center point x : 247.00 y : 90.00
contours 16 area : 6527.00   arc length : 317.28
center point x : 247.00 y : 90.00
contours 17 area : 6525.00   arc length : 314.94
center point x : 247.00 y : 90.00
contours 18 area : 5125.00   arc length : 281.97
center point x : 247.00 y : 90.00
contours 19 area : 5119.00   arc length : 279.62

大家也可以自己尝试一下呀,一定要多做练习!

发布了276 篇原创文章 · 获赞 554 · 访问量 56万+

おすすめ

転載: blog.csdn.net/shuiyixin/article/details/104646531