Radon变换实现对图像倾斜校正
参考博客
https://blog.csdn.net/akzc42847/article/details/102357885
建议先看上面链接参考博客。
radon原理
radon变换是一种倾斜坐标轴,计算不同角度的坐标轴下的线积分,当线积分有突变时,则认为存在直线。
如下图,是灰底画面中有一条黑色线段。
1.在红色坐标系中,沿x1轴方向进行积分,红色粗线是积分结果,可以看出,在x轴上某一点存在积分值激增。
2.在蓝色坐标系中,沿着x2轴方向进行积分,蓝色粗线是积分结果,可以看出,x轴上的积分结果相对平缓。
通过这样不断旋转坐标轴,可以确定黑线的倾斜角度。
计算步骤
- 读取图片
- 将彩色图像转换为灰度图像
- 对图像进行边缘检测(sobel、canny、laplace算子等)
- radon变换,角度检测
- 确定直线角度,并对原图进行旋转
结果展示
clc;close all;
fileName='D:\LCD_Data\7_left.bmp';
srcImage=imread(fileName);
grayImage=rgb2gray(srcImage);
cannyImage=edge(grayImage,'canny');
figure(1);
subplot(121);imshow(srcImage);title('Orignal img');
% figure();;imshow(cannyImage);title('canny算子求边缘');
theta=0:180;
[R,x]=radon(cannyImage,theta);
figure;
imagesc(theta,x,R); %将矩阵值展示成图。imagesc(x,y,C) 指定图像位置。使用 x 和 y 可指定与 C(1,1) 和 C(m,n) 对应的边角的位置。要同时指定两个边角,请将 x 和 y 设置为二元素向量。要指定第一个边角并让 imagesc 确定另一个,请将 x 和 y 设为标量值。图像将根据需要进行拉伸和定向。
title('热力图 theta-X');
xlabel('theta(degree)');
ylabel('X\prime');
colormap(hot); %以热力图方式展示
colorbar;%图例
[x,y]=find(R==max(max(R)))%x:截距 y:坐标轴与水平方向的夹角
rot_I=imrotate(srcImage,180-y,'loose'); %旋转图像
figure(1);subplot(122);imshow(rot_I);title('Radon变换');