目录

  • 图像的几何运算
    • 1. 旋转 (imrotate)
    • 2. 缩放(imresize)
    • 3. 裁剪 (imcrop)
    • 4. 镜像变换(flip,flipdim也可以)
    • 5. 平移

图像的几何运算

原图:

读取原图(这里我的图片名字是atm.png):

% 先读入图像
I = imread('atm.png');
% imshow(I);

1. 旋转 (imrotate)

我们先说原理,图像旋转的本质是向量的旋转。

矩阵乘法的实质是进行线性变换,因此对一个向量进行旋转操作也可以通过矩阵和向量相乘的方式进行。

因为图像都是通过二维矩阵存放的(单通道),所以对图像进行旋转时要先设定一个像素作为旋转轴,然后其他的像素位置可以看作从旋转轴出发的向量。

假设有二维向量 v=[x;y]v = [x ; y]v=[x;y] ,若要进行逆时针旋转角度 aaa 。则旋转矩阵R为[cos(a)−sin(a)sin(a)cos(a)]\begin{bmatrix} cos(a)& -sin(a)\\ sin(a) & cos(a) \end{bmatrix} [cos(a)sin(a)​−sin(a)cos(a)​]旋转后的向量 v2=R∗vv2 = R * vv2=R∗v 。在正式处理过程中可以这么表示,原像素位置记为 ppp ,中心点记为 ccc ,旋转后像素位置记为pppppp ,
则有(pp−c)=R∗(p−c)(pp - c) = R*(p - c)(pp−c)=R∗(p−c) 。

如果通过原图的点来计算新图的点,那么新图的点可能会出现漏算的。

这里我们进行逆向求点,通过新图的点,来找旧图的点,这样就不会漏算了。

这里我设函数名为imrotate_test.m

% 进行旋转
% I是图像,angle是角度
function J = imrotate_test(I,angle)
% 首先获得高和宽,色彩的层数
[height, width, color] = size(I);
angle = angle/180*pi;
R=[cos(angle),-sin(angle);sin(angle),cos(angle)];%旋转矩阵
R=R';%求出旋转矩阵的逆矩阵c1=[height;width]/2;%原图中心
%计算显示完整图像需要的画布大小
height2=floor(width*sin(angle)+height*cos(angle))+1;
width2=floor(width*cos(angle)+height*sin(angle))+1;
c2=[height2,width2]/2;%求新画布中点%初始化目标画布
J=uint8(ones(height2,width2,3)*128);
for k = 1:colorfor i = 1:height2for j = 1:width2p=[i;j];%遍历新图像像素点pp=round(R*(p-c2)+c1);%计算在原来图像中的位置%逆向进行像素查找if(pp(1)>=1&&pp(1)<=height&&pp(2)>=1&&pp(2)<=width)J(i,j,k)=I(pp(1),pp(2),k);endendend
end
%显示图像
figure;
imshow(J);

代码:

% 自带的函数
% J1 = imrotate(I,45);
J1 = imrotate_test(I,45); % 进行旋转

运行结果:

2. 缩放(imresize)

这个很好理解就不解释了。

这里我用到逆向求点,通过新图找旧图的点

这里我设函数名为imresize_test.m

% 进行放大缩小
% I:图像 ,r:比例
function J = imresize_test(I,r)
% 首先获得高和宽,色彩的层数
[height, width, color] = size(I);
% 新的图层
height2=floor(height*r)+1;
width2=floor(width*r)+1;%初始化目标画布
J=uint8(ones(height2,width2,3)*128);
for k = 1:colorfor i = 1:height2for j = 1:width2p=[i;j];%遍历旧图像像素点pp=round(p/r);%计算在原来图像中的位置%这里仍然使用round函数,但结果会比方案一好得多%逆向进行像素查找if(pp(1)>=1&&pp(1)<=height&&pp(2)>=1&&pp(2)<=width)J(i,j,k)=I(pp(1),pp(2),k);endendend
end%显示图像
figure;
imshow(J);

代码:

% 自带函数
% J2 = imresize(I,1/3);
J2 = imresize_test(I,1/3);

运行结果:

3. 裁剪 (imcrop)

直接求点,直接上代码!!!(参数与自带的函数不同)

这里我设函数名为imcrop_test.m

% 进行裁剪
% w:水平方向的两个值,h:竖直方向的两个值
function J = imcrop_test(I,w,h)% 首先获得高和宽,色彩的层数
[height, width, color] = size(I);
if w(1)>w(2)a = w(2);w(2) = w(1);w(1) = a;
end
if h(1)>h(2)a = h(2);h(2) = h(1);h(1) = a;
end
if w(2)>width||h(2)>height||w(1)<=0||h(1)<=0return
end
% 新的图层
height2=h(2)-h(1);
width2=w(2)-w(1);%初始化目标画布
J=uint8(ones(height2,width2,3)*128);
for k = 1:colorfor i = 1:height2for j = 1:width2pp=[i+h(1);j+w(1)];J(i,j,k)=I(pp(1),pp(2),k);endend
end%显示图像
figure;
imshow(J);

代码:

% 自带函数
% J3 = imcrop(I,[95,80,300,300]); % 略有不同,参数:[左上角坐标,两个截取长度]
J3 = imcrop_test(I,[95,398],[80,379]);

运行结果:

4. 镜像变换(flip,flipdim也可以)

水平变换,就是左右点关于中线交换

这里我设函数名为flip_test.m

% I是图像
% a是选择的变化 1是水平变换 2是垂直变换 3是对角变换
function J = flip_test(I,a)
% 首先获得高和宽,色彩的层数
[height, width, color] = size(I);
%初始化目标画布
J=uint8(ones(height,width,color)*128);
if a==1 % 水平for k = 1:colorfor i = 1:heightfor j = 1:widthpp=round(p/r);%计算在原来图像中的位置%这里仍然使用round函数,但结果会比方案一好得多%逆向进行像素查找if(pp(1)>=1&&pp(1)<=height&&pp(2)>=1&&pp(2)<=width)J(i,j,k)=I(pp(1),pp(2),k);endendendend
elseif a==2 % 垂直for k = 1:colorfor i = 1:heightfor j = 1:widthp=[i;j];%遍历新图像像素点J(height-i+1,j,k)=I(p(1),p(2),k);endendend
elseif a==3 % 对角for k = 1:colorfor i = 1:heightfor j = 1:widthp=[i;j];%遍历新图像像素点J(height-i+1,width-j+1,k)=I(p(1),p(2),k);endendend
elsedisp('你的输入错误');return
end%显示图像
figure;
imshow(J);
end

代码:

% 自带的函数
% J4 = flip(I,1);% 水平变换
% J5 = flip(I,2);% 垂直变换
% 对角变换我没有找到,但是直接变换两次不就是对角变换了嘛
J4 = flip_test(I,1);
title('水平变换');
J5 = flip_test(I,2);
title('垂直变换');
J6 = flip_test(I,3);
title('对角变换');

运行结果:



5. 平移

这里我设函数名为translation_test.m

% I为处理图像,x是一个数组,第一个数为右移的长度,第二个为下移的长度
function J = translation_test(I,x)
% 首先获得高和宽,色彩的层数
[height, width, color] = size(I);
%初始化目标画布
J=uint8(ones(height,width,color)*128);
for k = 1:colorfor i = 1:heightfor j = 1:widthp=[i;j];%遍历旧图像像素点pp=[i-x(1);j-x(2)]; %计算在原来图像中的位置%这里仍然使用round函数,但结果会比方案一好得多%逆向进行像素查找if(pp(1)>=1&&pp(1)<=height&&pp(2)>=1&&pp(2)<=width)J(i,j,k)=I(pp(1),pp(2),k);endendend
end%显示图像
figure;
imshow(J);

代码:

% 通过一些自带的函数,可以实现平移
%translate(SE, [y x])在结构元素SE上进行y和x方向的位移 正数对应右移和下移
% se = translate(strel(1),[100 80]);
% J7 = imdilate(I,se);%利用膨胀函数平移图像
J7 = translation_test(I,[-50,-100]);

运行结果:



创作不易,如果对你有帮助,求求你给我个赞!!!
点赞 + 收藏 + 关注!!!
如有错误与建议,望告知!!!(将于下篇文章更正)
请多多关注我!!!谢谢!!!

数字图像处理 matlab图像的几何运算 实验三 旋转 缩放 裁剪 镜像变换 平移相关推荐

  1. 【数字图像处理】图像直方图均衡化、空域滤波(均值滤波、中值滤波)、图像锐化(Laplace算子)、图像傅里叶变换实验

    图像直方图均衡化.空域滤波.图像锐化.图像傅里叶变换 一.图像直方图均衡化 二.图像空域滤波 1.均值滤波(滤波次数n→3) 2.中值滤波(滤波次数n→3) 3.图像锐化(Laplace算子) 三.图 ...

  2. [数字图像处理Matlab]任选一幅灰度图,自行编写程序,完成直方图均衡化。鼠鼠的数字图像处理实验要求:不能用MATLAB自带的histeq函数实现直方图均衡化

    数学理论前提:见数字图像处理(第三版) 李俊山等编著  p50-53 1.利用imhist函数统计像素点个数 Im = imread("C:\Users\鼠鼠\Desktop\数字图像处理m ...

  3. 数字图像处理:图像的灰度变换(Matlab实现)

    数字图像处理:图像的灰度变换(Matlab实现) (1)线性变换: 通过建立灰度映射来调整源图像的灰度. k>1增强图像的对比度:k=1调节图像亮度,通过改变d值达到调节亮度目的:0 i = i ...

  4. 数字图像处理MATLAB学习笔记(一)

    数字图像处理MATLAB学习笔记(一) 灰度转换与空间滤波 本节主要使用Matlab语言进行灰度转换与空间滤波的使用 并对相关数学原理进行总结 1. Intensity Transformer Fun ...

  5. 【数字图像处理matlab】(HSI变换融合算法)

    [数字图像处理matlab](HSI变换融合算法) 输入一张高分辨率的全色影像HR,一张低分辨率的多光谱影像MS,采用HSI变换融合算法实现影像融合,其中RGB与HSI影像的相互转换调用自定义函数RG ...

  6. 《数字图像处理 MATLAB版》学习笔记

    学习教材:<数字图像处理 MATLAB版>(第二版) 冈萨雷斯 学习过程中的图片代码和及我收集的一些关于数字图像处理的其他学习资料,需要的可以评论留下邮箱(需要购买专栏),加油 文章目录 ...

  7. 数字图像处理:图像金字塔

    转载请标明出处:数字图像处理:图像金字塔_数字图像处理opencv_新浪博客 (一)概念 以多个分辨率来表示图像的一种有效且概念简单的结构是图像金字塔.图像金字塔最初用于机器视觉和图像压缩,一个图像金 ...

  8. 数字图像处理MATLAB学习笔记(五)

    数字图像处理MATLAB学习笔记(五) Color Image Processing 1 Color Image Representation in MATLAB 这里不多说了,彩色图片在计算机中以R ...

  9. 数字图像处理 - Ch2 图像取样与量化

    数字图像处理 Ch2 图像取样与量化 图像取样与量化 概念 数字图像表示 线性索引与坐标索引 空间分辨率 & 灰度分辨率 图像内插 1. 最近邻内插 2. 双线性内插 3. 双三次内插 其他方 ...

  10. 数字图像处理--基本图像操作

    数字图像处理–基本图像操作 1 主要内容 (1)搭建能运行图像算法程序的平台: (2)独立完成matlab矩阵基本操作,如矩阵信息的提取包括获取矩阵大小.矩阵维数.矩阵元素个数.向量长度和矩阵乘法等操 ...

最新文章

  1. 超酷的Android 侧滑(双向滑动菜单)效果
  2. linux终端名字怎么改,Ubuntu系统把终端用户名改成红色的技巧
  3. delphi64位 char数组转换string中文乱码_使用位运算、值交换等方式反转java字符串-共四种方法...
  4. Java高级语法笔记-普通异常处理
  5. SPASVO 软件生命周期管理 ALM V2.1 正式发布!
  6. 财富:鲍尔默时代的微软一直在走下坡路
  7. 创物联网融资额记录的G7,拿到3.2亿美元后要做什么?
  8. 《R语言与数据挖掘最佳实践和经典案例》—— 3.5 将图表保存到文件中
  9. scala的模式匹配
  10. C++17特性一览(转载)
  11. [转]window.location方法获取URL及window.location.assign(url)和replace(url)区别
  12. c语言打印%-6llu,C语言-输出指定个数的质数
  13. Windows扫雷游戏python
  14. c1侧方停车技巧图解解析停车要点
  15. 产品读书《用户力:需求驱动的产品、运营与商业模式》
  16. 硬件工程师的真实前途我说出来可能你们不信
  17. 【论文解读】Stacked Hourglass Networks
  18. 【C】C语言int型数组转化为char型字符串数组
  19. MVC路由自定义及视图找寻规则
  20. Spring Boot Admin 2.3 简洁Demo

热门文章

  1. 华为内部流程管理系统(附关键流程图)
  2. 台式计算机网卡型号怎么查找,怎么确定台式机无线网卡驱动版本 台式机无线网卡驱动版本查看方法...
  3. 西门子g120变频器接线图_西门子1500PLC通过工艺对象对G120变频器组态和调试
  4. Python入门教程之安装MyEclipse插件和安装Python环境
  5. latex 数学公式_推荐一款编写数学公式的国产神器:AxMath,可与LATEX双向转换
  6. JAVA 如何反编译JAR文件
  7. 用友T1-商贸宝库存商品明细账
  8. Sodinokibi勒索病毒利用Flash漏洞强势来袭
  9. 大数据产品推荐:金蜂巢大数据集成与脱敏系统
  10. Win10安装CUDA10和cuDNN