Opencv画像処理-数学的形態演算

序文

この記事では、画像処理の形態学的操作について説明します


1.数学的形態画像処理の基本概念

ここに画像の説明を挿入

1.1数理形態学入門

       数理形態学は、格子理論とトポロジーに基づく画像解析の主題であり、数理形態学画像処理の基本理論です。その基本的な操作には、バイナリ腐食と膨張、バイナリ開閉操作、骨格抽出、限界腐食、ヒットアンドミス変換、形態勾配、トップハット変換、粒子分析、分水界変換、灰値腐食と膨張、グレー値開口が含まれます。クロージング操作、グレー値の形態学的勾配など。

1.2、数学的形態の構成

       数学的形態学は、形態学的代数演算子のセットで構成されています。これには、拡張(または拡張)、腐食(または侵食)、開閉の4つの基本操作があります。これらはバイナリイメージとグレースケールイメージにあります。それぞれに独自の特性があります。これらの基本的な操作に基づいて、さまざまな数学的形態学的実用アルゴリズムを導出して組み合わせることができ、画像のセグメンテーション、特徴抽出、エッジ検出、画像フィルタリング、画像の強調と復元など、画像の形状と構造を分析および処理するために使用できます。数理形態学法では、構造要素と呼ばれる「プローブ」を使用して画像情報を収集します。プローブが画像内を絶えず移動している場合、画像のさまざまな部分の関係を調べて、画像の構造特性を理解できます。数学的形態学は、人間のFOA(注意の焦点)の視覚的特徴に似ている検出のアイデアに基づいています。プローブの構造要素として、画像の構造特性を検出および調査するための知識(形状、サイズ、さらにはグレーと色度の情報)を直接伝達できます。

1.3数理形態学の応用

       数学的形態学の基本的な考え方と方法は、ヒット/ミス変換に基づくターゲット認識、流域の概念に基づく画像セグメンテーション、侵食とオープン操作に基づくスケルトン抽出、画像コーディングなど、画像処理に関連するすべての側面に適用できます。圧縮、測地距離に基づく画像再構成、形態学的フィルターに基づく粒子分析など。
数理形態学は、厳密な数学的理論に基づく学問であり、その基本的な考え方と方法は、画像処理の理論と技術に大きな影響を与えてきました。実際、数理形態学は新しい画像処理方法と理論を構成し、コンピューターデジタル画像処理とフラクタル理論の重要な研究分野になり、多くの分野でデジタル画像分析と処理のプロセスに適用されてきました。この主題は、コンピューターテキスト認識、コンピューター顕微鏡画像分析(定量的金属組織分析、粒子分析など)、医療画像処理(細胞検出、心臓運動プロセス研究、脊椎癌画像の自動定量的記述など)、画像コーディング圧縮、産業検査(食品検査や印刷回路自動検査など)、材料科学、ロボットビジョン、自動車の動きの監視などはすべて非常に成功したアプリケーションを実現しています。さらに、数学的形態指紋検出、経済地理学、合成音楽、および断層撮影X線イメージングにおいても優れたアプリケーションの見通しがあります。形態学的手法は、画像アプリケーションの分野のエンジニアや技術者にとって不可欠なツールになっています。

2、バイナリイメージ

2.1。意味

       バイナリイメージとは、各ピクセルが黒または白であるイメージを指します。バイナリ画像は、一般的にキャラクター画像を説明するために使用されます。その利点は、占有するスペースが少ないことです。欠点は、人物や風景の画像を表現する場合、バイナリ画像はエッジ情報しか表示できず、画像内のテクスチャの特徴は表示されないことです。明らかです。現時点では、テクスチャ機能が豊富なグレースケール画像を使用する必要があります。

2.2。サンプルバイナリイメージ

ここに画像の説明を挿入

2.3。画像の2値化処理ロジック

       画像の2値化プロセスでは、画像上のポイントのグレー値を0または255に設定します。つまり、画像全体に明確な白黒効果を与えます。つまり、256の輝度レベルを持つグレースケール画像が適切なしきい値を介して選択され、画像の全体的および局所的な特性を反映できる2値化された画像が取得されます。デジタル画像処理では、二値画像を処理および分析するために、最初にグレースケール画像を二値化して二値画像を取得する必要があります。これは、画像のさらなる処理に役立ち、画像の集合的な性質は関連ピクセル値が0または255のポイントの位置が関連し、ピクセルのマルチレベル値が関与しなくなったため、処理が簡単になり、データ処理と圧縮の量が少なくなります。理想的なバイナリイメージを取得するために、閉じた接続された境界を使用して、重複しない領域を定義します。グレースケールがしきい値以上のすべてのピクセルは特定のオブジェクトに属していると判断され、グレースケール値は255です。それ以外の場合、これらのピクセルはオブジェクト領域から除外され、グレースケール値は0で、背景を示します。または例外的なオブジェクト領域。


2.4、opencvバイナリ処理機能

2.4.1、threshold()関数

はじめに:各配列要素に固定レベルのしきい値を適用し、手動でしきい値を指定して、このしきい値を2値化に使用します。
関数の定義:

double threshold( InputArray src, OutputArray dst, double thresh, double maxval, int type );
/*
src输入数组(多通道,8位或32位浮点),即图像。
dst输出数组的大小和类型与src的通道数相同。
thresh参数阈值。
maxval用于#THRESH_BINARY和#THRESH_BINARY_INV thresholding的最大值类型。
type如果使用大津法或三角形法,则返回计算出的阈值。
*/

2.4.2、adaptiveThreshold()関数

はじめに:配列に適応しきい値を適用し、最後の2つのパラメーターを設定して効果を調整します。
関数の定義:

void adaptiveThreshold( InputArray src, OutputArray dst, double maxValue, 
		int adaptiveMethod, int thresholdType, int blockSize, double C );
/*
src源8位单通道图像。
dst目标映像与src大小和类型相同的param 
maxValue指定给满足条件的像素的非零值
adaptiveMethod自适应阈值算法的使用#BORDER_REPLICATE |#BORDER_ISOLATED用于处理边界。
thresholdType Thresholding type必须是#THRESH_BINARY或#THRESH_BINARY_INV,
blockSize用于计算阈值的像素邻域的大小像素:3、5、7等等。
参数C常数从平均值或加权平均值中减去。正常情况下为正,但也可能为零或负。
*/

3、Opencvイメージの基本的な二項演算

3.1。腐食操作:erode()関数

はじめに:指定された構造要素を使用して、ソース画像を腐食します。構造要素は、最小ピクセル近傍の形状を決定します。
定義:

void erode( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1,
            int borderType = BORDER_CONSTANT,  const Scalar& borderValue = morphologyDefaultBorderValue() );
/*
src:为输入图像对象通道数可以是任意的,但深度应该是CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
dst:输出与src大小和类型相同的图像。
kernel:用于扩展的内核结构元素;如果elemenat=Mat(),则为3 x 3矩形使用结构元素。
anchor:可以使用#getStructuringElement创建内核anchor元素中锚点的位置;默认值(-1,-1)表示锚点位于元素中心。
iterations:迭代次数应用腐蚀。
borderType:像素外推方法,不支持边框环绕。
borderValue:如果是常量border,则为border值
*/

3.2。拡張操作:dilate()関数

はじめに:指定された構造要素を使用してソース画像を展開します。これにより、最大値が取得されるピクセル近傍の形状が決まります。
定義:

void dilate( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1,
             int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() );
/*
src:为输入图像对象通道数可以是任意的,但深度应该是CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
dst:输出与src大小和类型相同的图像。
kernel:用于扩展的内核结构元素;如果elemenat=Mat(),则为3 x 3矩形使用结构元素。
anchor:可以使用#getStructuringElement创建内核anchor元素中锚点的位置;默认值(-1,-1)表示锚点位于元素中心。
iterations 迭代应用扩展的次数。
borderType:像素外推方法,不支持边框环绕。
borderValue:如果是常量border,则为border值
*/

3.3、morphologyEx()関数

はじめに:morphologyExは、侵食と拡張を使用して、高度な形態変換の基本操作を実行できます。任意の操作をその場で行うことができます。マルチチャンネル画像の場合、各チャンネルは独立して処理されます。
定義:

void morphologyEx( InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1,-1), 
				   int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() );
/*
src:源图像。通道的数量可以是任意的。深度应该是CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
dst:目标映像的大小和类型与源映像相同。
Type:形态学运算的类型,请参见#MorphTypes
kernel:内核结构元素。可以使用#getStructuringElement创建它。
anchor :锚定与内核的锚定位置。负值表示锚点位于内核中心。
iterations :迭代应用腐蚀和膨胀的次数。
borderType:像素外推方法,请参见#BorderTypes。#不支持边框自动换行。
borderValue:如果是常量Border,则为Border值。默认值具有特殊的意思。
迭代次数是应用侵蚀或膨胀操作的次数。
例如,具有两次迭代的打开操作(#MORPH_OPEN)等价于apply
*/

3.3.1。オープン操作:MORPH_OPEN

最初に腐食し、次に膨張する操作。
機能:小さなオブジェクトを排除し、細い場所でオブジェクトを分離し、大きなオブジェクトの境界を滑らかにします。

3.3.2。クローズ操作:MORPH_CLOSE

最初の膨張、次に腐食の操作。
機能:オブジェクトの小さな穴を埋め、隣接するオブジェクトを接続し、境界を滑らかにします。

3.3.3、勾配操作:MORPH_GRADIENT

バイナリイメージでこの操作を実行すると、塊のエッジを強調表示できます。
役割:オブジェクトのエッジ輪郭を保持するための形態学的グラデーション

3.3.4。トップハット操作:MORPH_TOPHAT

開操作後の画像を元の画像から差し引いた結果のエフェクト画像は、プロトタイプの輪郭の周囲よりも明るい領域を強調表示します。
機能:隣接するパッチより明るいパッチを分離します。

3.3.5。ブラックハット操作:MORPH_BLACKHAT

元の画像の輪郭の周りの領域よりも暗い領域を強調表示します。
機能:隣接するポイントよりも暗いパッチを分離します

3.4、getStructuringElement()関数

はじめに:形態学的操作に使用される指定されたサイズと形状の構造要素を返します。
関数:通常、この関数を使用して、以前の関数定義のパラメーターカーネルと連携し、適合構造要素を構築します。
定義:

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
/*
shape:元素可以是#MorphShapes之一的形状
ksize:结构元素的大小。
anchor:锚定元素内的锚定位置。默认值\f$(-1,-1)\f$表示锚在中间。只有十字形元素的形状取决于锚点位置。在其他情况下,锚定只会调节结果的大小操作转移。
*/

3.5、createTrackbar()関数

はじめに:関数createTrackbarは、指定された名前でトラックバー(スライダーまたは範囲コントロール)と範囲を作成し、トラックバーと同期する位置として変数値を指定し、トラックの位置が指定されたときに呼び出されるコールバック関数onChangeを指定しますバーが変わります。作成したトラックバーが指定したウィンドウに表示されます。
定義:

int createTrackbar(const String& trackbarname, const String& winname, int* value, 
					int count,TrackbarCallback onChange = 0,void* userdata = 0);
/*
trackbarname:创建的轨迹栏的名称。
winname:将用作所创建轨迹栏父级的窗口的名称。
value:指向整数变量的可选指针,该整数变量的值反映滑块。创建时,滑块位置由该变量定义。
count:滑块的最大位置。最小位置总是0。
onChange:指向每次滑块改变位置时要调用的函数的指针。这个函数的原型应该是void Foo(int,void\*);其中第一个参数是trackbar位置,第二个参数是用户数据(见下一个参数)。如果回调是空指针,不调用回调,但只更新值。
userdata:按原样传递给回调的用户数据。它可以用来处理轨迹栏不使用全局变量的事件。
*/ 

3.6。形態学的操作タイプの列挙:

enum MorphTypes{
    
    
    MORPH_ERODE    = 0, //!< see #erode
    MORPH_DILATE   = 1, //!< see #dilate
    MORPH_OPEN     = 2, //!< an opening operation
    MORPH_CLOSE    = 3, //!< a closing operation
    MORPH_GRADIENT = 4, //!< a morphological gradient
    MORPH_TOPHAT   = 5, //!< "top hat"
    MORPH_BLACKHAT = 6, //!< "black hat"
    MORPH_HITMISS  = 7  //!< "hit or miss"
};

4、コードのデモンストレーション:

4.1腐食と膨張

コードブロック

//腐蚀与膨胀
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

Mat src, dst;
int element_size = 2;
int max_size = 20;
void CallBack_Demo(int, void*) {
    
    
	int s = element_size * 2 + 1;
	Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
	dilate(src, dst, structureElement, Point(-1, -1));//膨胀
	
	//erode(src, dst, structureElement);//腐蚀
	imshow("output_image", dst);
}
int main() {
    
    
	src = imread("D:\\Myfile\\素材照片\\opencv素材照片\\4.jpg");
	if (!src.data) {
    
    
		cout << "could not load image..." << endl;
		return 0;
	}
	namedWindow("input_image", WINDOW_AUTOSIZE);
	imshow("input_image", src);
	namedWindow("output_image", WINDOW_AUTOSIZE);
	createTrackbar("Element Size :", "output_image", &element_size, max_size, CallBack_Demo);
	CallBack_Demo(0, 0);
	imshow("output_image", dst);

	waitKey(0);
	return 0;
}

演算結果:
ここに画像の説明を挿入

4.2、開く、閉じる、グラデーション、シルクハット、ブラックハットおよびその他の操作

コードブロック:

//形态学操作
#include <opencv2/opencv.hpp>
#include <iostream>
#include "facedetectcnn.h"

using namespace std;
using namespace cv;
int main() {
    
    
	Mat src, dst;
	src = imread("D:\\Myfile\\素材照片\\opencv素材照片\\11.jpg");
	if (!src.data) {
    
    
		cout << "could not load image..." << endl;
		return 0;
	}
	namedWindow("input_image", WINDOW_AUTOSIZE);
	imshow("input_image", src);
	
	//Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));//结构元素
	//morphologyEx(src, dst, MORPH_OPEN, kernel);//开操作,先腐蚀后膨胀
	//morphologyEx(src, dst, MORPH_CLOSE, kernel);//闭操作,先膨胀后腐蚀

	//梯度:膨胀减去腐蚀,基本梯度(内部梯度,方向梯度)
	//morphologyEx(src, dst, MORPH_GRADIENT, kernel);

	//顶帽 原图像和开操作图像
	//morphologyEx(src, dst, MORPH_TOPHAT, kernel);

	//黑帽 原图像和闭操作图像
	//morphologyEx(src, dst, MORPH_BLACKHAT, kernel);

	//提取水平和垂直线
	cvtColor(src, dst, COLOR_BGR2GRAY);
	Mat Bin_dst;
	adaptiveThreshold(dst, Bin_dst, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);//二值化图像
	Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
	Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));
	Mat kernels = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	//Mat temp;
	//erode(Bin_dst, temp, kernels);
	//dilate(temp, dst, kernels);
	morphologyEx(Bin_dst, dst, MORPH_OPEN, hline);
	bitwise_not(dst, dst);
	blur(dst, dst, Size(3, 3), Point(-1, -1));
	namedWindow("output_image", WINDOW_AUTOSIZE);
	imshow("output_image", dst);
	waitKey(0);
	return 0;
}

演算結果:
ここに画像の説明を挿入

総括する

この記事では、数学的形態学の操作について説明します:腐食、膨張、開閉、勾配、シルクハット、ブラックハット

参考資料

ご不明な点がございましたら、メッセージを残してください!
エラーがあれば訂正してください!

おすすめ

転載: blog.csdn.net/ivan_9/article/details/113935721