Canny边缘算法中阈值的调整 我想尝试文字识别,所以我用OpenCV来跟踪边缘和C++来寻找斜率、曲线等,边缘算法在大而整洁的字符集上很好,但是当它针对小的打印文本或文本时,嵌入了CAPTCHA中的许多背景噪声,它就挣扎着,看起来不完整。我的猜测是,我没有正确设置阈值,尝试了不同的值,但没有成功

Canny边缘算法中阈值的调整 我想尝试文字识别,所以我用OpenCV来跟踪边缘和C++来寻找斜率、曲线等,边缘算法在大而整洁的字符集上很好,但是当它针对小的打印文本或文本时,嵌入了CAPTCHA中的许多背景噪声,它就挣扎着,看起来不完整。我的猜测是,我没有正确设置阈值,尝试了不同的值,但没有成功,c++,algorithm,image-processing,opencv,edge-detection,C++,Algorithm,Image Processing,Opencv,Edge Detection,这是我的密码: #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

这是我的密码:

#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
%根据角度将方向设置为0、45、-45或90。
[x,y]=尺寸(f1);
对于i=1:x-1,
对于j=1:y-1,

如果((gradAngle(i,j)>67.5&&gradAngle(i,j)=-90&&gradAngle(i,j)22.5&&gradAngle(i,j)-22.5&&gradAngle(i,j)-67.5&&gradAngle(i,j)Canny边缘检测器是一种使用滞后阈值(它使用两个阈值而不是一个)和边缘跟踪(您的最后一个片段是此步骤的一部分)的多步检测器。我建议先阅读条目。一个可能的解决方案是选择高阈值,例如,70%的图像像素将被分类为边缘(最初-您可以使用直方图快速完成此操作),而不是选择低阈值,例如高阈值的40%。尝试对图像块而不是整个图像执行边缘检测可能是一个好主意,因此您的算法可以为不同区域计算不同的阈值


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

我没有使用openCV,但您也可以先使用canny边缘检测器的sigma参数。您必须从梯度幅值图像的直方图计算这些值,对吗?