vector<vector<double>> FindSkeletonEndpoint(Mat src)
{
vector<double> xp;
vector<double> yp;
vector<vector<double>> fxyp;
for (int i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
uchar gray = src.at<uchar>(i, j);
if (gray == 255)
{
yp.push_back(i);
xp.push_back(j);
}
}
}
vector<double> xyp1(2);
vector<double> xyp2(2);
int xIndex = 0;
int xMax = 0;
for (int i = 0; i < xp.size(); i++)
{
if (xMax < xp[i])
{
xMax = xp[i];
}
xIndex = i;
}
xyp1[0] = xp[xIndex];
xyp1[1] = yp[xIndex];
fxyp.push_back(xyp1);
while (true)
{
for (int i = 0; i < xp.size(); i++)
{
if (xMax < xp[i])
{
xMax = xp[i];
}
xIndex = i;
}
if (abs(xyp1[0] - xp[xIndex]) > 50)
{
xyp2[0] = xp[xIndex];
xyp2[1] = yp[xIndex];
fxyp.push_back(xyp2);
break;
}
auto itx = xp.begin() + xIndex;
xp.erase(itx);
auto ity = yp.begin() + xIndex;
yp.erase(ity);
}
return fxyp;
}
三个端点
去掉毛刺
Mat DeburringSkeleton(Mat src)
{
Mat marker = Mat::zeros(src.size(), src.type());
vector<vector<double>> xyEndPoint = FindSkeletonEndpoint(src);
vector<Point2i> endPoints;
for (int i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
uchar gray = src.at<uchar>(i, j);
if (gray == 255)
{
if ((src.at<uchar>(i - 1, j) + src.at<uchar>(i + 1, j)+ src.at<uchar>(i, j - 1)
+ src.at<uchar>(i, j + 1)+ src.at<uchar>(i - 1, j - 1)+ src.at<uchar>(i - 1, j + 1)
+ src.at<uchar>(i + 1, j - 1)+ src.at<uchar>(i + 1, j + 1)) ==255)
{
Point2i endPoint = { 0,0 };
Point2i fendPoint = { 0,0 };
Point2i sendPoint = { 0,0 };
if (j!=xyEndPoint[0][0] && j!=xyEndPoint[1][0])
{
fendPoint.x = xyEndPoint[0][1];
fendPoint.y = xyEndPoint[0][0];
endPoints.push_back(fendPoint);
sendPoint.x = xyEndPoint[1][1];
sendPoint.y = xyEndPoint[1][0];
endPoints.push_back(sendPoint);
endPoint.y = j;
endPoint.x = i;
endPoints.push_back(endPoint);
}
}
}
}
}
cout << endPoints << endl;
while(endPoints.size() != 2){
int j = endPoints[2].x;
int i = endPoints[2].y;
src.at<uchar>(j, i) = 0;
uchar region0 = src.at<uchar>(j - 1, i);
uchar region1 = src.at<uchar>(j + 1, i);
uchar region2 = src.at<uchar>(j, i - 1);
uchar region3 = src.at<uchar>(j, i + 1);
uchar region4 = src.at<uchar>(j - 1, i - 1);
uchar region5 = src.at<uchar>(j - 1, i + 1);
uchar region6 = src.at<uchar>(j + 1, i - 1);
uchar region7 = src.at<uchar>(j + 1, i + 1);
vector<int> regions;
regions.push_back((int)region0);
regions.push_back((int)region1);
regions.push_back((int)region2);
regions.push_back((int)region3);
regions.push_back((int)region4);
regions.push_back((int)region5);
regions.push_back((int)region6);
regions.push_back((int)region7);
vector<Point2i> ij;
Point2i reg0 = { j - 1,i };
Point2i reg1 = { j + 1, i };
Point2i reg2 = { j, i - 1 };
Point2i reg3 = { j, i + 1 };
Point2i reg4 = { j - 1, i - 1 };
Point2i reg5 = { j - 1, i + 1 };
Point2i reg6 = { j + 1, i - 1 };
Point2i reg7 = { j + 1, i + 1 };
ij.push_back(reg0);
ij.push_back(reg1);
ij.push_back(reg2);
ij.push_back(reg3);
ij.push_back(reg4);
ij.push_back(reg5);
ij.push_back(reg6);
ij.push_back(reg7);
vector<int> count;
for (int h = 0; h < regions.size(); h++)
{
if (regions[h] == 255)
{
count.push_back(h);
}
}
if (count.size() == 1)
{
endPoints.push_back(ij[count[0]]);
auto itx = endPoints.begin() + 2;
endPoints.erase(itx);
}
if (count.size() == 2)
{
auto itx = endPoints.begin() + 2;
endPoints.erase(itx);
break;
}
}
src.copyTo(marker);
return marker;
}
搞定