gpt4 book ai didi

c++ - 图像的边缘检测

转载 作者:行者123 更新时间:2023-11-30 04:40:22 30 4
gpt4 key购买 nike

我已经编写了一个代码来使用双阈值检测边缘,我在这里做的是如果较高阈值图像的像素值为 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));
}

}
}
}
}
}

最佳答案

这一行有点奇怪:

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

'edgelink' 是一个点 vector ,但 img_high(x, y) 大概会返回一个整数,因此您使用单个值而不是两个坐标来初始化 Point 类。以下内容:

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

...似乎更有意义。

关于c++ - 图像的边缘检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1484228/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com