我编写了一个使用双阈值检测边缘的代码,我在这里做的是 如果较高阈值图像具有255的像素值,那么它是有效的,并且如果较低的保护图像具有与该像素连接的白色像素,则它是有效边缘。 但在我的程序中只有高阈值图像被复制。低阈值有效像素没有被绘制。而且这个代码适用于较大的图像而不是较小的图像我真的不能理解,因为我没有硬编码宽度的值和高度。
这是我的代码
void edge_linking(ImgGray img_low,ImgGray img_high,ImgGray *img_edge_link,int mu)
{
int x,y;
CPoint p;
vector<Point>edgelink;
for(y=mu;y<=(*img_edge_link).Height()-mu;y++)
{
for(x=mu;x<=(*img_edge_link).Width()-mu;x++)
{
//if(x>0 && y>0 && x< (*img_edge_link).Width()-1 &&(*img_edge_link).Height()-1)
//{
if(img_high(x,y)==255)
{
(*img_edge_link)(x,y)=255;
edgelink.push_back(Point(img_high(x,y)));
while(!edgelink.empty())
{
p=edgelink.back();
edgelink.pop_back();
if (p.x >0 && img_low(p.x-1,p.y)==255 && (*img_edge_link)(p.x-1,p.y)!=255 )
{
(*img_edge_link)(p.x-1,p.y)=255;
edgelink.push_back(Point(p.x-1,p.y));
}
if (p.y>0 && img_low(p.x,p.y-1)==255 && (*img_edge_link)(p.x,p.y-1)!=255)
{
(*img_edge_link)(p.x,p.y-1)=255;
edgelink.push_back(Point(p.x,p.y-1));
}
if (p.x<(*img_edge_link).Width()-1 && img_low(p.x+1,p.y)==255 && (*img_edge_link)(p.x+1,p.y)!=255)
{
(*img_edge_link)(p.x+1,p.y)=255;
edgelink.push_back(Point(p.x+1,p.y));
}
if (p.y <(*img_edge_link).Height()-1 && img_low(p.x,p.y+1)==255 && (*img_edge_link)(p.x,p.y+1)!=255 )
{
(*img_edge_link)(p.x,p.y+1)=255;
edgelink.push_back(Point(p.x,p.y+1));
}
if (p.x>0 && p.y<(*img_edge_link).Height()-1 && img_low(p.x-1,p.y+1)==255 && (*img_edge_link)(p.x-1,p.y+1)!=255)
{
(*img_edge_link)(p.x-1,p.y+1)=255;
edgelink.push_back(Point(p.x-1,p.y+1));
}
if(p.x>0 && p.y>0 && img_low(p.x-1,p.y-1)==255 && (*img_edge_link)(p.x-1,p.y-1)!=255)
{
(*img_edge_link)(p.x-1,p.y-1)=255;
edgelink.push_back(Point(p.x-1,p.y-1));
}
if(p.y<(*img_edge_link).Height()-1 && p.x<(*img_edge_link).Width()-1 && img_low(p.x+1,p.y+1)==255 && (*img_edge_link)(p.x+1,p.y+1)!=255)
{
(*img_edge_link)(p.x+1,p.y+1)=255;
edgelink.push_back(Point(p.x+1,p.y+1));
}
if(p.y>0 && p.x<(*img_edge_link).Width()-1 && img_low(p.x+1,p.y-1)==255 && (*img_edge_link)(p.x+1,p.y-1)!=255)
{
(*img_edge_link)(p.x+1,p.y-1)=255;
edgelink.push_back(Point(p.x+1,p.y-1));
}
}
}
}
}
}
答案 0 :(得分:1)
这条线有点奇怪:
edgelink.push_back(Point(img_high(x,y)));
'edgelink'是点的向量,但img_high(x,y)可能会返回一个整数,因此您使用单个值初始化Point类,而不是两个坐标。以下内容:
edgelink.push_back(Point(x,y));
......似乎更有意义。
答案 1 :(得分:1)
几点:
首先,你说它不能用于小图像,可能是因为 mu 参数(我假设它有某种边界?)。输出图像也初始化为零?
其次,我认为你可以通过避免一些不必要的检查来改善你的代码 首先计算低阈值图像和高图像之间的差异(低=低 - 高:低的像素,不是高)。这将为您提供存储在低位的弱边,以及存储在高位的强边。 接下来,在像素值为255的高图像上循环,并将其邻域标记为低,其值等于255,即128 最后,只需将像素设置为高至255,其中低位的相应像素为128(弱边缘附近的弱边缘)。
除了其他人提到的错误外,我没有看到更多问题...