数字图像处理技术与应用练习题
说明:不允许直接使用MATLAB(或者OPENCV等等软件)所带的图像图像
函数,重点考察大家是否理解了各种处理算法,算法可用伪代码描述。算法应较详细。
1、 设一幅大小为M×N的灰度图像I中,灰度为g的像素数为h(g), 0?g?255。
请写出对图像I进行直方图均衡化,得到图像J的计算方法。 clc; clear;
I= imread('a.jpg');
I= rgb2gray(I) ; %将图像转换为灰度图像 J= histeq( I) ; %对I 进行直方图均衡化 subplot( 121) ,imshow(I) ,title('原始图像') ;
subplot (122), imshow(J), title('直方图均衡化后的图像'); figure( 2) ;
subplot( 121) ,imhist(I, 64), title( '原始的直方图'); subplot( 122) , imhist(J,64) ,
title(' 均衡化后的直方图');
2、 设一幅大小为M×N的灰度图像I中,现要变成(放大或缩小)为 P×Q的
图像J,请写出J的生成算法(可以使用近邻插值)。 I=imread('f.jpg');%读入图像 %图像属性 % Filename: 'f.jpg'
% FileModDate: '24-Aug-2008 16:50:30' % FileSize: 20372 % Format: 'jpg' % FormatVersion: '' % Width: 480
% Height: 640 % BitDepth: 8 % ColorType: 'grayscale' % FormatSignature: '' % NumberOfSamples: 1 % CodingMethod: 'Huffman' % CodingProcess: 'Sequential' % Comment: {} [rows,cols]=size(I);
K1 = str2double(inputdlg('请输入行缩放倍数', 'INPUT scale factor', 1, {'0.6'}));%行
默认变为原来的0.6倍
K2 = str2double(inputdlg('请输入列缩放倍数', 'INPUT scale factor', 1, {'0.4'}));%列
默认变为原来的0.4倍
width = K1 * rows; height = K2 * cols;
im2 = uint8(zeros(width,height)); %定义输出图像矩阵 widthScale = rows/width; heightScale = cols/height;
for x = 6:width - 6 %为防止矩阵溢出而选择的参数6 for y = 6:height - 6
oldX = x * widthScale; %oldX,oldY为原坐标,x,y为新坐标 oldY = y * heightScale;
if (oldX/double(uint16(oldX)) == 1.0) & (oldY/double(uint16(oldY)) == 1.0) im2(x,y) = I(int16(oldX),int16(oldY)); else a = double(round(oldX));
b = double(round(oldY)); %若不是整数四舍五入后把临近值赋过去 im2(x,y) = I(a,b); end end end
imshow(I); %输出原图像 figure;
imshow(im2); %输出缩放后图像
3、 设一幅大小为M×N的灰度图像I中,现要将其逆时针旋转 A度,得到图
像J,请写出J的生成算法(可以使用近邻插值)。 clear;%此题是用最近邻域法实现图像旋转 im1=imread('b.jpg'); [m,n,p]=size(im1); % 将图像旋转30度 a=0.5; %a=sin30=0.5 b=0.866; %b=cos30=0.866 row=n*a+m*b; col=n*b+m*a;
for i=1:row %先把图象填充成全黑 for j=1:col
im2(i,j,:)=uint8(0); end end
for i=1:m %把原图象像素点旋转后变为新图象点 for j=1:n
xx=round(abs((i-m/2)*b-(j-n/2)*a+row/2)); yy=round(abs((i-m/2)*a+(j-n/2)*b+col/2)); for k=1:3
im2(xx,yy,k)=im1(i,j,k); end end end
temp1=uint8(0); temp2=uint8(0); temp3=uint8(0);
for i=1:row %把画面上的空点按照最近邻插值法填充 temp1=uint8(0); temp2=uint8(0);