http://www.moon4chen.com/

Hough变换实现图像纠偏-从matlab到c++实现

之前图像处理遇到一个问题,就是因为客户不能用到matlab库,所以需要在c/c++中实现。

先来看看matlab中的代码:

 

 

I1=imread('0130924171417906.jpg');%读入待处理的彩色图
% I=1/3*I1(:,:,1)+1/3*I1(:,:,2)+1/3*I1(:,:,3);%将原始图像转化为灰度图像
I = rgb2gray(I1);%转换成灰度图 
[x,y]=size(I)
BW=edge(I,'sobel',0.18);    %运用Sobel算子进行边缘检测,你的是Canny算子

rho_max=floor(sqrt(x^2+y^2))+1;   %由原图数组坐标算出ρ最大值,并取整数部分加1,此值作为ρ,θ坐标系ρ最大值



accarray=zeros(rho_max,180);    %定义ρ,θ坐标系的数组,初值为0,θ的最大值,180度

Theta=[0:pi/180:pi];     %定义θ数组,确定θ取值范围

for n=1:x
   for m=1:y
      if BW(n,m)==1
         for k=1:180
            rho=(m*cos(Theta(k)))+(n*sin(Theta(k))); %将θ值代入hough变换方程,求ρ值
            rho_int=round(rho/2+rho_max/2); %将ρ值与ρ最大值的和的一半作为ρ的坐标值(数组坐标),这样做是为了防止ρ值出现负数
            %在ρθ坐标(数组)中标识点,即计数累加
            accarray(rho_int,k)=accarray(rho_int,k)+1;
         end
      end
   end
end
//

/*********************************/
R=max(accarray);

a=find(R==max(R))-1    %找到使数组accarray取得最大值的角度

转化为c/c++中实现如下:

//hough变换
    int x = bmp.bih.biWidth;
    int y = bmp.bih.biHeight;
    double rho;
    int rho_int;
    int rho_max = 0;
    rho_max =(int)floor(sqrt(x * x + y * y + 0.0))+1;    //由原图数组坐标算出ρ最大值,并取整数部分加1,此值作为ρ,θ坐标系ρ最大值
    int *c = new int[rho_max * (180 + 1)];
    int (*accarray)[180 + 1] = (int(*)[180 + 1])c;  
    for (i = 0; i < rho_max; i++)  
        for (j = 0; j <= 180; j++)  
            accarray[i][j] = 0;  

    //定义θ数组,确定θ取值范围
    /**
    *    x=[0:0.5:360] :x是一个从0到360以0.5为间距的向量 (数组)乘以pi除以180 搜索,    
    */
    // Theta=[0:pi/180:pi];

    double Theta[181]; //算出0~180度的弧度值
    //Theta=(double *)malloc(sizeof(double *)*(180 + 1)); // 定义θ数组,确定θ取值范围
    for (int i = 0;i <= 180;i++) {
        Theta[i] = (i / 360.0) * 2 * PI;
    }
    //
    for (int n = 0;n < x;n++) {
        for (int m = 0;m < y;m++) {
            if (g[m * (bih.biWidth+nAdjust24) + n] == 255) { //边缘的条件
                for (int k = 0;k <= 180;k++){
                    //printf("%d",k);
                    rho=(n*cos(Theta[k]))+(m*sin(Theta[k]));//将θ值代入hough变换方程,求ρ值
                    //printf("ρ:%d\n",rho);
                    //将ρ值与ρ最大值的和的一半作为ρ的坐标值(数组坐标),这样做是为了防止ρ值出现负数
                    int temp = rho/2+rho_max/2;
                    //在ρθ坐标(数组)中标识点,即计数累加
                    accarray[temp][k]++;
                    //printf("%d",accarray[temp][k]);
                }
            }
        }
    }

    int *R;//找出每个角度对应的最大值
    R=(int *)malloc(sizeof(int *)* (180 + 1));
    for (int k = 0;k <= 180;k++) {
        R[k] = 0;
    }
    for (int k = 0;k <= 180;k++) {
        int tempMax = 0;
        for (int i = 0;i < rho_max;i++){
            if (accarray[i][k] > tempMax) {
                tempMax = accarray[i][k];
                R[k] = accarray[i][k];
            }
        }
        //printf("%d-角度:%d\n",R[k],k);
    }

    int max_angle = 1;
    int max_value = R[1];
    for (int k = 1;k <= 180;k++) {
        if (R[k] > max_value) {
            max_value = R[k];
            max_angle = k;
        }
    }
    int b_w = bih.biWidth;
    int b_h = bih.biHeight;
    //max_angle-=1;
    //pData24 = imRotate(bmp,-7);
    //max_angle = 104;
    //printf("最大直线所在角度:%d\n",max_angle);


希望可以给大家带来参考!

 

 

posted @ 2014-04-10 23:22  谌皓徽  阅读(867)  评论(0编辑  收藏  举报