目录

  • 一、实验目的
  • 二、实验环境
  • 三、实验内容
    • 题目
    • 相关知识
    • 部分核心代码
    • 实验结果
    • 分析:两种插值法优缺点
  • 四、实验心得

一、实验目的

1、熟悉并掌握MATLAB工具的使用; 
2、实现图像的读取、显示、存储、平移、镜像、放大、缩小及旋转操作;
3、掌握常用的插值方法,并了解其优缺点。

二、实验环境

Matlab 2020B

三、实验内容

题目

1、读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分别显示RGB图像和灰度图像,注上文字标题,并将结果以文件形式存到磁盘上。
2、对图像执行平移、镜像(水平镜像、垂直镜像)放大、缩小及旋转操作,其中放大、旋转操作分别采用最近邻插值及双线性插值方法实现,要求根据算法自己编写代码实现,并分析两种插值方法的优缺点。

相关知识

在matlab环境中,调用imread()函数可读入图像,默认的存储方式为的矩阵,分RGB三个通道。值类型为uint8,即取值范围为0~255。

rgb2gray()函数将RGB三个通道存储的图像消除色调和饱和度,保留亮度,将RGB图像转为灰度图。
im2bw(I,level)函数基于阈值将图像转化为二值图像。输入图像可以为RGB图像,也可以为灰度图像。level参数为阈值取值范围为0到1之间的小数,将大于阈值的像素点变为白色(1),其他像素点变为黑色(0)。

图像平移时,设某个像素点坐标为(x0,y0)(x_0,y_0)(x0​,y0​),经过平移(tx,ty)(t_x,t_y)(tx​,ty​),达到坐标为(x1,y1)(x_1,y_1)(x1​,y1​)。该关系可记为:{x1=x0+txy1=y0+ty\begin{cases}x_1=x_0+t_x\\y_1=y_0+t_y\end{cases}{x1​=x0​+tx​y1​=y0​+ty​​,用矩阵形式可以记作:(x1y11)=(x0y01)(100010txty1)\begin{pmatrix}x_1&y_1&1\end{pmatrix}=\begin{pmatrix}x_0&y_0&1\end{pmatrix}\begin{pmatrix}1&0&0\\0&1&0\\t_x&t_y&1\end{pmatrix}(x1​​y1​​1​)=(x0​​y0​​1​)⎝⎛​10tx​​01ty​​001​⎠⎞​。在实现时,记图像的高为hhh,宽为www,需要判断x1,y1x_1,y_1x1​,y1​与h,wh,wh,w的大小关系,不能发生下标越界。

图像水平镜像时,记图像宽为www。则原像素点(x0,y0)(x_0,y_0)(x0​,y0​)变为(w−x0,y0)(w-x_0,y_0)(w−x0​,y0​),即:{x1=w−x0y1=y0\begin{cases}x_1=w-x_0\\y_1=y_0\end{cases}{x1​=w−x0​y1​=y0​​。用矩阵形式记作:{x1=x0+txy1=y0+ty\begin{cases}x_1=x_0+t_x\\y_1=y_0+t_y\end{cases}{x1​=x0​+tx​y1​=y0​+ty​​,用矩阵形式可以记作:(x1y11)=(x0y01)(−100010w01)\begin{pmatrix}x_1&y_1&1\end{pmatrix}=\begin{pmatrix}x_0&y_0&1\end{pmatrix}\begin{pmatrix}-1&0&0\\0&1&0\\w&0&1\end{pmatrix}(x1​​y1​​1​)=(x0​​y0​​1​)⎝⎛​−10w​010​001​⎠⎞​。

图像垂直镜像时,记图像高为hhh。则原像素点(x0,y0)(x_0,y_0)(x0​,y0​)变为(x0,h−y0)(x_0,h-y_0)(x0​,h−y0​),即:{x1=x0y1=h−y0\begin{cases}x_1=x_0\\y_1=h-y_0\end{cases}{x1​=x0​y1​=h−y0​​。用矩阵形式记作:(x1y11)=(x0y01)(1000−100h1)\begin{pmatrix}x_1&y_1&1\end{pmatrix}=\begin{pmatrix}x_0&y_0&1\end{pmatrix}\begin{pmatrix}1&0&0\\0&-1&0\\0&h&1\end{pmatrix}(x1​​y1​​1​)=(x0​​y0​​1​)⎝⎛​100​0−1h​001​⎠⎞​。

图像放大分为两个步骤:1.创建新的像素点位。2.给新的像素点位的对应位置赋值。

在使用最近邻插值法时,直接用原图中最近的像素点位给新图赋值。

在使用双线性插值法时,记原图大小m∗nm*nm∗n,新图大小a∗ba*ba∗b,则新图的坐标(x0′,y0′)(x_0',y_0')(x0′​,y0′​)对应原图(x0,y0)=(x0′∗m/a,y0′∗n/b)(x_0,y_0)=(x_0'*m/a,y_0'*n/b)(x0​,y0​)=(x0′​∗m/a,y0′​∗n/b)。找到与(x0,y0)(x_0,y_0)(x0​,y0​)最近的四个整数点位记作(x1,y1),(x1,y2),(x2,y1),(x2,y2)(x_1,y_1),(x_1,y_2),(x_2,y_1),(x_2,y_2)(x1​,y1​),(x1​,y2​),(x2​,y1​),(x2​,y2​),其对应点位上的灰度值记为P11,P12,P21,P22P_{11},P_{12},P_{21},P_{22}P11​,P12​,P21​,P22​。
则(x0′,y0′)(x_0',y_0')(x0′​,y0′​)的灰度值为
y2−y0y2−y1(x2−x0x2−x1P11+x0−x1x2−x1P21)+y0−y1y2−y1(x2−x0x2−x1P12+x0−x1x2−x1P22)\frac{y_2-y_0}{y_2-y_1}(\frac{x_2-x_0}{x_2-x_1}P_{11}+\frac{x_0-x_1}{x_2-x_1}P_{21})+\frac{y_0-y_1}{y_2-y_1}(\frac{x_2-x_0}{x_2-x_1}P_{12}+\frac{x_0-x_1}{x_2-x_1}P_{22})y2​−y1​y2​−y0​​(x2​−x1​x2​−x0​​P11​+x2​−x1​x0​−x1​​P21​)+y2​−y1​y0​−y1​​(x2​−x1​x2​−x0​​P12​+x2​−x1​x0​−x1​​P22​)

在实现时,可能需要去掉边框上的像素点值,以防止下标越界等情况。若(x0,y0)=(x0′∗m/a,y0′∗n/b)(x_0,y_0)=(x_0'*m/a,y_0'*n/b)(x0​,y0​)=(x0′​∗m/a,y0′​∗n/b)为整数,则直接取该点灰度值赋给(x0′,y0′)(x_0',y_0')(x0′​,y0′​)而无需进行双线性插值。

图像缩小算法与放大类似,只要新图像大小a∗ba*ba∗b小于原图像大小m∗nm*nm∗n即可。

在对图像进行旋转时,为了对图像中心进行旋转,需要先把坐标系平移到中心。记原中心点(x′,y′)=(0,0)(x',y')=(0,0)(x′,y′)=(0,0),则变换后的中心点(x,y)(x,y)(x,y)与原中心点关系为(xy1)=(x′y′1)(1000−10−0.5w0.5h1)\begin{pmatrix}x&y&1\end{pmatrix}=\begin{pmatrix}x'&y'&1\end{pmatrix}\begin{pmatrix}1&0&0\\0&-1&0\\-0.5w&0.5h&1\end{pmatrix}(x​y​1​)=(x′​y′​1​)⎝⎛​10−0.5w​0−10.5h​001​⎠⎞​.则旋转分为三个步骤:将x′o′yx'o'yx′o′y变成xoyxoyxoy,将该点顺时针转α\alphaα度,最后将xoyxoyxoy变回x′o′y′x'o'y'x′o′y′。则完整的变换为:
(xy1)=(x′y′1)=(1000−10−0.5wold0.5hold1)(cos⁡α−sin⁡α0sin⁡αcos⁡α0001)(1000−10−0.5wnew0.5hnew1)\begin{pmatrix}x&y&1\end{pmatrix}=\begin{pmatrix}x'&y'&1\end{pmatrix}=\begin{pmatrix}1&0&0\\0&-1&0\\-0.5w_{old}&0.5h_{old}&1\end{pmatrix}\begin{pmatrix}\cos\alpha&-\sin\alpha&0\\\sin\alpha&\cos\alpha&0\\0&0&1\end{pmatrix}\begin{pmatrix}1&0&0\\0&-1&0\\-0.5w_{new}&0.5h_{new}&1\end{pmatrix}(x​y​1​)=(x′​y′​1​)=⎝⎛​10−0.5wold​​0−10.5hold​​001​⎠⎞​⎝⎛​cosαsinα0​−sinαcosα0​001​⎠⎞​⎝⎛​10−0.5wnew​​0−10.5hnew​​001​⎠⎞​
由于前后图像大小不一定相等。所以需要进行插值处理,可以使用上文中提到的两种插值算法。新图像宽为w′=∣cos⁡α∣∗w+∣sin⁡α∣∗hw'=|\cos\alpha|*w+|\sin\alpha|*hw′=∣cosα∣∗w+∣sinα∣∗h。新图像的高为h′=∣sin⁡α∣∗w+∣cos⁡α∣∗hh'=|\sin\alpha|*w+|\cos\alpha|*hh′=∣sinα∣∗w+∣cosα∣∗h

部分核心代码

I_0=imread("test.jpg");
I_1=rgb2gray(I_0);
I_2=im2bw(I_0,0.5);
%figure('P1','P2','P3','P4')
title("实验1-1")
subplot(1,3,1);imshow(I_0);title('原图')
subplot(1,3,2);imshow(I_1);title('灰度图')
subplot(1,3,3);imshow(I_2);title('二值化')
savefig("lab1_1.fig")

完成了读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分别显示RGB图像和灰度图像,注上文字标题,并将结果以文件形式存到磁盘上。

I=imread("test.jpg");
[R,C,color]=size(I);
res=zeros(R,C,color);
for color=1:3for i=1:Rfor j=1:Cnewx=i+60;newy=j+60;if ((newx<=R) && (newy<=C))res(newx,newy,color)=I(i,j,color);endendend
end
imshow(uint8(res))

完成了对图像的平移操作,对图像向右下平移60个像素。对于每个像素点,先平移,再判断下标是否越界,最后将像素点填入。

I=imread("test.jpg");
[R,C,ch]=size(I);
res=zeros(R,C,ch);
for color=1:3for i=1:Rfor j=1:C-1res(i,j,color)=I(i,C-j,color);endend
end
imshow(uint8(res))

完成了对图像的垂直翻转操作。没有使用矩阵运算。

I=imread("test.jpg");
[R,C,ch]=size(I);
res=zeros(R,C,ch);
for color=1:3for i=1:R-1for j=1:Cres(i,j,color)=I(R-i,j,color);endend
end
imshow(uint8(res))

完成了对图像的水平翻转操作。没有使用矩阵运算。

I=imread("test2.jpg");
[h,w,ch]=size(I);
height=1500;
width=1500;
newimg=zeros(height,width);
multh=height/h;
multw=width/w;
for i=1:heightfor j=1:widthfor c=1:3oldi=round(i/multh);oldj=round(j/multw);if (oldi>=1&&oldi<=h&&oldj>=1&&oldj<=w)newimg(i,j,c)=I(oldi,oldj,c);endendend
end
imshow(uint8(newimg))

完成了对图像的放大/缩小操作。使用最近邻插值法。先把新图中的像素点除以放大倍数映射得到其在原图中的位置,将该位置值四舍五入找到最近邻,直接将最近邻的值填入。

I=imread('test2.jpg');
[m,n,ch]=size(I);
width=100;
height=100;
newimg = uint8(zeros(width,height,3));
% 计算放大/缩小倍数
widthScale = m/width;
heightScale = n/height;
for ch=1:3for x = 1:width - 1for y = 1:height - 1 xx = x * widthScale;%新图像位置对应原图像位置 yy = y * heightScale;%新图像位置对应原图像位置 if (xx/double(uint16(xx)) == 1.0) && (yy/double(uint16(yy)) == 1.0)newimg(x,y,ch) = I(int16(xx),int16(yy),ch);%若正好对应到整数点,则直接赋值,不插值else a = double(uint16(xx));%找整数点b = double(uint16(yy));if a==0||b==0||a>=m||b>=n%下标不能越界continue;endx11 = double(I(a,b,ch)); % x11 = I(a,b)x12 = double(I(a,b+1,ch)); % x12 = I(a,b+1)x21 = double(I(a+1,b,ch)); % x21 =I(a+1,b)x22 = double(I(a+1,b+1,ch)); % x22 = I(a+1,b+1)newimg(x,y,ch) = uint8( (b+1-yy) * ((xx-a)*x21 + (a+1-xx)*x11) + (yy-b) * ((xx-a)*x22 +(a+1-xx) * x12));endendend
end
imshow(newimg);

完成了对图像的放大/缩小操作。使用双线性插值法。先把新图中的像素点除以放大倍数映射得到其在原图中的位置,如果是整数则直接填入,如果不是整数则找到与其相邻的四个点,按照上文中的公式进行插值,将该值填入。

I=imread("test2.jpg");
angle=30;
[h,w,d]=size(I);
theta=angle/180*pi;
cos_val = cos(theta);
sin_val = sin(theta);w2=round(abs(cos_val)*w+h*abs(sin_val));
h2=round(abs(cos_val)*h+w*abs(sin_val));
img_rotate  = uint8(zeros(h2,w2,3));    %像素是整数for x=1:w2for y=1:h2x0 = uint32(x*cos_val + y*sin_val -0.5*w2*cos_val-0.5*h2*sin_val+0.5*w);%展开矩阵乘法y0 = uint32(y*cos_val - x*sin_val +0.5*w2*sin_val-0.5*h2*cos_val+0.5*h);%展开矩阵乘法x0=round(x0);         %最近邻y0=round(y0);         %最近邻if x0>=1 && y0>=1&&  x0<=w && y0<=h %检测下标不能越界img_rotate(y,x,:) = I(y0,x0,:);endend
end
imshow(img_rotate)

完成了对图像的旋转操作。对于图像大小会发生变化的情况,使用最近邻插值法处理缩放。同理,按四舍五入方式找到最近邻。

angle=45;
I=imread('test2.jpg');
imshow(I);
[h,w,d]=size(I);
theta=angle/180*pi;
M=[cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1];
leftup=[1 1 1]*M;               %新图左上角
rightup=[1 w 1]*M;               %新图右上角
leftdown=[h 1 1]*M;               %新图左下角
rightdown=[h w 1]*M;               %新图右下角
cos_val = cos(theta);
sin_val = sin(theta);w2=round(abs(cos_val)*w+h*abs(sin_val));%新图宽度
h2=round(abs(cos_val)*h+w*abs(sin_val));%新图高度
img_rotate=uint8(zeros(h2,w2,3));
dy=abs(min([leftup(1) rightup(1) leftdown(1) rightdown(1)]));            %取得y方向的负轴超出的偏移量
dx=abs(min([leftup(2) rightup(2) leftdown(2) rightdown(2)]));            %取得x方向的负轴超出的偏移量for i=1-dy:h2-dyfor j=1-dx:w2-dxpix=[i j 1]/M;                                %用变换后图像的点的坐标去寻找原图像点的坐标,yy=pix(1)-floor(pix(1));xx=pix(2)-floor(pix(2));if pix(1)>=1 && pix(2)>=1 && pix(1) <= h && pix(2) <= wx11=floor(pix(1));        %四个相邻的点y11=floor(pix(2));x12=floor(pix(1));y12=ceil(pix(2));x21=ceil(pix(1));y21=floor(pix(2));x22=ceil(pix(1));y22=ceil(pix(2));value_leftup=(1-xx)*(1-yy);              %计算临近四个点在双线性插值中的权重value_rightup=xx*(1-yy);value_leftdown=(1-xx)*yy;value_rightdown=xx*yy;img_rotate(i+dy,j+dx,:)=value_leftup*I(x11,y11,:)+value_rightup*I(x12,y12,:)+ value_leftdown*I(x21,y21,:)+value_rightdown*I(x22,y22,:);endend
endimshow(uint8(img_rotate))

完成了对图像的旋转操作。对于图像大小会发生变化的情况,使用双线性插值法处理缩放。同理,先找到新图中某点坐标对应原图位置(利用矩阵除法),找到其相邻的四个点位,按照上文中的公式进行插值。

实验结果


对于题目1,完成了对图片的读取、灰度化、二值化操作。还生成了可以被matlab打开的.fig文件。

对于平移,正确地实现了图像的平移,并且对其余部分补上黑色边框。

对于左右镜像翻转,正确地实现了图像的左右镜像翻转。

对于上下镜像翻转,正确地实现了图像的上下镜像翻转。

成功将图像放大,利用最近邻插值。可以看到,放大的结果存在一定的锯齿与马赛克的现象。

成功将图像缩小,利用最近邻插值。

成功将图像放大,利用双线性插值。可以看到,放大的结果比起最近邻插值更为平滑,没有存在严重的锯齿现象。

成功将图像缩小,利用双线性插值。可以看到,利用双线性插值进行缩小时也没有出现失真现象。


利用最近邻插值法与双线性插值法分别对图像进行旋转45°操作,并对其余区域填充为黑色。

分析:两种插值法优缺点

最近邻插值法优点:实现简单,运行速度快。缺点:在放大图像时可能出现锯齿现象,图像中一些曲线的边缘不平滑。在放大后缩小回去还会出现一定的失真现象,使图像看起来变得模糊了,像马赛克。
双线性插值法优点:一定程度上缓解了最近邻插值法缺点出现的情况。放大图像后图像中的一些曲线看起来更平滑,对一张图像反复放大缩小后失真现象不严重,处理效果较好。缺点:处理速度慢,在matlab2020B实验环境中往往需要对一张图像处理约3秒左右。对于图像的最外圈边缘也难以处理。

四、实验心得

MATLAB数字图像处理 实验一:图像处理基本操作(平移、放大、缩小、旋转、插值)相关推荐

  1. matlab数字仿真实验,DVR+备用电源自动投入的MATLAB数字仿真实验仿真实验

    一.动态电压恢复器(DVR)的数字仿真实验 动态电压恢复器(Dynamic Voltage Restorer,DVR)是一种基于电力电子技术的串联补偿装置,通常安装在电源与敏感负荷之间,其作用在于:保 ...

  2. matlab数字信号处理实验报告,数字信号处理实验报告一 离散信号及其MATLAB实验...

    数字信号处理 离散信号及其MATLAB实验 南昌航空大学实验报告 2012 年 04 月 06 日 课程名称: 数字信号处理 实验名称: 离散信号及其MATLAB实现 班级: 090423班 学号: ...

  3. matlab数字信号处理实验报告,【实验设计论文】Matlab的数字信号处理课程实验设计(共3490字)...

    摘要:本文设计了一个基于Matlab的"数字信号处理"课程综合性实验.该实验把"数字信号处理"课程中的许多离散的知识点串接了起来,包括采样.量化.滤波器设计.滤 ...

  4. matlab数字信号处理实验报告,数字信号处理实验报告(Matlab与数字信号处理基础).doc...

    西华大学实验报告(理工类) 开课学院及实验室:电气信息学院 6A-205实验时间 :年月日学 生 姓 名学号成 绩学生所在学院电气信息学院年级/专业/班课 程 名 称数字信号处理课 程 代 码实验项目 ...

  5. matlab取点坐标之前先将图片放大缩小

    等放大好了,摁下键盘就可以取点了. imcoor = []; i = 1; n = 1; %标记点个数 f1 = figure(1); imshow(cali_left); while(i<=n ...

  6. TIT 数字图像处理 原理与实践(MATLAB) 入门教学 实验一 常用的MATLAB图像处理命令与图像基本操作

    文章目录 数字图像处理 原理与实践(MATLAB) 入门教学 实验一 常用的MATLAB图像处理命令与图像基本操作 实验要求 知识点 实验内容 1.读入一幅RGB图像,变换为灰度图像和二值图像,并在同 ...

  7. 数字图像处理——实验一 Python中数字图像处理的基本操作

    数字图像处理--实验一 Python中数字图像处理的基本操作 一.实验目的 二.实验主要仪器设备 三.实验原理 3.1 数字图像的表示和类别 3.2 opencv-python图像文件格式 四.实验内 ...

  8. matlab空域滤波,MATLAB数字图像处理基本操作及空域滤波

    MATLAB数字图像处理基本操作及空域滤波 实验一 MATLAB 数字图像处理基本操作及空域滤波实验目的1.了解有关数字图像处理的基本概念,熟悉Matlab软件中关于数字图像处理的基本命令,掌握利用M ...

  9. 计算机图像处理实验报告四西南大学,计算机图像处理实验报告(数字图像处理基本操作)...

    西南大学 工程技术学院学生实验报告 课程名称: 计算机图像处理 实验名称: 实验一 数字图像处理基本操作 一.实验目的 (1)掌握MATLAB软件的运用,熟练掌握建立.保存.运行.调试m文件的方法. ...

  10. MATLAB 数字图像处理GUI二值图像实验

    电信19-2 翁大弟 摘要 图像信息是人类获取信息的重要来源及利用信息的重要手段,数字图像处理的产生和迅速发展主要受三个因素的影响:一是计算机的发展:二是广泛的农牧业.环境.军事.工业等方面的应用需求 ...

最新文章

  1. javascript扩展插件alook_使用 Kotlin 编写你的第一个 Firefox WebExtension 扩展
  2. 春节前后学习实践的技术领域
  3. LeetCode Wiggle Subsequence(动态规划)
  4. 第二章作业第2题--苏志华
  5. 请求发起过程,在tcp/ip四层网络模型中所做的事情
  6. OpenStack的部署T版(五)——Nova组件
  7. T1串口波特率的计算方法
  8. csharp:Nhibernate Procedure with CreateSQLQuery and GetNamedQuery
  9. 立冬了 广州还是夏天
  10. Spring Bean的实例化时机与ApplicationContext中单例bean的延迟初始化
  11. python基础教程电子版-Python基础教程(第2版 修订版) pdf
  12. 德标螺纹规格对照表_德标DIN934六角螺母,不锈钢六角螺母DIN934
  13. 北京大学计算机系在线编程题库,北京大学acm试题题库及解答 完整版
  14. QT学习第一步 QT下载及安装详细步骤
  15. kubernetes完整二进制部署从0到1
  16. AP6212认证_自适应测试
  17. idea pull从远程库拉取最新代码
  18. 第五章_卷积神经网络(CNN)
  19. [HTTPD] Linux(Apache)Httpd服务器安装,启动及httpd.conf配置详解
  20. Revit-常见问题汇总

热门文章

  1. matlab画图一片空白的问题
  2. maven下载及安装教程(保姆及教程)
  3. 【路径规划】局部路径规划算法——人工势场法(含python实现)
  4. Linux服务器 屏蔽国外IP访问及简单的防CC攻击拦截
  5. [转]防火墙、防病毒网关、IDS以及该类安全产品开发(文章汇总)
  6. Linux驱动之串口驱动配置
  7. LCD12864显示屏原理及使用教程
  8. java子窗口获取父窗口句柄_java获得窗口句柄
  9. DNF自动获取C语言,VC++开发硬件DNF搬砖项目全新发车,想上车的要赶紧
  10. [eclipse error]'Android Dependencies' which does not allow modifications to source attachments on it