题目:自定义一个图像的平移变换函数myImageTranslation,用于平移给定的输入图像,要求该函数的输入参数包括处理前的图像img1、垂直方向的平移步长delta_v和水平方向的平移步长delta_h,输出参数为处理后的图像img2。

说明:函数模板为img2 = myImageTranslation(img1, delta_v, delta_h),其中,平移后的图像img2必须和输入图像img1的大小相同,若平移后新坐标溢出img1的坐标范围,则用值0来填充该坐标处的灰度值,否则用img1中相应像素点的灰度值进行赋值,delta_v和delta_h必须是整数(可以是正或负整数);要求能处理灰度图像EXP2A.tif和彩色图像EXP2B.bmp。

实现思路:

1.首先使用abs()函数将分别取水平v和垂直位移h的绝对值,使用size()函数获取图像的宽和高以及层数,即图像数据的行数r和列数c以及维数l;

2.判断水平位移和垂直位移的大小:若水平位移或垂直位移大于图片的宽度或长度,则构造一个与原图像相同行数、列数、层数的零矩阵,输出矩阵,即直接输出与原图像相同大小的黑色图像;若水平位移和垂直位移都为0,则直接输出原图像;否则,继续下面的步骤;

3. 构造矩阵:①构造行数为h、列数为c、层数为l的零矩阵,用于插入图片的上方或下方,其中当垂直位移小于0时插入图像的下方,当垂直位移大于0时插入图像的上方;②构造行数为(r + h)、列数为v、层数为l的零矩阵,用于插入图片的左方或右方,其中当水平位移小于0时插入图像的右方,当水平位移大于0时插入图像的左方;

4.插入两个零矩阵:分别判断水平位移和垂直位移的大小,将步骤3中构造的矩阵按规则分别插入图像的上方或下方以及图像的左方或右方;

5.裁剪图像并输出:根据水平位移和垂直位移的大小裁剪图像,即裁剪图像中插入零矩阵的角落,例如水平位移和垂直位移均大于0时,分别的图像的左方和上方插入零矩阵,那么在裁剪图像时应该裁剪图像的左上角,参见图1。

图1 图像水平位移+v 垂直位移+h 原理示意图

该算法的时间复杂度为O(1),效率更高。

实现效果演示:

图2 灰度图像平移

图3 彩色图像平移

实现源代码:

function img2 = myImageTranslation(img1, delta_v, delta_h)%参数分别为图像矩阵、水平位移、垂直位移%%取位移的绝对值abs_delta_v = abs(delta_v);abs_delta_h = abs(delta_h);%%将图像uint8类型的数据转换为double类型的同时,把数据范围由原来的0~255映射到0~1,可以看作数据的一种归一化,以便计算img = im2double(img1);%获取图像的宽和高以及层数,即图像数据的行数r和列数c以及维数l[r,c,l] = size(img);%如果平移的水平位移或垂直位移大于图像的宽度或高度,则直接输出黑色图像即可if(abs_delta_h >= r || abs_delta_v >= c)img2 = zeros(r,c,l);returnelseif(abs_delta_h == 0 && abs_delta_v == 0)%当水平和垂直位移都为0时,输出原图像img2 = img;returnend%%构造矩阵rows = zeros(abs_delta_h,c,l);%用于插入图像的上方或下方,当垂直位移为负时插入图像的下方cols = zeros(r + abs_delta_h,abs_delta_v,l);%用于插入图像的左方或右方,当垂直位移为负时插入图像的右方if(delta_v < 0)%当水平位移为负时插入图像的下方img = [img;rows];if(delta_h < 0)%当垂直位移为负时插入图像的右方img = [img,cols];img2 = img(abs_delta_h:end,abs_delta_v:end,:);%输出右下角elseif(delta_h > 0)%当垂直位移为正时插入图像的左方img = [cols,img];img2 = img(abs_delta_h:end,1:c,:);%输出右下角endelseif(delta_v > 0)%当水平位移为正时插入图像的上方img = [rows;img];if(delta_h < 0)img = [img,cols];img2 = img(1:r,abs_delta_v:end,:);%输出右上角elseif(delta_h > 0)img = [cols,img];img2 = img(1:r,1:c,:);%输出左上角endelse%当水平位移为0时垂直方向不操作if(delta_h < 0)img = [img,cols];img2 = img(1:r,abs_delta_v:end,:);%输出图像右方elseif(delta_h > 0)img = [cols,img];img2 = img(1:r,1:c,:);%输出图像左方endend[r2,c2,l2] = size(img2)
end
clc;
clear;
%%%%%%%%%%%%%%%%%%%%%%%黑白%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
img1 = imread('EXP2A.tif');
delta_v = 600;
delta_h = 0;
img2 = myImageTranslation(img1, delta_v, delta_h);figure('NumberTitle', 'off', 'Name', '实验二第一题 图像平移 黑白');
subplot(2,2,1);
imshow(img1);
title('原始图像');subplot(2,2,2);
imshow(img2);
title(['平移后的图像:水平',num2str(delta_v),'像素,垂直',num2str(delta_h),'像素']);delta_v = 100;
delta_h = 50;
img3 = myImageTranslation(img1, delta_v, delta_h);
subplot(2,2,3);
imshow(img3);
title(['平移后的图像:水平',num2str(delta_v),'像素,垂直',num2str(delta_h),'像素']);delta_v = -70;
delta_h = -120;
img4 = myImageTranslation(img1, delta_v, delta_h);
subplot(2,2,4);
imshow(img4);
title(['平移后的图像:水平',num2str(delta_v),'像素,垂直',num2str(delta_h),'像素']);%%%%%%%%%%%%%%%%%%%%%%%彩色%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
img1 = imread('EXP2B.bmp');
delta_v = 200;
delta_h = 50;
img2 = myImageTranslation(img1, delta_v, delta_h);figure('NumberTitle', 'off', 'Name', '实验二第一题 图像平移 彩色');
subplot(2,2,1);
imshow(img1);
title('原始图像');subplot(2,2,2);
imshow(img2);
title(['平移后的图像:水平',num2str(delta_v),'像素,垂直',num2str(delta_h),'像素']);delta_v = -100;
delta_h = 50;
img3 = myImageTranslation(img1, delta_v, delta_h);
subplot(2,2,3);
imshow(img3);
title(['平移后的图像:水平',num2str(delta_v),'像素,垂直',num2str(delta_h),'像素']);delta_v = -70;
delta_h = -120;
img4 = myImageTranslation(img1, delta_v, delta_h);
subplot(2,2,4);
imshow(img4);
title(['平移后的图像:水平',num2str(delta_v),'像素,垂直',num2str(delta_h),'像素']);

matlab实现 图像的仿射变换 平移变换 彩色 灰度 图像平移 代码相关推荐

  1. matlab实现基于24位真彩色BMP图像的文件信息隐藏方法(实验内容)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.24位真彩色BMP图像 1.简介 2.文件格式 二.算法(四种) 三.matlab实现 1.图像文件尾部添加信息 2.位 ...

  2. 1.1 python图像的坐标变换-平移变换

    第一章 图像的坐标变换-平移变换 文章目录 第一章 图像的坐标变换-平移变换 1算法原理 2 代码 3 效果 1算法原理 图像的几何变换,也就是矩阵乘法. 平移变换是在原来像素加上一个平移值,加法公式 ...

  3. matlab线性拉伸函数,采用线性变换对图像的每一个像素灰度作线性拉伸-Read.PPT

    采用线性变换对图像的每一个像素灰度作线性拉伸-Read 第4章 图像增强(1) 4.1 图像增强概述 图像增强(image enhancement)的定义: 在图像的获取过程中,由于多种因素的影响,导 ...

  4. 图像仿射变换matlab,图像的仿射变换原理和实现

    图像的仿射变换原理和实现 发布时间:2018-05-06 01:03, 浏览次数:1148 仿射变换能够保持图像的"平直性",包括旋转,缩放,平移,错切操作.一般而言,仿射变换矩阵 ...

  5. 【OpenCV 例程200篇】24. 图像的仿射变换

    [OpenCV 例程200篇]24. 图像的仿射变换 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 几何变换的可以分 ...

  6. Halcon 第七章『图像的几何变换』◆第1节:图像的仿射变换(位置变换、形状变换)及应用

    一.介绍 由于相机拍摄的时候可能存在角度偏差,因此实际获得的画面可能会与想象中有所差异.为了校正图像在拍摄中的失真问题,可以对图像进行一些简单的几何变换,如平移.缩放和旋转等,这些是图形学中的基本几何 ...

  7. 图像的仿射变换原理及c++实现(旋转,平移,缩放,偏移,组合变换)

    github地址:https://github.com/2209520576/Image-Processing-Algorithm 一.写在前面 几何空间变换是图像处理中的最基础的算法,主要包括图像的 ...

  8. matlab按图像边缘抠图_MATLAB--数字图像处理 图像锐化

    一.实验名称 图像锐化 二.实验目的 1.熟悉MATLAB软件的使用. 2.掌握图像锐化的原理及数学运算. 3.于MATLAB环境下编程实现对图片锐化. 三.实验内容 利用图像基于单方向梯度算子,Ro ...

  9. matlab将图片写入指定文件夹,将图像写入图形文件

    A - 图像数据 矩阵 图像数据,指定为满(非稀疏)矩阵. 对灰度图像而言,A 可以是 m×n. 对索引图像而言,A 可以是 m×n.指定 map 输入参数中的相关颜色图. 对真彩色图像而言,A 必须 ...

  10. C语言实现将彩色bmp图像转化为灰图、灰度图像反色

    彩色图像转灰度图像 彩色(24位)bmp图像结构: typedef struct{bitmapFileHeader bfHeader;bitmapInfoHeader biHeader;unsigne ...

最新文章

  1. 【知乎热议】算法岗平时需要自己写cuda吗?
  2. 宇宙飞行器的几种飞行原理设计
  3. 计算机未识别网络什么意思,win7 64位系统提示当前连接到未识别的网络怎么办...
  4. html 使用ajax php函数吗,php – 为什么用AJAX加载html后jQuery更改函数不起作用?
  5. openfoam安装中出现allmake error_如何更新OpenFOAM的版本?
  6. 第二阶段冲刺10天 第六天
  7. python自动部署环境_在 CentOS 上初始化 Python 环境的自动部署脚本
  8. LINUX 学习笔记 账号与群组的管理
  9. TensorFlow Attention
  10. 2022年四方系统/四方支付系统部署实战,以及细节讨论,Gitee版本
  11. .npy文件打开方式
  12. javassist修炼笔记
  13. STM32 硬件I2C读写AT24C02/08
  14. BAT等大厂年薪30W+面试清单:JVM\MySQL\设计模式\分布式\微服务
  15. 琐事记 - 2015/10/28
  16. 代码跳转路由报错_vue路由报错Navigating to current location (/login) is not allowed踩坑总结...
  17. 基于MATLAB的图片中字符的分割与识别
  18. ipone6界面设计标准
  19. python好用的编程工具
  20. 谈一谈Java中的“静态”

热门文章

  1. 可信执行环境(TEE)介绍 与应用
  2. c语言报错(三)break statement not within loop or switch
  3. JVM的前世今生及未来盘点
  4. 关于百度地图 key 的问题
  5. 海量数据解决思路之Hash算法
  6. 世界遗产_准备离开数字遗产的指南
  7. Hololens场景加载报错问题
  8. 深度学习实战56-基于VR虚拟现实眼镜与计算机视觉远程操控机器人,实现远程协助独居老人生活起居
  9. Codevs 1106 篝火晚会
  10. Python爬虫之批量获取壁纸