C语言中的霍夫变换有问题

Posted

技术标签:

【中文标题】C语言中的霍夫变换有问题【英文标题】:Having trouble with Hough Transform in C 【发布时间】:2021-12-09 09:36:12 【问题描述】:

我正在尝试制作一个检测数独网格的代码。这意味着我必须在图像上应用大量滤镜,然后在 Sobel 算法的输出之后对其应用霍夫变换算法(这使得边缘在黑色图像上显示为白色像素)。

我有点理解它的概念以及为什么使用Rho = x*cos(Theta) + y*sin(Theta) 来获取参数空间中的边坐标很重要。

但是,我遇到了 Rho 和我的累加器阵列的问题。 到目前为止,这是我的代码:

void hough(SDL_Surface* image_surface)


    unsigned int width = image_surface->w;
    unsigned int height = image_surface->h;
    
    unsigned int Rhos, Thetas;
    Rhos = sqrt(width * width + height * height);
    Thetas = 180;

    //initialise accumulator array
    unsigned int acc_array[Rhos][Thetas];
    
    for (size_t i = 0; i < Rhos; i++)
    
        for (size_t j = 0; j < Thetas; j++)
            acc_array[i][j] = 0;
    
    Uint32 pixel;
    Uint8 r, g, b;

    //go through each pixels
    for (size_t x = 0; x < width; x++)
    
        for (size_t y = 0; y < height; y++)
        
            pixel = get_pixel(image_surface, x, y);
            SDL_GetRGB(pixel, image_surface->format, &r, &g, &b);
                  
            //if white
            if (r+g+b == 765)
            
                //p = x*cos(t) + y*sin(t)
                //check for every t
                for (int t = 0; t < 180;t++)
                
                    unsigned int p = x*cos(t) + y*sin(t);
                    acc_array[p][t]++;
                
            
        
    

//rest of the code below...

我的问题是,例如,当我在图像的像素 (20, 1882) 上并且我的 theta(或 t)= 4 时,p(或 Rho)变为 -1437。 如果 Rho 是负数,那么我不能增加它在累加器数组中的位置,因为索引不能是负数。

谁能帮我解决这个问题?

【问题讨论】:

您的示例代码中有不包含定义的组件,即结构参数SDL_Surface、输入值、预期输出等。请编辑以包含可编译的缩小使用示例,这也会导致问题发生。 (minimal reproducible example) 为什么p 需要成为索引?为什么不能将其线性转化为索引? 我不确定我是否理解。我在网上看到的霍夫变换算法都有一个带有 p 和 theta 的累加器数组。抱歉,我对 C 代码有点陌生。 【参考方案1】:

您不需要经过 180 度,只需 90 度。负值来自 thetas > 90。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

cos() 和 sin() 函数期望角度以弧度为单位。根据您的 for 循环范围,它看起来 t 是以度为单位的值。

【讨论】:

感谢您的回复。但是,您建议我如何处理累加器数组中的 t ?它目前有 [p][t]。 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于C语言中的霍夫变换有问题的主要内容,如果未能解决你的问题,请参考以下文章

霍夫变换霍夫线性变换

霍夫变换和openCV

OpenCV中的霍夫线变换和霍夫圆变换

应用霍夫变换方法,用matlab语言编写相应的程序

20opencv入门霍夫变换:霍夫线变换,霍夫圆变换合辑

霍夫线变换,霍夫圆变换