图像变换(一)

1,337 阅读5分钟
  1. 图像的参数化几何变换原理 图像几何变换又称为图像空间变换,它将一幅图像中的坐标位置映射到另一 幅图像中的新坐标位置。我们学习几何变换的关键就是要确定这种空间映射关 系,以及映射过程中的变换参数。几何变换不改变图像的像素值,只是在图像平 面上进行像素的重新安排。一个几何变换需要两部分运算:首先是空问变换所需 的运算,如平移、旋转和镜像等,需要用它来表示输出图像与输入图像之间的〈像 素〉映射关系。此外,还需要使用灰度插值算法,因为按照这种变换关系进行计 算,输出图像的像素可能被映射到输入图像的非整数坐标上。

  2. 图像的向前变换与图像的逆向变换 图像变换的本质是将像素点的坐标通过某一种函数关系,映射到另外的位 置。假设变换前图像为 I(x,y),变换后图像为 I’(x’,y’),则变换前后的图像之间存 在下列关系 (x′y′)=(f(x,y)g(x,y))I(x,y)=I′(x′,y′)=I′(f(x,y),g(x,y)) (1) (xy)=(f−1(x′,y′)g−1(x′,y′))I′(x′,y′)=I(x,y)=I(f−1(x′,y′),g−1(x′,y′)) (2) 公式(1)我们已知原图像到目标图像的坐标变换(f(x,y),g(x,y)),因此我们可以 知道原图像的一点在变换后在目标图像的位置,我们称为向前映射。 相反,公式(2)中我们知道目标图像的一点(x’,y’)在变换前在原图像上的位置 (f−1(x′,y′),g−1(x′,y′)),我们称为向后映射。 输入图像上整数点坐标映射到输出图像之后,变成了非整数点坐标。因此, 整数点像素值周围会有很多输入图像像素映射过来,每个到其周围的非整数 点像素值都会分配一定的灰度值到它上面,将这些分配而来的像素值叠加,就是 输出图像整数点位置的像素值。由于这个分配、叠加的特性,向前映射法有时也 叫像素移交映射。对于向前映射而言,输出图像某一点的像素值不能直接得到, 需要遍历输入图像的所有像素值,对其进行坐标变换,分配像素值到整数位置, 才能得到输出图像各像素点的像素值。这是向前映射法的缺点。

image.png 向后映射法就比较直观。在这种情况下,我们知道输出图像上整数点位置 (x’,y’)在变换前位于输入图像上的位置(x,y),一般来说这是个非整数点位置,利 用其周围整数点位置的输入图像像素值进行插值,就得到了该点的像素值。我们 遍历输出图像,经过坐标变换、插值两步操作,我们就能将其像素值一个个地计 算出来,因此向后映射又叫图像填充映射。如下图所示。

image.png

  1. 图像的下抽样原理与图像的内插方法原理 缩小图像(或称为下采样(subsampled)或降采样(downsampled))的 主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略 图。放大图像(或称为上采样(upsampling)或图像插值(interpolating))的 主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上。对图像的缩 放操作并不能带来更多关于该图像的信息, 因此图像的质量将不可避免地受到 影响。然而,确实有一些缩放方法能够增加图像的信息,从而使得缩放后的图像 质量超过原图质量的。 下采样原理:对于一幅图像 I 尺寸为 MN,对其进行 s 倍下采样,即得到 (M/s)(N/s)尺寸的得分辨率图像,当然 s 应该是 M 和 N 的公约数才行,如果考 虑的是矩阵形式的图像,就是把原始图像 s*s 窗口内的图像变成一个像素,这个 像素点的值就是窗口内所有像素的均值: 上采样原理:图像放大几乎都是采用内插值方法,即在原有图像像素的基础 上在像素点之间采用合适的插值算法插入新的元素。

  2. 完成图像的几何变换实验 图像是由像素组成的,而像素的集合就相当于一个二维的矩阵,每一个像素 都有一个“位置”,也就是像素都有一个坐标。假设原来的像素的位置坐标为 (x0,y0),经过平移量(△x,△y)后,坐标变为(x1,y1)用数学式子表示可 以表示为:x1 = x0 + △x, y1 = y0 + △y; 用矩阵表示为:

image.png

im = imread('D:/cvpr/作业1/实验一/test.jpeg');%读入一幅图
[H,W,Z] = size(im); % 获取图像大小
I=im2double(im);%将图像类型转换成双精度
res = zeros(H,W,Z); % 构造结果矩阵。每个像素点默认初始化为1(白色)
delX = 50; % 平移量X
delY = 100; % 平移量Y
tras = [1 0 delX; 0 1 delY; 0 0 1]; % 平移的变换矩阵
for x0 = 1 : H
    for y0 = 1 : W
        temp = [x0; y0; 1];%将每一点的位置进行缓存
        temp = round(tras * temp); % 根据算法进行,矩阵乘法:转换矩阵乘以原像素位置
        x1 = temp(1, 1);%新的像素x1位置,也就是新的行位置
        y1 = temp(2, 1);%新的像素y1位置,也就是新的列位置
        % 变换后的位置判断是否越界
        if (x1 <= H) & (y1 <= W) & (x1 >= 1) & (y1 >= 1)%新的行位置要小于新的列位置
            res(x1,y1,:)= I(x0,y0,:);%进行图像平移,颜色赋值
        end
    end
end
set(0,'defaultFigurePosition',[100,100,1000,500]);%设置窗口大小
set(0,'defaultFigureColor',[1 1 1]);%设置窗口颜色
figure;%打开一个窗口,用来显示(多幅)图像
subplot(1,2,1), imshow(I),axis on ;%显示图片,一行两列,第一幅
subplot(1,2,2), imshow(res),axis on;%显示图片,一行两列,第二幅

image.png