【问题标题】:Adjusting the threshold in Canny edge algorithm调整 Canny 边缘算法中的阈值
【发布时间】:2012-07-07 19:32:10
【问题描述】:

我想尝试一下文本识别,所以我使用 opencv 来追踪边缘,使用 c++ 来查找斜率、曲线等,边缘算法在大而整洁的字符集上效果很好,但是当它遇到小的印刷文本或带有大量背景噪音的文本,例如嵌入在验证码中,它很难并且看起来不完整,我的猜测是我没有正确设置阈值并尝试了不同的值但没有成功。

这是我的代码:

#include "cv.h"
#include "highgui.h"
using namespace cv;
const int low_threshold  = 50;
const int high_threshold = 150;


int main()
{

    IplImage* newImg; 
    IplImage* grayImg; 
    IplImage* cannyImg; 

    newImg = cvLoadImage("ocv.bmp",1);

    grayImg = cvCreateImage( cvSize(newImg->width, newImg->height), IPL_DEPTH_8U, 1 );

    cvCvtColor( newImg, grayImg, CV_BGR2GRAY );
    cannyImg = cvCreateImage(cvGetSize(newImg), IPL_DEPTH_8U, 1);

    cvCanny(grayImg, cannyImg, low_threshold, high_threshold, 3);
    cvNamedWindow   ("Source", 1);
    cvNamedWindow   ("Destination",1);
    cvShowImage     ("Source", newImg );
    cvShowImage     ("Destination", cannyImg );
    cvWaitKey(0);
    cvDestroyWindow ("Source" );
    cvDestroyWindow ("Destination" );
    cvReleaseImage  (&newImg );
    cvReleaseImage  (&grayImg );
    cvReleaseImage  (&cannyImg );

return 0;

}

我浏览了整个网络,并看到了一些复杂的阈值条件,例如此站点的此代码:

% Set direction to either 0, 45, -45 or 90 depending on angle.
[x,y]=size(f1);
for i=1:x-1,
    for j=1:y-1,
        if ((gradAngle(i,j)>67.5 && gradAngle(i,j)<=90) || (gradAngle(i,j)>=-90 && gradAngle(i,j)<=-67.5)) 
            gradDirection(i,j)=0;
        elseif ((gradAngle(i,j)>22.5 && gradAngle(i,j)<=67.5))
            gradDirection(i,j)=45;
        elseif ((gradAngle(i,j)>-22.5 && gradAngle(i,j)<=22.5))
            gradDirection(i,j)=90;
        elseif ((gradAngle(i,j)>-67.5 && gradAngle(i,j)<=-22.5))
            gradDirection(i,j)=-45;
        end
    end
end

如果这是解决方案,有人可以为我提供该算法的 c++ 等效项,如果不是,我还能做什么?

【问题讨论】:

    标签: c++ algorithm image-processing opencv edge-detection


    【解决方案1】:

    Canny 边缘检测器是一个多步检测器,它使用滞后阈值(它使用两个阈值而不是一个阈值)和边缘跟踪(您的最后一个 sn-p 是此步骤的一部分)。我建议先阅读wikipedia 条目。一种可能的解决方案是选择高阈值,例如70% 的图像像素将被分类为边缘(最初 - 您可以使用直方图快速做到这一点),而不是选择低阈值,例如40%的高门槛。尝试对图像块而不是整个图像执行边缘检测可能是个好主意,因此您的算法可以为不同区域计算不同的阈值。

    请注意,CAPTCHA-s 设计为难以分割,添加破坏边缘检测的噪声是实现此目的的一种技术(您可能需要先平滑图像)。

    【讨论】:

    • 我没用过openCV,不过你也可以先玩一下canny边缘检测器的sigma参数。
    • 您必须从梯度幅度图像的直方图中计算这些值,对吧?
    猜你喜欢
    • 2012-12-31
    • 2012-07-14
    • 1970-01-01
    • 2012-09-22
    • 2018-06-29
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    相关资源
    最近更新 更多