基于matlab的梯形畸变校正

本文解决的是切向畸变的问题,使用霍夫变换对梯形畸变矫正效果不佳。梯形畸变的校正流程:直方图均衡-->垂直边缘检测--->开操作--->radon变换求极值--->求检测直线--->取点--->校正.

clc ;%清屏
clear all ;%清内存

%读取原图像
img=imread('test_image.png') ;

%转化为灰度图像
img_gray=rgb2gray(img) ;
figure(1) ;
imshow(img_gray) ;
title('Gray Image') ;

%直方图均衡
img_histeq=histeq(img_gray) ;
figure(2) ;
imshow(img_histeq,[]) ;
title('Histgram Equalization Image') ;
%sobel边缘检测
%  img_sobel=edge(img_histeq,'sobel') ;
img_sobel=sobel(img_histeq) ;
figure(3) ;
imshow(img_sobel,[]) ;
title('Sobel Edge Detection ') ;
kernel=[1;1;1;1;1;1;1;1] ;
img_erode=imerode(img_sobel,kernel) ;
img_dilate=imdilate(img_erode,kernel) ;
figure(4)
imshow(img_dilate) ;
title('Dilate Image') ;
%radon检测直线
theta = 0:179;
[R,xp] = radon(img_dilate,theta);
figure(5) ;
imagesc(theta, xp, R); colormap(hot);
xlabel('/theta (degrees)'); ylabel('x/prime');
title('R_{/theta} (x/prime)');
colorbar

%计算直线 注意radon变换的圆心在图像的中心
gray_max1=max(max(R(:,1:90))) ;
gray_max2=max(max(R(:,90:180))) ;
[len1,theta1]=find(R==gray_max1) ;
[len2,theta2]=find(R==gray_max2) ;
theta1=theta1+90-1 ;
theta2=theta2-90-1 ;
len1=len1-length(R)/2 ;
len2=len2-length(R)/2;
%斜率
k1=-cot(theta1*pi/180) ;%注意前面要带负号,因为y朝下
k2=-cot(theta2*pi/180) ;

%求原点到直线的垂足的坐标
[m,n]=size(img_dilate) ;
x1=n/2+len1*sin(theta1*pi/180);
y1=m/2-len1*cos(theta1*pi/180);
x2=n/2-len2*sin(theta2*pi/180);
y2=m/2-len2*cos(theta2*pi/180);

%在图像中画线,标出检测出来的直线,直线方程为x-x0=k(y-y0) ;
y1_1=0 ;
x1_1=k1*(y1_1-y1)+x1 ;
y1_2=m ;
x1_2=k1*(y1_2-y1)+x1 ;

y2_1=0 ;
x2_1=k2*(y2_1-y2)+x2 ;
y2_2=m ;
x2_2=k2*(y2_2-y2)+x2 ;
figure(4) ;
hold on ;
% line('xdata', [left right], 'ydata', [top bottom])
%标注垂足
markpoint(x2,y2,'g') ;
markpoint(x1,y1,'g') ;
%将检测出来的直线画出来
line([x1_1,x1_2],[y1_1,y1_2]) ;
line([x2_1,x2_2],[y2_1,y2_2]) ;


%寻找四个连接点
y11=m*3/4 ;
x11=k1*(y11-y1)+x1 ;
y111=m/4 ;
x111=x11 ;
x11_1=k1*(y111-y1)+x1 ;
y21=y11 ;
x21=k2*(y21-y2)+x2 ;
y211=y111 ;
x211=x21 ;
x21_1=k2*(y211-y2)+x2 ;

markpoint(x11,y11,'g') ;
markpoint(x111,y111,'g') ;
markpoint(x11_1,y111,'r') ;
markpoint(x21,y21,'g') ;
markpoint(x211,y211,'g') ;
markpoint(x21_1,y211,'r') ;
%校正
basepoints=[x11 y11;x21 y21;x111,y111;x211,y211] ;
inputpoints=[x11 y11;x21 y21;x11_1,y111;x21_1,y211] ;
cpt=cp2tform(inputpoints,basepoints,'projective') ;
figure(6) ;
img_correction=imtransform(img,cpt) ;
imshow(img_correction);
title('Distortion Correction Image') ;

 

%标点函数

function markpoint(x,y,color)
line([x-5,x+5],[y,y],'Color',color) ;
line([x,x],[y-5,y+5],'Color',color) ;
end
%垂直边缘检测函数,不是sobel边缘检测

function img_sobel=sobel(img_test)
[m,n]=size(img_test) ;
img_sobel=zeros(m,n) ;
alpha=2 ;
for i=2:m-1
    for j=2:n-1
        temp=uint16(abs(int16(img_test(i-1,j-1))+alpha*int16(img_test(i,j-1))+int16(img_test(i+1,j-1))-int16(img_test(i-1,j+1))-alpha*int16(img_test(i,j+1))-int16(img_test(i+1,j+1)))) ;
        if(temp>125)
            temp=255 ;
        else
            temp=0 ;
        end
        img_sobel(i,j)=uint8(temp) ;
    end
end
return ;
end

 

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 梯形畸变图片矫正是一种常见的图像处理技术,用于纠正由于使用广角镜头或摄像机放置角度不当等原因造成的图像失真问题。MATLAB是一种强大的科学计算和图像处理软件,可以用来进行梯形畸变图片矫正。 MATLAB提供了一些图像处理工具箱和函数,可以很方便地实现梯形畸变图片矫正。具体的步骤如下: 1. 读取图像:使用imread函数将待矫正的图片读取到MATLAB中。 2. 提取关键点:根据梯形畸变的程度,选取图片中的关键点。一般来说,需要选择图片中的四个角点。 3. 计算矫正矩阵:使用imrect函数选择图片中的四个角点,然后使用fitgeotrans函数计算出矫正矩阵。矫正矩阵可以将原始图像的坐标转化为矫正后图像的坐标。 4. 应用矫正矩阵:使用imwarp函数和所得到的矫正矩阵,对原始图像进行矫正。 5. 显示和保存矫正后的图像:使用imshow函数显示矫正后的图像,并使用imwrite函数将其保存到磁盘上。 通过以上步骤,我们可以使用MATLAB梯形畸变图片进行矫正。然而,这只是一种简单的方法,对于复杂的畸变问题,可能需要更高级的算法和技术来进行矫正。 ### 回答2: 梯形畸变是指图片中的直线(如建筑物、道路)由于相机拍摄角度的不同而呈现出倾斜、变形的现象。为了纠正这种畸变,可以使用Matlab进行梯形畸变图片矫正。 在Matlab中,首先需要获取图片中的梯形形状。可以使用角点检测算法(如Harris角点检测)来找到图片中的四个角点。角点通常位于梯形的四个边角处。 接下来,使用透视变换(perspective transformation)来矫正图片中的梯形畸变。透视变换是一种将一个平面上的点映射到另一个平面上的点的变换。通过将四个角点映射到一个规则的矩形上,可以实现梯形畸变的矫正。 在Matlab中,可以使用imwarp函数来进行透视变换。该函数需要指定源图像、目标图像以及源图像的四个角点和目标图像的四个对应点。通过将源图像映射到目标图像,就可以实现梯形畸变的矫正。 最后,可以使用imshow函数来显示矫正后的图片,以便进行比较和评估。如果需要保存矫正后的图片,可以使用imwrite函数将其保存为其他格式(如JPEG或PNG)。 综上所述,使用Matlab进行梯形畸变图片矫正的过程包括获取角点、进行透视变换和显示/保存矫正后的图片。通过这些步骤,可以有效地纠正梯形畸变,使直线在图片中呈现出垂直或水平的状态。 ### 回答3: Matlab梯形畸变图片校正是一种图像处理技术,可以用来矫正因相机角度或透视变换引起的图像梯形畸变问题。 首先,我们需要确定输入图像中的四个角点。使用Matlab的图像处理工具箱中的函数,例如`corner`或`imfindcircles`,可以检测出这些角点。这些角点可以是物体边界的四个顶点,或者可以预先标记在图像上的人工选择的点。 接下来,我们需要计算原始图像中的四个角点与矩形边界的映射关系。我们可以使用`imcrop`函数来选择原始图像中的感兴趣区域,然后利用`cp2tform`函数来计算矩形边界和原始图像角点之间的关系。 然后,我们可以利用计算得到的映射关系对整个图像进行矫正。使用`imtransform`函数可以对原始图像进行重新映射操作,以消除梯形畸变。这个函数需要使用前面计算得到的映射关系作为输入参数。 最后,我们可以通过将校正后的图像与原始图像进行对比,或者使用`imshow`函数来显示校正后的图像,以确保校正效果达到了预期。 总之,Matlab梯形畸变图片矫正是一种有效的图像处理技术,可以帮助我们消除因相机角度或透视变换引起的图像梯形畸变问题。通过确定角点、计算映射关系和进行图像重映射,我们可以得到校正后的图像,使之更符合我们的期望。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值