Opencv膨胀和骨架提取(C++)

3
我可以帮您进行文本翻译。这段文本的意思是:
我有这张图片: enter image description here 然后我使用以下代码进行了膨胀操作:
  int dilation_elem = 0;
int dilation_size = 0;
int const max_elem = 2;
int const max_kernel_size = 21;


void Dilation( int, void* );

int main( int argc, char** argv )
{

  src = imread("a18.png");

  if( !src.data )
  { return -1; }

  namedWindow( "Dilation Demo", CV_WINDOW_AUTOSIZE );
  cvMoveWindow( "Dilation Demo", src.cols, 0 );

  createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Dilation Demo",
                  &dilation_elem, max_elem,
                  Dilation );

  createTrackbar( "Kernel size:\n 2n +1", "Dilation Demo",
                  &dilation_size, max_kernel_size,
                  Dilation );
//int dilation_size =7;
  /// Default start

  Dilation( 0, 0 );

  waitKey(0);
  return 0;
}

void Dilation( int, void* )
{
  int dilation_type;
  if( dilation_elem == 0 ){ dilation_type = MORPH_RECT; }
  else if( dilation_elem == 1 ){ dilation_type = MORPH_CROSS; }
  else if( dilation_elem == 2) { dilation_type = MORPH_ELLIPSE; }

  Mat element = getStructuringElement( dilation_type,
                                       Size( 2*dilation_size + 1, 2*dilation_size+1 ),
                                       Point( dilation_size, dilation_size ) );

  dilate( src, dilation_dst, element );
  imshow( "Dilation Demo", dilation_dst );
  imwrite("a18d.png",dilation_dst);
}

这里是英译中:
在进行这一步骤后,我得到了以下结果: enter image description here 最终步骤是骨架:
   #include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
int main()
{
    cv::Mat img = cv::imread("a18d.png", 0);
cv::threshold(img, img, 127, 255, cv::THRESH_BINARY); 
cv::Mat skel(img.size(), CV_8UC1, cv::Scalar(0));
cv::Mat temp;
cv::Mat eroded;

cv::Mat element = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(3,3));

bool done;      
do
{
  cv::erode(img, eroded, element);
  cv::dilate(eroded, temp, element); // temp = open(img)
  cv::subtract(img, temp, temp);
  cv::bitwise_or(skel, temp, skel);
  eroded.copyTo(img);

  done = (cv::countNonZero(img) == 0);
} while (!done);
cv::imshow("Skeleton", skel);
cv::imwrite("18s.png",skel);
cv::waitKey(0);

    return 0;
}

这是代码:

我有这个图片: enter image description here

但我想要像这样的图片: enter image description here

我该怎么做?问题出在哪里? 这些步骤是针对图像4完成的,结果很好。


请发布骨架化代码。目前您已经复制了膨胀代码两次,所以我们不会快速地得到任何进展。 - Malcolm McLean
您可以在此处查看框架代码:https://dev59.com/rnzaa4cB1Zd3GeqPXP9-#22060992 - Andrey Smorodov
谢谢,实际上你的方法更好。我的新结果在这里 http://i.resimyukle.xyz/cyNL.png ,但图片有多余的部分,请问有什么建议解决这个问题吗? - j.doe
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接