惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
S
SegmentFault 最新的问题
WordPress大学
WordPress大学
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
小众软件
小众软件
博客园 - 聂微东
阮一峰的网络日志
阮一峰的网络日志
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
The Cloudflare Blog
T
Tailwind CSS Blog
博客园 - 【当耐特】
Jina AI
Jina AI
量子位
有赞技术团队
有赞技术团队
博客园 - Franky
V
Visual Studio Blog
V
V2EX

博客园 - flyluo

利用sqlmap进行POST注入 [转]C#创建文件的实战应用示例解析 VC下的scoket编程 [转]RGB转换为灰度图的vc代码 ASP.NET 2.0,C#----利用GridView控件导出其他文件(导出Excel,导出Word文件) gridview添加,删除,编辑DropDownList 根据值对应相应的选择项 - flyluo - 博客园 如何避免安装SQL2005的COM+错误 实现多语言网站(Asp.Net 2.0) 印度的九九乘法--超强 net客户段验证 net客户段验证 为GridView删除添加提示 再次装反IIS和.NET FRAMWORK2.0的顺序 一个简单的发布工具 汉字转拼音 c#加密解密 金额小写转大写 【转贴】C#中有关string和byte[]转换的问题 .NET开发人员十大必备下载工具
【转】利用Hough变换实现直线检测的代码
flyluo · 2010-08-02 · via 博客园 - flyluo

vc图像处理程序中经常要用到直线检测,常用的直线检测方法是Hough变换。

    Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。

    简而言之,Hough变换思想为:在原始图像坐标系下的一个点对应了参数坐标系中的一条直线,同样参数坐标系的一条直线对应了原始坐标系下的一个点,然后,原始坐标系下呈现直线的所有点,它们的斜率和截距是相同的,所以它们在参数坐标系下对应于同一个点。这样在将原始坐标系下的各个点投影到参数坐标系下之后,看参数坐标系下有没有聚集点,这样的聚集点就对应了原始坐标系下的直线。

    以下代码实现了最简单的Hough变换直线检测,输入为width*height的二值图(背景为0,前景为255),存放在矩阵src中,iThreshold为判断为直线的域值。输出pR为原点到直线的距离,pTh为直线的角度。

程序代码

void Hough(BYTE *src,int width,int height, int *pR, int *pTh, int iThreshold)
{
    int *pArray;
    int iRMax = (int)sqrt(width * width + height * height) + 1;
    int iThMax = 361;
    int iTh = 0;
    int iR;
    int iMax = -1;
    int iThMaxIndex = -1;
    int iRMaxIndex = -1;

    pArray = new int[iRMax * iThMax];
    memset(pArray, 0, sizeof(int) * iRMax * iThMax);

    float fRate = (float)(PI/180);

    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            if(*src == 255)
            {
                for(iTh = 0; iTh < iThMax; iTh += 1)
                {
                    iR = (int)(x * cos(iTh * fRate) + y * sin(iTh * fRate));

                    if(iR > 0)
                    {
                        pArray[iR/1 * iThMax + iTh]++;
                    }
                }
            }

            src++;
        } // x
    } // y

    for(iR = 0; iR < iRMax; iR++)
    {
        for(iTh = 0; iTh < iThMax; iTh++)
        {
            int iCount = pArray[iR * iThMax + iTh];
            if(iCount > iMax)
            {
                iMax = iCount;
                iRMaxIndex = iR;
                iThMaxIndex = iTh;
            }
        }
    }

    if(iMax >= iThreshold)
    {
        *pR = iRMaxIndex;
        *pTh = iThMaxIndex;
    }

    delete []pArray;

    return;
} // end of Hough