【发布时间】:2010-12-01 20:06:11
【问题描述】:
我已经编写了一个代码来使用双阈值检测边缘,我在这里做的是 如果较高阈值图像的像素值为 255,则它是有效的,如果较低阈值图像具有与该像素相连的白色像素,则它是有效边缘。 但在我的程序中,只有高阈值图像被复制。低阈值有效像素没有被绘制。此外,此代码适用于较大的图像而不是较小的图像,我真的无法理解 y,因为我没有对宽度的值进行硬编码和高度。
这是我的代码
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));
}
}
}
}
}
}
【问题讨论】:
-
我不完全了解您想要实现的目标。但是为什么不使用像精明边缘检测器en.wikipedia.org/wiki/Canny_edge_detection 这样的边缘检测算法呢?
-
我在您的“问题”中看不到实际问题。
-
@nuriaion:看起来这是滞后阈值步骤,它是精明边缘检测器的一部分
标签: c++ image-processing