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