您的位置:首页 > 编程语言 > MATLAB

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

2014-04-10 23:22 381 查看
之前图像处理遇到一个问题,就是因为客户不能用到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);


希望可以给大家带来参考!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: