I=imread('附件B.PNG'); f=rgb2gray(I);%灰度化 BW=edge(f,'canny'); %edge:以灰度图像为输入,'canny'为边缘检测算子 % 输出BW为二值图像,边缘处为白(255)其余部分为黑(0) [row,col]=size(BW); rhomax=round((row*row+col*col)^0.5);%计算对角线距离 A=zeros(2*rhomax,180); %这里,实际上rho的取值范围为[-rhomax,rhomax], %但是为了后面进行数量统计,转变为[1,2rhomax] for m=1:row for n=1:col if BW(m,n)~=0 %判断为边缘 for theta=1:180 r=theta/180*pi; %角度转换 rho=round(m*cos(r)+n*sin(r)); %Hough变换 rho=rho+rhomax+1; %坐标平移 %这里的理解,首先matlab中数组是从1开始计数,所以+1; %数组坐标不能<0,所以 +rhomax A(rho,theta)=A(rho,theta)+1; %数量统计 end end end end [rho,theta]=find(A>250); %超过250个点视为共线,rho列号,theta行号,这个值可以自己设置,为了只检测到一条直线就设高了,不同图可以设置不同值 nma=length(rho) figure for i=1:nma hold on m=1:row; r=theta(i)/180*pi; n=(rho(i)-rhomax-m*cos(r))/(0.0001+sin(r)); plot(n,m,'w-','LineWidth',6); end title('hough线检测'); if theta>90 qingxeijiao=180-theta; else qingxeijiao=-theta end I2 = imrotate(I,qingxeijiao,'bilinear','crop'); subplot(1,3,1);imshow(I);title('原始图像') subplot(1,3,2);imshow(f);title('二值化图像') subplot(1,3,3), imshow(I2); title('倾斜校正');
结果显示:
标签:矫正,180,BW,matlab,rho,图像,theta,rhomax,row From: https://www.cnblogs.com/kuangxinru/p/16604332.html