MATLAB imcloseとimopen関数のOpenCV実装

3235 ワード

本論文では,MATLAB imcloseとimopen関数の2つのOpenCV実装を示し,1つは自己腐食と膨張の組合せであり,もう1つはcv::morphologyEx関数を直接呼び出す.
腐食と膨張の組み合わせ
今日,MATLABのimclose関数,すなわち画像を閉じる演算をOpenCV/C++で実現する必要がある.閉じた演算は、画像を膨張させて腐食させることです.OpenCVの公式ドキュメントMore Morphology Transformationsには良い公式があります.
dst = close(src, element) = erode(dilate(src, element))

幸いなことに,OpenCVは閉演算の関数を与えなかったが,膨張と腐食の関数を与え,それぞれcv::dilatecv::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:
  • 2015-09-10:
  • 初稿を完成する.

  • 2015-09-11:
  • morphologyExの部分を増やした.