MATLAB图像处理——图像变换矫正二阶拟合

图像变换矫正二阶拟合

  • 问题描述
  • 方法描述
  • 过程
  • 结果
  • 代码

问题描述

已知序列图像中相邻两幅图像A(up.jpg)、B(down.jpg),其坐标分别为(u,v)及(x,y),试求其图像变换校正二阶拟合方程式系数K。要求用最小二乘法求解,变换模型为:
请添加图片描述
up.jpg:
MATLAB图像处理——图像变换矫正二阶拟合_第1张图片
down.jpg:
MATLAB图像处理——图像变换矫正二阶拟合_第2张图片

方法描述

MATLAB图像处理——图像变换矫正二阶拟合_第3张图片
MATLAB图像处理——图像变换矫正二阶拟合_第4张图片

过程

首先得到变换前后畸变和基准图像对应的点的坐标:
畸变图像坐标:

  • x=[300 386 293 498 369 384 52]
  • y=[483 441 285 288 125 38 138]
    基准图像对应坐标:
  • u=[99 69 254 121 326 381 510]
  • v=[63 141 174 312 331 398 93]
    通过最小二乘法对矫正二阶拟合方程系数进行求解,求解得到K:
    MATLAB图像处理——图像变换矫正二阶拟合_第5张图片
    即:
    X= 619 – 0.597u – 0.532v + 0.0001u^2 - 0.0001v^2 – 0.0004uv
    Y= 133+0.756u – 0.572v + 0.0004u^2 + 0.0007v^2 – 0.0004uv

结果

首先通过坐标变换得到变换后图片大小,并初始化一矩阵,作为变换后的矩阵,通过得到的矫正二阶拟合方程进行图片像素值的映射,最终得到的图像如下:
MATLAB图像处理——图像变换矫正二阶拟合_第6张图片
从上面的图像可以看出,将要进行变化的down图像。经过变换矩阵映射后,图像的大致走向与要映射的图片up基本一致,但是映射后的图片大小也发生了变化,无法将变化后的图像完全填满,原图中的直线经过变换之后不一定还是直线。

代码

clc
clear all

img_down = imread('down.jpg');
subplot(1,3,1)
imshow(img_down);
title("down");
img_up = imread('up.jpg');
subplot(1,3,2);
imshow(img_up);
title("up");

[h,w,c] = size(img_down);

%畸变图像坐标
x=[300 386 293 498 369 384 52]';
y=[483 441 285 288 125 38 138]';

%基准图像坐标
u=[99 69 254 121 326 381 510]';
v=[63 141 174 312 331 398 93]';

%最小二乘法求解
P=[x,y];
a=[1 1 1 1 1 1 1]';
U=[a, u, v, u.^2, v.^2, (u.*v)];
K_xy=inv(U'*U)*U'*P

P=[u,v];
U=[a,x,y,x.^2,y.^2,(x.*y)];
K_uv=inv(U'*U)*U'*P

ver_xy = [1,1; 1,w; h,1; h,w]; % down.jpg的四个顶点  
ver_data = [ones(4, 1), ver_xy, ver_xy(:,1).^2, ver_xy(:,2).^2, ver_xy(:,1).*ver_xy(:,2)];  
ver_t = ver_data*K_xy; % 经过坐标转换后的顶点坐标  
ver_t_max = ceil(max(ver_t));  
ver_t_min = floor(min(ver_t));  
size_t = ver_t_max - ver_t_min + 1;  
down_t = zeros(size_t(1), size_t(2), 3); % 0初始化转换后图像  
%该部分输出图像位置发生偏移,需要重新考虑图片大小问题
for u=ver_t_min(1):ver_t_max(1)
    for v=ver_t_min(2):ver_t_max(2)
        d = [1, u, v, u^2, v^2, u*v];
        pos = round(d*K_uv); % 通过逆变换找到对应的down.jpg中坐标
        if pos(1)>=1 && pos(2)>=1 && pos(1) <= h && pos(2) <= w
            down_t(u-ver_t_min(1)+1, v-ver_t_min(2)+1, :) = img_down(pos(1), pos(2), :);
        end
    end
end
down_t = uint8(down_t);  
subplot(1,3,3)
imshow(down_t);
title("down to up");

你可能感兴趣的:(MATLAB图像处理,图像处理,matlab,图像处理,计算机视觉)