- 学習方法の要約:
- ビデオ学習による理論的知識ポイント+関連するAPIの使用法の予備的理解
- 知識のポイントを整理し、教科書から関連する数学的理論的サポートを調べます
MORPGHOLOGY
- コールバック関数:メイン関数がコールバック関数を呼び出し、メイン関数が実行された後、コールバック関数が実行されます
- createTrackbar
- 原型:createTrackbar(const String&trackbarname、const String&winname、int * value、int count、TrackbarCallback onChange = 0、void * userdata = 0);
- インスタンス:createTrackbar( "要素サイズ"、 "dst_image"、&element_size、max_size、CallBack_Dem);
- パラメーター:スライディングコントロールの名前、表示されるウィンドウの名前、初期しきい値(パラメーターポインター、つまりアドレスが渡される)、コントロールスケールの最大値、コールバック関数
- コールバック関数は関数変数として理解できます
- コールバック関数のプロトタイプはvoid(* TrackbarCallback)(int pos、void * userdata);
- (* TrackbarCallback)は、関数void(int pos、void * userdata)のエイリアスです。
- コールバック関数は、スライドコントロール用に特別に生成されています。
- 最初のパラメーターposは、現在のスライダーの位置を表し、その値は、初期しきい値であるcreateTrackbar()によって彼に渡されます。
- getStructuringElement
- 構造要素を取得し、理解する方法???
- filter \ kernelの以前の定義は、最初にMatでオブジェクトを宣言し、次に要素を1つずつ割り当てることであることが理解できますが、これはより面倒です。ここでopencvは関数をカプセル化し、直接同じことを取得できます。パラメータを指定します。ステップをカプセル化するだけです。最適化はありません。
- パラメータを直接変更してkernel \ filterを取得します
- getStructruingElement(shape、ksize、anchor = None);
- カーネルの形状:MORPH_RECT長方形、MORPH_CORSSクロス、MORPH_ELLIPSE楕円など。
- Size(7,7)に示すように、カーネルの次元サイズ(n、n)。
- 円で示されているように、アンカーポイント(-1、-1)がデフォルト値です。
- 上記の形状は、実際には、図に示すように、 マトリックス内の有効な値の配置です
- 他の形にすることもできます
- 構造要素を取得し、理解する方法???
- 膨張:極大値を見つける操作
- 原理:拡張または侵食操作は、イメージ(またはイメージの一部、Aと呼びます)をカーネル(Bと呼びます)と畳み込むことです。
- カーネルは任意の形状にすることができ、個別に定義された参照ポイント、アンカーアンカーポイントがあり、カーネルはフィルターマスクなどとして理解できます。
- 膨張とは、極大値を見つける操作です。カーネルBは画像と畳み込まれます。つまり、カーネルBがカバーする領域のピクセルの最大値を計算し、この最大値をアンカーに割り当てます。畳み込みカーネルがスキャンするとき画像、それは画像を作ります媒体のハイライト領域は徐々に大きくなります
- 膨張は、BとAの間で接触しているすべての背景点をAにマージするプロセスとして簡単に理解できます。
- API:拡張
- dilate(src0、dst、structureElement、Point(-1、-1));
- パラメータ:ソース画像、結果画像、カーネル、アンカーポイント(-1、-1がデフォルト)
- 原理:拡張または侵食操作は、イメージ(またはイメージの一部、Aと呼びます)をカーネル(Bと呼びます)と畳み込むことです。
- 腐食:腐食は極小値を見つける操作です。
- 原理:腐食は、Aの内側の境界に沿って円を描くように歩くBの中心(アンカーポイント)として理解できます。腐食はハイライト部分にも当てはまります。A領域の外側の部分<ハイライトピクセル、内側が外側に置き換えられます。Bを完全に含むことができるAのピクセルが残されます。
- 腐食は、オブジェクトAのすべての境界点を除去するプロセスとして簡単に理解できます。
- バイナリ画像が白黒の場合、小さなノイズを簡単に除去できます
- API:erode(src0、dst、structureElement、Point(-1、-1);
- 原理:腐食は、Aの内側の境界に沿って円を描くように歩くBの中心(アンカーポイント)として理解できます。腐食はハイライト部分にも当てはまります。A領域の外側の部分<ハイライトピクセル、内側が外側に置き換えられます。Bを完全に含むことができるAのピクセルが残されます。
- オープンオペレーション
- 原理:最初に腐食し、次に膨張することを開封操作と呼びます。特定の用途は依然として前景色と背景色に依存します
- 孤立した小さなドット、画像領域にない小さなドット、または接続ブリッジを削除できます
- API
- 形態Ex(src0、dst、MORPH_OPEN、カーネル);
- 原理:最初に腐食し、次に膨張することを開封操作と呼びます。特定の用途は依然として前景色と背景色に依存します
- クローズ操作
- 原理:最初に膨張してから腐食する
- 画像内の破壊点と流域点を入力します
- API
- 形態Ex(src0、dst、MORPH_CLOSE、カーネル);
- 原理:最初に膨張してから腐食する
- トップハット
- シルクハットは元の画像です-開いた画像
- API
- 形態Ex(src0、dst、MORPH_TOPHAT、カーネル);
- 黒い帽子
- 閉じた画像です-ソース画像
- API
- 形態Ex(src0、dst、MORPH_BLACKHAT、カーネル);
- 形態学的勾配
- 原理:膨張から腐食を差し引いたもの。基本勾配とも呼ばれます。
- API
- 形態Ex(src0、dst、MORPH_GRADIENT、カーネル);
#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>
using namespace std;
using namespace cv;
Mat src0, src1, dst;
int element_size = 3;
int max_size = 21;
void CallBack_Dem(int, void*);
int main(int argc, char ** argv)
{
src0 = imread("C:\\Users\\xujin\\Desktop\\test0.JPG");
if (!src0.data)
{
cout << "no image";
return -1;
}
namedWindow("src0_image", WINDOW_AUTOSIZE);
imshow("src0_image", src0);
namedWindow("dst_image", WINDOW_AUTOSIZE);
createTrackbar("Element Size", "dst_image", &element_size, max_size,CallBack_Dem);
//CallBack_Dem(0, 0);
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
//morphologyEx(src0, dst, MORPH_OPEN, kernel);
//morphologyEx(src0, dst, MORPH_CLOSE, kernel);
//morphologyEx(src0, dst,MORPH_BLACKHAT, kernel);
morphologyEx(src0, dst, MORPH_TOPHAT, kernel);
//morphologyEx(src0, dst, MORPH_GRADIENT, kernel);
imshow("dst_image", dst);
waitKey(0);
return 0;
}
void CallBack_Dem(int, void*)
{
int s = element_size * 2 + 1;
Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
dilate(src0, dst, structureElement, Point(-1, -1));
//erode(src0, dst, structureElement, Point(-1, -1);
imshow("dst_image", dst);
return;
}