2018企业网站优化应该怎么做,博罗网站开发,中国数控机床网,泰安网站建设报价这次学习图像的几何变换#xff0c;主要有以下内容#xff1a;图像的平移变换图像的镜像变换图像的转置变换图像的旋转变换图像的缩放1、图像的平移变换在进行书写matlab代码之前#xff0c;先来了解一下图像平移的理论基础。设图像的高度为H#xff0c;宽度为W#xff0c… 这次学习图像的几何变换主要有以下内容·图像的平移变换 ·图像的镜像变换 ·图像的转置变换 ·图像的旋转变换 ·图像的缩放 1、图像的平移变换 在进行书写matlab代码之前先来了解一下图像平移的理论基础。设图像的高度为H宽度为W如下所示 我们知道图像是由像素组成的而像素的集合就相当于一个二维的矩阵每一个像素都有一个“位置”也就是像素都有一个坐标。假设原来的像素的位置坐标为x0,y0经过平移量△x△y后坐标变为x1,y1如下所示 用数学式子表示可以表示为 x1 x0 △x, y1 y0 △y用矩阵表示为 本来使用二维矩阵就可以了的但是为了适应像素、拓展适应性这里使用三位的向量。式子中矩阵 称为平移变换矩阵因子△x和△y为平移量。此外我们也知道了图像的高度H其实也就是像素的行数对于坐标1≤X≤H图像的长度也就是像素的列数对应坐标1≤Y≤W。 上面是理论基础下面我们就用matlab实现一下图像的平移变换相应的matlab代码如下所示close all ;clear all ;clc ;im imread(F:/图像处理/Koala.jpg);%读入一幅图[H,W,Z] size(im); % 获取图像大小H为垂直方向768点W为水平方向1024点Iim2double(im);%将图像类型转换成双精度res ones(H,W,Z); % 构造结果矩阵。每个像素点默认初始化为1白色delX 50; % 平移量XdelY 100; % 平移量Ytras [1 0 delX; 0 1 delY; 0 0 1]; % 平移的变换矩阵 for x0 1 : H%第1行到第768行 for y0 1 : W%第1列到第1024列 temp [x0; y0; 1];%将每一点的位置进行缓存1行1列1行2列···1行1024列 temp tras * temp; % 根据算法进行矩阵乘法转换矩阵乘以原像素位置 x1 temp(1, 1);%新的像素x1位置也就是新的行位置从1~768 y1 temp(2, 1);%新的像素y1位置,也就是新的列位置从1~1024 % 变换后的位置判断是否越界 if (x1 H) (y1 W) (x1 1) (y1 1)%新的行位置要小于新的列位置 res(x1,y1,:) I(x0,y0,:);%进行图像平移颜色赋值 end endend; 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;%显示图片一行两列第二幅我们先来看一下效果然后着重分析一下代码效果如下所示 然后下面我们分析一下关键的代码 读入图像之后得到im,我们可以看到im是一个三维的变量包括了像素的位置高度(即垂直长度)和宽度即水平长度像素的颜色。注24位真彩图也是用矩阵表示图像像素直接用RGB颜色显示而不是通过颜色索引表。图像像素的颜色用三个变量表示即R,G,B每个变量从0~255变化因此一个像素也就是8bit*324bit一个像素用24bit表示可以有2^24种颜色。我们可以看到会有unit8就是8bit的原因。 然后我们获取图像的大小用H,W,Z三个变量接收其中H接收了图片的高度也就是垂直长度W接收了图片的宽度水平长度然后Z接收了图片的颜色值。 然后我们将图像转换成双精度类型I这是因为使用双精度可以仿真在转换过程中发生精度损失的问题也是方便我们进行转换。转换之后我们可以看到unit8的类型别我们转换成了double类型。 接着我们构造一个图像res矩阵这个图像首先进行归一化也就是让里面的元素全部为1对于图像就是一张白色的图片了。这个图像主要是用来“保存”我们进行位移后的图像。 然后我们就设置平移量、构造平移变换矩阵。这个矩阵我们根据前面的理论部分可以得到。 接着便是重点了进行平移变换。我们来一句一句解读这个循环。当x01,y01时得到第一个像素的位置也就是x0,y0这个像素然后将这个像素位置进行缓存也就是构造一个矩阵temp,即理论中的 然后进行位置转换也就是进行矩阵相乘用变换矩阵乘以原像素矩阵得到了变换后像素矩阵 接着我们需要把变换后的像素位置“提取”出来用x1y1进行存储为什么要获取位置呢这是因为我们要判断这个像素是否越界了也就是进行平移之后得到的这个像素位置是否还存在显示区域里面也就是我们的 if (x H) (y W) (x 1) (y 1) 语句当还在显示区域里面时我们要进行移位显示 res(x1,y1,:) I(x0,y0,:);%进行图像平移颜色赋值这个语句的含义是把I中的RGB值也就是颜色值赋值给res也就是说前面矩阵相乘只是移动的像素位置但是颜色没有进行移动这里进行图像颜色的平移当x01,y01时把该点的位置图像颜色进行移动过去。 当x01,y02时移动第二点。我们可以看到这里的代码是从左到右平移也就是先进行宽度的平移从上到下进行高度的平移。当两个循环完成之后图像也就像平移完成了。 最后的代码就是显示图像了其中axis on 的意思是打开左边方便我们进行查看平移后的位置。从上面的效果我们可以得到delx表示的高度的平移量delx为正值时往下平移delx为负值时往上平移而dely表示的宽度的平移量正值往右平移负值往左平移。 2、图像的镜像变换 图像的镜像变换分为水平镜像和垂直镜像下面分别进行这两种镜像的介绍首先说明一下无论是水平镜像还是垂直镜像镜像后高度和宽度都不变。 H图像的高度关联x W图像的宽度关联y ·水平镜像操作以原图像的垂直中轴线为中心将图像分为左右两部分进行对称变换。示意图如下所示 水平镜像中原图中的x0,y0经过水平镜像后坐标变成了x0,W-y0用数学公式表达就是 x1 x0, y1 W-y0 ;写成矩阵就是 也就是说水平镜像变换矩阵因子为 用matlab代码实现如下所示 close all ;
clear all ;
clc ;
im imread(F:/图像处理/Koala.jpg);%读入一幅图
[H,W,Z] size(im); % 获取图像大小H为垂直方向768点W为水平方向1024点
Iim2double(im);%将图像类型转换成双精度
res ones(H,W,Z); % 构造结果矩阵。每个像素点默认初始化为1白色
tras [1 0 0; 0 -1 W; 0 0 1]; % 水平镜像的变换矩阵
for x0 1 : H%第1行到第768行for y0 1 : W%第1列到第1024列temp [x0; y0; 1];%将每一点的位置进行缓存1行1列1行2列···1行1024列temp tras * temp; % 根据算法进行矩阵乘法转换矩阵乘以原像素位置x1 temp(1, 1);%新的像素x1位置也就是新的行位置从1~768y1 temp(2, 1);%新的像素y1位置,也就是新的列位置从1~1024% 变换后的位置判断是否越界if (x1 H) (y1 W) (x1 1) (y1 1)%新的行位置要小于新的列位置res(x1,y1,:) I(x0,y0,:);%进行图像颜色赋值endend
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;%显示图片一行两列第二幅代码已经没有什么好介绍的了跟前面的平移差不多只不过变换矩阵是水平镜像变化矩阵得到的效果如下所示 ·垂直镜像操作以原图像的水平中轴线为中心将图像分为上下两部分进行对称变换。示意图如下所示 垂直镜像中原图中的x0,y0经过垂直镜像后坐标变成了H-x0,y0用数学公式表达就是 x1 H - x0, y1 y0 ;写成矩阵就是 也就是说垂直镜像变换矩阵因子为 用matlab代码实现如下所示close all ;clear all ;clc ;im imread(F:/图像处理/Koala.jpg);%读入一幅图[H,W,Z] size(im); % 获取图像大小H为垂直方向768点W为水平方向1024点Iim2double(im);%将图像类型转换成双精度res ones(H,W,Z); % 构造结果矩阵。每个像素点默认初始化为1白色tras [-1 0 H; 0 1 0; 0 0 1]; % 垂直镜像的变换矩阵for x0 1 : H%第1行到第768行for y0 1 : W%第1列到第1024列temp [x0; y0; 1];%将每一点的位置进行缓存1行1列1行2列···1行1024列temp tras * temp; % 根据算法进行矩阵乘法转换矩阵乘以原像素位置x1 temp(1, 1);%新的像素x1位置也就是新的行位置从1~768y1 temp(2, 1);%新的像素y1位置,也就是新的列位置从1~1024% 变换后的位置判断是否越界if (x1 H) (y1 W) (x1 1) (y1 1)%新的行位置要小于新的列位置res(x1,y1,:) I(x0,y0,:);%进行颜色赋值endendend;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;%显示图片一行两列第二幅 代码实现的效果如下所示 3、图像的转置变换 图像的转置就是将图像像素的x坐标和y坐标互换。这样将改变图像的高度和宽度转置后图像的高度和宽度也将互换。图像的转置用数学公式描述就是 x1 y0, y1 x0;写出矩阵如下所示 用matlab实现的代码如下所示close all ;clear all ;clc ;im imread(F:/图像处理/Koala.jpg);%读入一幅图[H,W,Z] size(im); % 获取图像大小H为垂直方向768点W为水平方向1024点Iim2double(im);%将图像类型转换成双精度res ones(H,W,Z); % 构造结果矩阵。每个像素点默认初始化为1白色tras [0 1 0; 1 0 0; 0 0 1]; % 转置的变换矩阵for x0 1 : H%第1行到第768行for y0 1 : W%第1列到第1024列temp [x0; y0; 1];%将每一点的位置进行缓存1行1列1行2列···1行1024列temp tras * temp; % 根据算法进行矩阵乘法转换矩阵乘以原像素位置x1 temp(1, 1);%新的像素x1位置也就是新的行位置从1~768y1 temp(2, 1);%新的像素y1位置,也就是新的列位置从1~1024% 变换后的位置判断是否越界if (x1 H) (y1 W) (x1 1) (y1 1)%新的行位置要小于新的列位置res(x1,y1,:) I(x0,y0,:);%进行图像颜色赋值endendend;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;%显示图片一行两列第二幅 实现的效果如下所示 4、图像的旋转 一般情况下旋转操作会有一个旋转中心这个旋转中心一般为图像的中心旋转之后图像的大小一般会发生改变。图像像素原来的坐标为x0,y0顺时针选择Θ角度后得到x1,y1用数学公式表达如下所示 x1 x0·cosΘ y0·sinΘ y1 -x0·sinΘ y0·cosΘ用矩阵表示如下所示 matlab中有直接实现图像旋转的函数整理我们就直接使用图像的旋转函数代码如下所示close all ;clear all ;clc ;im imread(F:/图像处理/Koala.jpg);%读入一幅图res imrotate(im,-30);set(0,defaultFigurePosition,[100,100,1000,500]);%设置窗口大小set(0,defaultFigureColor,[1 1 1]);%设置窗口颜色figure;%打开一个窗口用来显示多幅图像subplot(1,2,1), imshow(im),axis on ;%显示图片一行两列第一幅subplot(1,2,2), imshow(res),axis on;%显示图片一行两列第二幅这里主要是说明一下imrotate函数这个函数就是对图像旋转的函数输入是图像和旋转的角度角度为正值时逆时针旋转角度为负值时顺时针选择。代码实现的效果如下所示 5、图像的缩放 下面值来介绍一下图像的缩放主要是根据函数imresize来实现的我们先来看看代码和效果图然后分析图像的缩放函数。代码和效果图像所示close all ;clear all ;clc ;[im,map] imread(Hydrangeas.bmp);%读入图片im0 imresize(im,0.26);%进行缩放到原来的0.26倍im1 imresize(im,1);%缩放原来的比例im2 imresize(im,3.5);%进行缩放到原来的3.5倍im3 imresize(im,[64 40]);%进行图像的缩放并设置图像的行列im4 imresize(im,1.6,bilinear);%进行线性插值实现缩放im5 imresize(im,1.6,triangle);set(0,defaultFigurePosition,[100,100,1000,500]);%设置窗口大小set(0,defaultFigureColor,[1 1 1]);%设置窗口颜色figure;%打开一个窗口用来显示多幅图像subplot(1,2,1), imshow(im,map);%显示图片一行两列第一幅subplot(1,2,2), imshow(im0,map);%显示图片一行两列第二幅figure;%打开一个窗口用来显示多幅图像subplot(1,2,1), imshow(im,map);%显示图片一行两列第一幅subplot(1,2,2), imshow(im1,map);%显示图片一行两列第二幅figure;%打开一个窗口用来显示多幅图像subplot(1,2,1), imshow(im,map);%显示图片一行两列第一幅subplot(1,2,2), imshow(im2,map);%显示图片一行两列第二幅figure;%打开一个窗口用来显示多幅图像subplot(1,2,1), imshow(im,map);%显示图片一行两列第一幅subplot(1,2,2), imshow(im3,map);%显示图片一行两列第二幅figure;%打开一个窗口用来显示多幅图像subplot(1,2,1), imshow(im,map);%显示图片一行两列第一幅subplot(1,2,2), imshow(im4,map);%显示图片一行两列第二幅figure;%打开一个窗口用来显示多幅图像subplot(1,2,1), imshow(im,map);%显示图片一行两列第一幅subplot(1,2,2), imshow(im5,map);%显示图片一行两列第二幅 缩小 等大 放大 缩放并且设置行列 线性插值 下面介绍一下imresize函数的使用信息可以通过在matlab 使用help imresize查看该函数主要用来调整图像大小。 B imresizeASCALE返回一个图像大小是原来的SCALE倍A是灰度、RGB或者二进制图像。 B imresizeA[NUMROWS NUMCOLS]调整图像大小使其具有指定数量的行和列。 NUMROWS或NUMCOLS可能都是NaN在这种情况下将自动计算行数或列数以便保留图像宽高比。 [YNEWMAP] imresizeXMAPSCALE调整索引图像的大小其中按照SCALE的倍数对原图像进行调整。 [YNEWMAP] imresizeXMAP[NUMROWS NUMCOLS]调整索引图像的大小通过调整行数和列数进行调整。 要控制imresize使用的插值方法可以在上面的语法中添加一个METHOD参数如下所示 ASCALEMETHOD A[NUMROWS NUMCOLS]METHOD imresizeXMAPMMETHOD imresizeXMAP[NUMROWS NUMCOLS]METHOD METHOD可以是一个命名一般插值方法的字符串 nearest - 最近邻插值 bilinear - 双线性插值 bicubic - 三次插值;默认方法 METHOD也可以是一个命名插值内核的字符串 box - 用盒形内核插值 triangle - 三角形内核插值 相当于“双线性” cubic - 用立方核插值 相当于“bicubic” lanczos2 - 用Lanczos-2内核插值 lanczos3 - 插入Lanczos-3内核 最后METHOD可以是{fw}形式的双元素单元阵列其中f是自定义内插内核的处理函数w是自定义内核的宽度。在区间-w / 2 x w / 2之外fx必须为零。可以使用标量或向量输入来调用处理函数f。 可以通过使用上述任何语法之后的参数/值对来实现对imresize的附加控制。例如 B imresizeASCALEPARAM1VALUE1PARAM2VALUE2... 参数包括 Antialiasing- 真假指定缩小图像时是否执行抗锯齿。默认值取决于您选择的插值方法。对于nearest METHOD参数默认值为false;对于所有其他方法默认值为true。 Colormap - 仅与索引图像相关 original 或 optimized;如果original 则输出newmap与输入图相同。如果是“优化”则会创建一个新的优化颜色映射。默认值为“optimized”。 Dither - 仅适用于索引图像true或false; 指定是否执行颜色抖动。默认值为true。 Method - 如上所述 OutputSize - 一个双元素向量[MROWS NCOLS] 指定输出大小。一个元素可以是NaN在这种情况下自动计算另一个值以保留图像的宽高比。 Scale - 一个标量或两元素向量指定调整大小的比例因子。如果它是标量则将相同的比例因子应用于每个维度。如果它是向量它分别包含行和列尺寸的比例因子。 例子 --------使用默认的双三次插值和抗混叠缩小两倍 I imreadrice.png; J imresizeI0.5; figureimshowI figureimshowJ 使用最近邻内插收缩因子2。 这是最快的方法但质量最差 J2 imresizeI0.5nearest;调整索引图像的大小 [Xmap] imreadtrees.tif; [Ynewmap] imresizeXmap0.5; imshowYnewmap调整RGB图像的大小以获得64行自动计算列数RGB imreadpeppers.png; RGB2 imresizeRGB[64 NaN]; 图像的几何变化差不多就到这里了matlab中有很多函数可以实现图像的几何变换这里就不详细说明了。