MATLAB imcloseとimopen関数のOpenCV実装
3235 ワード
本論文では,MATLAB imcloseとimopen関数の2つのOpenCV実装を示し,1つは自己腐食と膨張の組合せであり,もう1つは
腐食と膨張の組み合わせ
今日,MATLABのimclose関数,すなわち画像を閉じる演算をOpenCV/C++で実現する必要がある.閉じた演算は、画像を膨張させて腐食させることです.OpenCVの公式ドキュメントMore Morphology Transformationsには良い公式があります.
幸いなことに,OpenCVは閉演算の関数を与えなかったが,膨張と腐食の関数を与え,それぞれ
便宜上ocmu_imclose.cpp関数の内容は以下の通りです.
elementがどのように生成されるか、および特定の関数がどのように呼び出されるかは、例demo_を参照してください.ocmu_imclose.cpp、具体的なコードは以下の通りです.
閉演算が実現されると、以下に示すような開演算も容易に実現される.
ocmu_imopen.cpp関数の内容は以下の通りです.
夜、後輩と話していると、OpenCV内で開閉演算が直接できる関数
Update List: 2015-09-10: 初稿を完成する.
2015-09-11: は
cv::morphologyEx
関数を直接呼び出す.腐食と膨張の組み合わせ
今日,MATLABのimclose関数,すなわち画像を閉じる演算をOpenCV/C++で実現する必要がある.閉じた演算は、画像を膨張させて腐食させることです.OpenCVの公式ドキュメントMore Morphology Transformationsには良い公式があります.
dst = close(src, element) = erode(dilate(src, element))
幸いなことに,OpenCVは閉演算の関数を与えなかったが,膨張と腐食の関数を与え,それぞれ
cv::dilate
とcv::erode
であった.OpenCV-and-CPP-for-MATSLAB-UsersでOCMUにいますFunctionsフォルダの下にocmuが追加されました.imclose.cpp関数は、MATLAB imclose関数のOpenCV実装を与え、具体的なDemoはDemo_を実行することができる.OCMU_Functionsフォルダの下にあるdemo_ocmu_imclose.cpp関数.便宜上ocmu_imclose.cpp関数の内容は以下の通りです.
#include
#include
cv::Mat_ ocmu_imclose(cv::Mat_ binImg, cv::Mat_ element)
{
cv::Mat dilateImg, closeImg;
cv::dilate(binImg, dilateImg, element);
cv::erode(dilateImg, closeImg, element);
return closeImg;
}
elementがどのように生成されるか、および特定の関数がどのように呼び出されるかは、例demo_を参照してください.ocmu_imclose.cpp、具体的なコードは以下の通りです.
#include
#include
#include "..\Headers\ocmu_functions.h"
extern std::string projectPath;
void demo_ocmu_imclose()
{
std::string imgPathStr = projectPath + "images\\opencv-logo2.png";
cv::Mat_ img = cv::imread(imgPathStr, CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat_ binImg = img > 128;
//cv::imshow("binImg", binImg);
//cv::waitKey();
int erosion_size = 20;
int erosion_type = cv::MORPH_RECT;
cv::Size kernelSize = cv::Size(2*erosion_size + 1, 2*erosion_size+1);
cv::Point anchorPoint = cv::Point(erosion_size, erosion_size);
cv::Mat element = cv::getStructuringElement(erosion_type, kernelSize, \
anchorPoint);
int elementType = element.type();
std::cout< closeImg = ocmu_imclose(binImg, element);
cv::imshow("closeImg", closeImg);
cv::waitKey();
}
閉演算が実現されると、以下に示すような開演算も容易に実現される.
dst = open(src, element) = dilate(erode(src, element))
ocmu_imopen.cpp関数の内容は以下の通りです.
#include
#include
cv::Mat_ ocmu_imopen(cv::Mat_ binImg, cv::Mat_ element)
{
cv::Mat erodeImg, openImg;
cv::erode(binImg, erodeImg, element);
cv::dilate(erodeImg, openImg, element);
return openImg;
}
cv::morphologyEx
夜、後輩と話していると、OpenCV内で開閉演算が直接できる関数
cv::morphologyEx
を見たことがあると教えてくれました.このほか,この関数は形態学的勾配,TopHat演算子,Black Hat演算子の操作も可能であり,より詳細には公式文書morphologyExを突き刺すことができる.開閉演算の例コードは次のとおりです. cv::Mat_ morphCloseImg, morphOpenImg;
morphologyEx(binImg, morphCloseImg, cv::MORPH_CLOSE, element);
morphologyEx(binImg, morphOpenImg, cv::MORPH_OPEN, element);
cv::imshow("morphCloseImg", morphCloseImg);
cv::imshow("morphOpenImg", morphOpenImg);
cv::waitKey();
Update List:
morphologyEx
の部分を増やした.