之前图像处理遇到一个问题,就是因为客户不能用到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);
希望可以给大家带来参考!