matlab 实现图像扭曲校正

扭曲校正

在图像获取的过程中由于扫描仪或相机透镜存在的原因、纸质文档纸面卷曲的原因,会产生某种程度的图像扭曲畸变,针对扭曲畸变问题,本文采用了高次函数进行拟合校正的方法。具体的校正过程如图所示

                                                    

其中拟合函数:

                                                             

其中k1,k2分别是控制水平方向、竖直方向上的扭曲矫正的参数。

本文中预设k1= -0.00000024,k2=0.在程序运行过程中可以根据具体图像的扭曲程度调节参数值。

function niuqujiaozheng_Callback(hObject, eventdata, handles)%扭曲校正
handles.graydpromp=handles.grayd;
axes(handles.axes1);
 set(handles.axes1,'HandleVisibility','ON');
axes(handles.axes1);
 imshow(uint8(handles.grayd));title('有扭曲畸变的文字图');
 guidata(hObject,handles);
 
 prompt={'控制Y轴的参数:K1'};
 defans={'-0.00000024'};
 p=inputdlg(prompt,'input',1,defans);
 p1=str2num(p{1});
 k1 =p1;  
 
 axes(handles.axes1);
 prompt={'控制X轴的参数:K2'};
 defans={'0'};
 p=inputdlg(prompt,'input',1,defans);
 p1=str2num(p{1});
  k2 =p1
img_origin=handles.graydpromp;
 
img_size = size( img_origin );  
img_undist = zeros( img_size );  
img_undist = uint8( img_undist );     
for l1 = 1:img_size(1)  
    y = l1 - img_size(1)/2;        
    for l2 = 1:img_size(2)            
        x = l2 - img_size(2)/2;            
        x1 = round( x * ( 1 + k1 * x * x + k2 * y * y ) );  
        y1 = round( y * ( 1 + k1 * x * x + k2 * y * y ) );  
        y1 = y1 + img_size(1)/2;  
        x1 = x1 + img_size(2)/2;            
        img_undist(l1,l2) = img_origin(y1, x1);            
    end  
end  
handles.graydpromp=img_undist;
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
 imshow(uint8(handles.graydpromp));title('校正之后的图像');
 guidata(hObject,handles);


猜你喜欢

转载自blog.csdn.net/corilei/article/details/80559791