Opencv 膨胀和骨架(c++)

Posted

技术标签:

【中文标题】Opencv 膨胀和骨架(c++)【英文标题】:Opencv Dilation and Skeleton(c++) 【发布时间】:2016-12-30 21:25:39 【问题描述】:

我有这张图片:

我用这段代码应用了膨胀:

  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);

在这一步之后,我得到了这个结果:

最后一步是骨架:

   #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;

代码在这里

我有这张图片:

但我想要这样的图像:

我可以为此做些什么?问题是什么 这些步骤是针对图 4 完成的,结果很好

【问题讨论】:

请发布骨架化代码。目前你已经复制了两次膨胀代码,所以我们不会很快到达任何地方。 你也可以在这里查看骨架代码:***.com/questions/22058485/… 谢谢,其实你的方法更好我的新结果在这里i.resimyukle.xyz/cyNL.png,但是图片对于这个问题有任何建议 【参考方案1】:

与侵蚀操作相比,Open CV 似乎没有收缩。至少我找不到。试试我的

https://github.com/MalcolmMcLean/binaryimagelibrary/blob/master/medialaxistransform.c

尝试仅使用“瘦”功能而不是侵蚀您的图像。

【讨论】:

以上是关于Opencv 膨胀和骨架(c++)的主要内容,如果未能解决你的问题,请参考以下文章

opencv入门之七形态学图像处理:膨胀腐蚀

OpenCV2:大学篇 形态学技术-腐蚀与膨胀操作

OpenCV探索之路:膨胀腐蚀开闭运算

OpenCV图像处理篇之腐蚀与膨胀

opencv图像处理基础之膨胀和腐蚀

youcans 的 OpenCV 例程200篇136. 灰度腐蚀和灰度膨胀