实验三 数字图像的基本运算2
实验目的:
1.利用matlab进行处理图像;
2.掌握常用的数字图像基本运算方法
3.掌握常用的几何运算,如平移,旋转,缩放等操作。
实验内容:
- 图像的平移:
(1)编写用于图像移动的函数move,如果超出显示区域,则裁剪;
(2)调用函数move,实现对原图像的平移。
请将实验代码贴在此处: |
I=imread('lena.jpg'); J_1=move(I,50,50); J_2=move(I,50,-50); figure; subplot(221);imshow(J_1); subplot(222);imshow(J_2); |
请将运行结果贴在此处: |
![]() |
- 自己编写函数,实现图像的转置和镜像;
请将实验代码贴在此处: |
1.: function J = trace(I) [M,N,G] = size(I); I = im2double(I); J=ones(M,N,G); for i=1:M for j=1:N J(i,j,:)=I(j,i,:); end end 2. function J = mirror_updown(I) [M,N,G] = size(I); I = im2double(I); J=ones(M,N,G); for i = 1:M; for j = 1:N; J(i,j) = I(M-i+1,j); end end 3.: function J = mirror_leftright(I) [M,N,G] = size(I); I = im2double(I); J=ones(M,N,G); for i = 1:M; for j = 1:N; J(i,j) = I(i,N-j+1); %½«ÔʼͼÏñÏñËØ»Ò¶ÈÖµÍê³É´¹Ö±¶Ôµ÷ end end %%ͼƬ¾µÏñ 运行程序: close all; clear all; clc; I=imread('lena.jpg'); J=trace(I); figure; subplot(211);imshow(I); subplot(212);imshow(J); I=imread('lena.jpg'); J_1=mirror_updown(I); J_2=mirror_leftright(I); figure; subplot(131);imshow(I); subplot(132);imshow(J_1); subplot(133);imshow(J_2); |
请将运行结果贴在此处: |
![]()
![]() |
- 编程实现图像的旋转和缩放。
- 实现缩放:可以使用函数imresize实现图像的缩放;
- 使用函数imtransform进行图像的旋转;在使用imtransform之前,需要用maketform函数定义变换参数,该函数会返回一个N维的仿射变换参数结构体,其调用格式如下:
T= maketform('affine', A);其中A为(N+1)*(N+1)或(N+1)*N的矩阵。
Imtransform的调用格式如下:
B=imtransform(A,T),B为变换后的图像,A为输入图像,T为用maketform函数定义的变换参数结构体;
事实上,imtransform可以做前面提到的所有几何变换。
请将实验代码贴在此处: |
%%ͼÏñËõ·Å close all;clear all;clc; I=imread('lena.jpg'); J_1=imresize(I,0.5); J_2=imresize(I,1.5); figure; subplot(131);imshow(I);title('Ôͼ'); subplot(132);imshow(J_1);title('ËõС0.5±¶'); subplot(133);imshow(J_2);title('·Å´ó1.5±¶'); %%ͼÏñÐýת close all;clear all;clc; I=imread('lena.jpg'); I=im2double(I); A=[cosd(30),-sind(30),0; sind(30),cosd(30),0;0,0,1];%ÄæÊ±ÕëÐýת30¶È T=maketform('affine', A); B=imtransform(I,T); figure; subplot(121);imshow(I);title('Ôͼ'); subplot(122);imshow(B);title('ÄæÊ±ÕëÐýת30¶ÈºóµÄͼÏñ'); |
请将运行结果贴在此处: |
![]() ![]() |
- 利用函数imhist去观察图像的直方图,把给出的四幅图像(‘test1.jpg’-’test4.jpg’)的直方图显示在窗口中,并分析图像的直方图分布特征与对比度的关系。
请将实验代码贴在此处: |
I_1=imread('test1.jpg'); I_2=imread('test2.jpg'); I_3=imread('test3.jpg'); I_4=imread('test4.jpg'); I_1=rgb2gray(I_1); I_2=rgb2gray(I_2); I_3=rgb2gray(I_3); I_4=rgb2gray(I_4); figure; subplot(221);imhist(I_1);title('test1.jpg'); subplot(222);imhist(I_2);title('test2.jpg'); subplot(223);imhist(I_3);title('test3.jpg'); subplot(224);imhist(I_4);title('test4.jpg'); |
请将运行结果贴在此处: |
![]() |
5 实现最近邻插值和双线性插值算法。对‘lena.jpg’进行放大,采用两种插值方式,把结果显示在一个窗口中。
请将实验代码贴在此处: |
img = imread('lena.jpg'); imshow(img); title('original image'); [rows, cols, channels] = size(img); newRows=300; newCols=300; newImg=uint8(zeros(newRows, newCols, channels)); rowScale=rows/newRows; colScale=cols/newCols; for channel = i:channels for i = 1:newRows for j = 1:newCols x=i*rowScale; y=j*colScale;
x1=floor(x); x2=ceil(x); y1=floor(y); y2=ceil(y);
x1=max(x1,1); x2=min(x2,rows); y1=max(y1,1); y2=min(y2,cols);
fa=double(img(x1,y1,channel))*(x2-x)+double(img(x2,y1,channel))*(x-x1); fb=double(img(x1,y2,channel))*(x2-x)+double(img(x2,y2,channel))*(x-x1); pixelValue=fa*(y2-y)+fb*(y-y1); newImg(i,j,channel)=pixelValue/(x2-x1)*(y2-y1); end end end figure; imshow(newImg); title('Resize Image by Bilinear Interpolation'); img = imread('lena.jpg'); [rows, cols, channels] = size(img); newRows=300; newCols=300; newImg=uint8(zeros(newRows, newCols, channels)); rowScale=rows/newRows; colScale=cols/newCols; for channel = i:channels for i = 1:newRows for j = 1:newCols x=round(i*rowScale); y=round(j*colScale); x=min(max(x,1),rows); y=min(max(y,1),cols); newImg(i,j,channel)=img(x,y,channel); end end end figure; imshow(newImg); title('Resize Image by Nearest Neighbor Interpolation'); |
请将运行结果贴在此处: |
![]() |