【问题标题】:edge detection of an image图像边缘检测
【发布时间】: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


【解决方案1】:

几点:

首先,您说它不适用于小图像,可能是因为 mu 参数(我假设它有某种边框?)。输出图像是否也初始化为零?

其次,我认为您可以通过避免一些不必要的检查来改进您的代码。
首先计算低阈值图像和高图像之间的差异(低=低-高:低像素不高)。这将为您提供存储在低位的弱边缘,以及存储在高位的强边缘
接下来,您循环使用像素值为 255 的高图像,并将它们的邻域标记为低,其值等于 255 到 128。
最后简单地将高像素设置为 255,其中低像素对应的像素为 128(弱边缘与强边缘相邻)。

除了其他人提到的错误,我没有看到进一步的问题......

【讨论】:

    【解决方案2】:

    这行有点奇怪:

    edgelink.push_back(Point(img_high(x,y)));
    

    'edgelink' 是一个点向量,但 img_high(x, y) 可能返回一个整数,因此您使用单个值而不是两个坐标初始化 Point 类。以下:

    edgelink.push_back(Point(x,y));
    

    ...似乎更有意义。

    【讨论】:

    • PointCPoint 上也有一些错字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2013-08-28
    • 2020-04-06
    • 2012-06-25
    相关资源
    最近更新 更多