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

这篇具有很好参考价值的文章主要介绍了数字图像处理 matlab图像的几何运算 实验三 旋转 缩放 裁剪 镜像变换 平移。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图像的几何运算

原图:
数字图像处理 matlab图像的几何运算 实验三 旋转 缩放 裁剪 镜像变换 平移
读取原图(这里我的图片名字是atm.png):

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

1. 旋转 (imrotate)

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

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

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

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

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

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

这里我设函数名为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:color
    for i = 1:height2
        for j = 1:width2
            p=[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);
            end
        end
    end
end
%显示图像
figure;
imshow(J);

代码:

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

运行结果:

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

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:color
    for i = 1:height2
        for j = 1:width2
            p=[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);
            end
        end
    end
end

%显示图像
figure;
imshow(J);

代码:

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

运行结果:

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

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)<=0
    return
end
% 新的图层
height2=h(2)-h(1);
width2=w(2)-w(1);

%初始化目标画布
J=uint8(ones(height2,width2,3)*128);
for k = 1:color
    for i = 1:height2
        for j = 1:width2
            pp=[i+h(1);j+w(1)];
            J(i,j,k)=I(pp(1),pp(2),k);
        end
    end
end

%显示图像
figure;
imshow(J);

代码:

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

运行结果:
数字图像处理 matlab图像的几何运算 实验三 旋转 缩放 裁剪 镜像变换 平移

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:color
        for i = 1:height
            for j = 1:width
                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);
            end
            end
        end
    end
elseif a==2 % 垂直
    for k = 1:color
        for i = 1:height
            for j = 1:width
            p=[i;j];%遍历新图像像素点
            J(height-i+1,j,k)=I(p(1),p(2),k);
            end
        end
    end
elseif a==3 % 对角
    for k = 1:color
        for i = 1:height
            for j = 1:width
            p=[i;j];%遍历新图像像素点
            J(height-i+1,width-j+1,k)=I(p(1),p(2),k);
            end
        end
    end
else
    disp('你的输入错误');
    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('对角变换');

运行结果:

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

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:color
    for i = 1:height
        for j = 1:width
            p=[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);
            end
        end
    end
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图像的几何运算 实验三 旋转 缩放 裁剪 镜像变换 平移


数字图像处理 matlab图像的几何运算 实验三 旋转 缩放 裁剪 镜像变换 平移
创作不易,如果对你有帮助,求求你给我个赞!!!
点赞 + 收藏 + 关注!!!
如有错误与建议,望告知!!!(将于下篇文章更正)
请多多关注我!!!谢谢!!!
文章来源地址https://www.toymoban.com/news/detail-465366.html

到了这里,关于数字图像处理 matlab图像的几何运算 实验三 旋转 缩放 裁剪 镜像变换 平移的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数字图像处理】实验二 图像增强(MATLAB实现)

    目录 一、实验意义及目的 二、实验内容 三、Matlab 相关函数介绍 四、算法原理 五、参考代码及扩展代码流程图  (1)参考代码流程图 (2)扩展代码流程图 六、参考代码 七、实验要求 (1)对以上处理变换参数,查看处理效果; (2)更改伪彩色增强方法为热金属编码或彩

    2023年04月12日
    浏览(86)
  • 【数字图像处理】实验(2)——图像增强(MATLAB实现)

    (1)进一步掌握图像处理工具Matlab,熟悉基于Matlab的图像处理函数。 (2)掌握各种图像增强方法。 1.打开一幅彩色图像Image1,使用Matlab图像处理函数,对其进行下列变换: (1)将Image1灰度化为gray,统计并显示其灰度直方图; (2)对gray进行分段线性变换; (3)对gray进行

    2023年04月23日
    浏览(57)
  • 数字图像处理之matlab实验(五):形态学图像处理

    常见的形态学处理包括腐蚀、膨胀、开运算、闭运算。不同的操作有不同的作用,同样的操作在不同类型的图片上也有不同效果,具体效果如下表格所示。要求熟练掌握对二值图像的形态学处理。 不同操作对不同类型图像处理效果 一、对二值图像进行处理 1、结构元素 在开

    2024年02月04日
    浏览(65)
  • (数字图像处理MATLAB+Python)第九章图像形态学运算-第三节:二值图像的形态学处理

    形态滤波 :是一种在数字图像处理中常用的图像处理技术,用于改善图像的质量、提取图像的特定特征或去除图像中的噪声。形态滤波主要基于形态学运算,通过结构元素(也称为模板)对图像进行局部区域的操作,从而改变图像的形状和结构。选择不同形状(如各向同性的

    2024年02月08日
    浏览(67)
  • 【数字图像处理】实验(3)——图像综合应用:皮肤美化(MATLAB实现)

    (1)了解和掌握图像处理工具 Matlab ,熟悉基于 Matlab 的图像处理函数,并为下一步编程进行图像处理打下基础。 (2)理解色彩的概念,掌握图像代数运算,几何变换方法。 1.灰度线性变换就是将图像中所有点的灰度按照线性灰度变换函数进行变换。 2.直方图均衡化通过点运

    2024年02月05日
    浏览(53)
  • 数字图像处理---低高通滤波实验(MATLAB实现)

    1. 了解图像傅里叶变换的意义和手段; 2. 熟悉理想低通滤波器、巴特沃斯低通滤波器、高斯低通滤波器的基本原理和性质; 3. 熟悉理想高通滤波器、巴特沃斯高通滤波器、高斯高通滤波器的基本原理和性质; 4. 掌握MATLAB编程实现数字图像的低高通滤波器的变换,并分析各参

    2024年02月05日
    浏览(41)
  • MATLAB【数字图像处理】 实验一:图像处理基本操作(平移、放大、缩小、旋转、插值)

    1、熟悉并掌握MATLAB工具的使用;  2、实现图像的读取、显示、存储、平移、镜像、放大、缩小及旋转操作; 3、掌握常用的插值方法,并了解其优缺点。 Matlab 2020B 1、读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分别显示RGB图像和灰度图像,注上文字标

    2024年02月06日
    浏览(50)
  • 数字图像处理之matlab实验(三):空间滤波器

    空间滤波,就是在原图像上,用一个固定尺寸的模板去做卷积运算,得到的新图像就是滤波结果。滤波,就是过滤某种信号的意思。过滤哪种信号取决于模板设计,如果是锐化模板,处理后就保留高频信号,如果是平滑模板,处理后就保留低频信号。 (1)模板运算 图像处理

    2024年04月28日
    浏览(51)
  • 数字图像处理:亮度对比度-几何变换-噪声处理

    亮度与对比度转换 图像变换可分为以下两种: 点算子:基于像素变换,在这一类图像变换中,仅仅根据输入像素值计算相应的输出像素值 邻域算子:基于图像区域进行变换 两种常用的点算子是用常数对点的像素值进行乘法或加法运算,可以表示为: g ( i , j ) = α ∗ f ( i ,

    2024年02月10日
    浏览(61)
  • MATLAB图像处理之几何变换——平移与旋转

    可以发现,原图在原坐标基础上向X、Y方向分别平移了50和100个单位。但相应平移的部分也被遮挡了,显然这不符合一些场景的应用需求。 为此,MATLAB还提供了参数设置。在imtranslate函数中设置’OutputView’参数为’full’,即可防止遮挡平移的图像,如下图所示。 MATLAB在进行图

    2024年02月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包