C++ Opencv扩张和骨架(c+;+;)
我有这样的图像: 我用这个代码进行了膨胀:C++ Opencv扩张和骨架(c+;+;),c++,opencv,C++,Opencv,我有这样的图像: 我用这个代码进行了膨胀: 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 ) { retu
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;
}
#包括
#包括“opencv2/highgui/highgui.hpp”
#包括“opencv2/imgproc/imgproc.hpp”
int main()
{
cv::Mat img=cv::imread(“a18d.png”,0);
cv::threshold(img,img,127255,cv::THRESH_二进制);
cv::Mat skel(img.size(),cv_8UC1,cv::Scalar(0));
cv::垫温;
cv::席状侵蚀;
cv::Mat元素=cv::getStructuringElement(cv::MORPH_CROSS,cv::Size(3,3));
布尔多;
做
{
cv::侵蚀(img,侵蚀,元素);
cv::扩张(腐蚀、温度、元素);//温度=打开(img)
cv::减去(img、temp、temp);
cv::按位_或(skel、temp、skel);
侵蚀。复制到(img);
完成=(cv::countNonZero(img)==0);
}而(!完成);
cv::imshow(“骨架”,skel);
简历:imwrite(“18s.png”,skel);
cv::waitKey(0);
返回0;
}
代码在这里
我看到了这样的画面:
但我想要这样的形象:
我能为此做些什么?有什么问题
对图4执行了这些步骤,结果很好与腐蚀操作相比,Open CV似乎没有收缩。至少我找不到。试试我的
尝试只使用“瘦”功能,而不是侵蚀您的图像。请发布骨骼化代码。目前你已经复制了两次膨胀代码,所以我们不会很快到达任何地方。你也可以在这里查看骨架代码:谢谢,实际上你的方法更好。我的新结果在这里,但图像对此问题有过多的建议