实验一、计算图象统计参数及直方图变换
一、实训目的
1. 读取图像(文件名为‘cameraman.tif’);
2. 最大值、最小值、均值
3. 直方图(要求不能调用imhist函数,只能用该函数来验证自编直方图程序块的正确性)。
4. 计算并分析图像直方图(imhist)
5. 利用直接灰度变换法对图像进行灰度变换(imadjust)
6. 直方图均衡化处理及显示(histeq)
二、实训环境配置
把要读取的图片放入MATLAB的根目录bin中
三、实训内容
1.读取图像(文件名为‘cameraman.tif’);
1)在命令窗口输入f = imread('cameraman.tif')
2)显示图像
在命令窗口输入imshow(f)
2.最大值、最小值、均值
3.直方图(要求不能调用imhist函数,只能用该函数来验证自编直方图程序块的正确性)。
在刚刚的基础上继续写
[m,n]=size(f);
for row=1:m
for col=1:n
i=f(row,col);
H(i+1)=H(i+1)+1;% 0对应H(1)
end
end
figure,bar(0:255,H);
得到的图是
然后用imhist出的图是
h=imhist(f);
figure,bar(0:255,h)
验证结果正确
4.利用直接灰度变换法对图像进行灰度变换(imadjust)
输入
dh=imadjust(f,[0 1],[0 1],2)
imshow(hd);
显示的图像为
灰度变换后的直方图是
5.直方图均衡化处理及显示(histeq)
输入
jh=histeq(dh)
Imshow(jh)
得到图像
均衡化后的直方图
6 程序
f=imread('cameraman.tif');
max=max(f(:));
min=min(f(:));
mean=mean(f(:));
h=zeros(1,256);[m,n]=size(f);
for row=1:m
for col=1:n
i=f(row,col);
h(i+1)=h(i+1)+1;
end
end
figure,bar(0:255,h);
h=imhist(f);
figure,bar(0:255,h);
dh=imadjust(f,[0 1],[0 1],2);
figure,bar(0:255,dh);
imshow(dh);
imhist(dh);
jh=histeq(dh);
figure,bar(0:255,jh);
imshow(jh);
实验二 傅里叶变换及空间域和频率域滤波
一、实训目的
1、利用 MATLAB 实现数字图像的傅里叶变换
读入并显示图“test1.tif”,作该图的二维 FFT 变换 F,将其直流分量移到频谱中心 F1(fftshift()函数),计算其实部 RR、虚部 II,用两种方法计算幅值 A1=abs(F1)和 A2=sqrt(RR.^2+II.^2),分别显示 A1 和 A2,并加以比较。
2、近似冲击函数二维傅里叶变换
A=zeros(99,99);
A(49:51,49:51)=1;
作A的二维傅里叶变换 B,将B直流分量移到频谱中心B1,分别用函数imshow和mesh显示A和B1模的对数(log(1+abs(B1)))。
3、空间滤波与频域滤波
将图“test2.tif”分别进行空间与频域滤波。
二、实训环境配置
把要读取的图片放入MATLAB的根目录bin中
三、实训内容
1、利用 MATLAB 实现数字图像的傅里叶变换
读入并显示图“test1.tif”,作该图的二维 FFT 变换 F,将其直流分量移到频谱中心 F1(fftshift()函数),计算其实部 RR、虚部 II,用两种方法计算幅值 A1=abs(F1)和 A2=sqrt(RR.^2+II.^2),分别显示 A1 和 A2,并加以比较。
f=imread('test1.tif');
F=fft2(f);
F1=fftshift(F);
II=imag(F1);
RR=real(F1);
A1=abs(F1);
A2=sqrt(RR.^2+II.^2);
subplot(122);imshow(log(1+A2),[]);title('sqrt(RR.^2+II.^2');
subplot(121);imshow(log(1+A1),[]);title('abs');2.
得到图像
2、近似冲击函数二维傅里叶变换
A=zeros(99,99);
A(49:51,49:51)=1;
作A的二维傅里叶变换 B,将B直流分量移到频谱中心B1,分别用函数imshow和mesh显示A和B1模的对数(log(1+abs(B1)))。
A=zeros(99,99);
A(49:51,49:51)=1;
B=fft2(A);
B1=fftshift(B);
figure,imshow(A);
figure,mesh(A);
figure,mesh(log(1+abs(B1)));
figure,imshow(log(1+abs(B1)));
得到图片
冲击函数
冲击函数频谱表示
冲击函数频谱三维图
冲击函数展示位三维图形
3、空间滤波与频域滤波
将图“test2.tif”分别进行空间与频域滤波。
g=imread('test2.tif');
figure,imshow(g);
G=fft2(g);
w=fspecial('gaussian',9,2);
fi1=imfilter(g,w);
W=freqz2(w,256,256);
W1=ifftshift(W);
Ff=G.*W1;
fi2=real(ifft2(Ff));
figure,imshow(w);
title('w');
figure,mesh(W);
title('W');
title('test2.tif(g)');
figure,imshow(fi1,[]);
figure,imshow(fi2,[]);
得到图像
高斯滤波器w
高斯滤波器W(频谱)
未滤波之前图片
空间滤波之后的图片
频率域滤波之后
四、实训总结
1)对test1.tif”做二维傅里叶变换,得到其频域表达F。取F得实部和虚部计算幅度值,得到上边右图。直接使用abs函数得到幅度值得到左边的图。比较俩图可以看出,结果是一样的。
3)分析可以看出,空间滤波和频率域滤波都使得图片变模糊。但是二者的原理不同。空间域滤波是直接对像素进行操作,而频率域滤波是把图片变换到频率域内,在频率域内做完滤波之后再经反变换得到变换后的图片。在代码中,直接调用了专用函数所以没有看到这些内部细节。
实验三 彩色图像处理
一、实训目的
二、实训环境配置
把要读取的图片放入MATLAB的根目录bin中
三、实训内容
1、 使用 RGB、Indexed和Gray图像间转换函数对图像“strawberries.tif”使用rgb2ind 分别产生8色抖动和非抖动图像;使用rgb2gray实现图像转换,并使用函数dither产生其抖动形式的图像。
第一步:
输入
f=imread('strawberries.tif');
imshow(f);
读取显示图像
2、 第二步:
3、 输入
4、 [x1,map1] = rgb2ind(f,8,"nodither")
5、 imshow(x1,map1)
6、 得到图像抖动处理后的图像
第三步:
输入
[x2,map2] = rgb2ind(f,8,'dither')
imshow(x2,map2)
得到无抖动处理后的图像
2、彩色图像平滑与锐化
a) 对图像“flower.tif”在RGB空间实现彩色图像的平滑(w=ones(25)./(25*25))与锐化(w= [1 1 1 1 1; 1 1 1 1 1; 1 1 -24 1 1 ; 1 1 1 1 1; 1 1 1 1 1];)(函数 imfilter);
第一步:
输入
f=imread('flower.tif');
imshow(f);
读取和显示图像
第二步: 平滑
输入
fr=f(:,:,1)
fg=f(:,:,2)
fb=f(:,:,3)
w=ones(25)./(25*25)
fr_filter=imfilter(fr,w)
fg_filter=imfilter(fg,w)
fb_filter=imfilter(fb,w)
f_filter=cat(3,fr_filter,fg_filter,fb_filter)
得到图像
第三步 锐化:
输入
w1=[1 1 1 1 1;1 1 1 1 1;1 1 -24 1 1;1 1 1 1 1;1 1 1 1 1];
fen_r= imsubtract(fr,imfilter(fr,w1))
fen_g= imsubtract(fg,imfilter(fg,w1))
fen_b= imsubtract(fb,imfilter(fb,w1))
fen=cat(3,fen_r,fen_g,fen_b)
imshow(fen)
得到图像
b) 在HSI空间实现彩色图像的平滑(w=ones(25)./(25*25)),(函数imfilter, rgb2hsi, cat),观察仅平滑亮度分量(intensity)和平滑全部三个分量结果的差别。
第一步:
读取图像显示 写入w
rgb=imread('flower.tif')
hsi=rgb2hsi(rgb)
w=ones(25)./(25*25)
第二步:
自定义rgb2hsi函数
点File/New/Function
输入函数
function [ hsi ] = rgb2hsi( rgb )
rgb=im2double(rgb);
r=rgb(:,:,1);
g=rgb(:,:,2);
b=rgb(:,:,3);
%Implement the conversion equations.
num=0.5*((r-g)+(r-b));
den=sqrt((r-g).^2+(r-b).*(g-b));
theta=acos(num./(den+eps));
H=theta;
H(b>g)=2*pi-H(b>g);
H=H/(2*pi);
num=min(min(r,g),b);
den=r+g+b;
den(den==0)=eps;
S=1-3.*num./den;
H(S==0)=0;
I=(r+g+b)/3;
%Combine all three results into an hsi image.
hsi=cat(3,H,S,I);
end
第三步:
仅平滑亮度分量
i=hsi(:,:,3)
i_filter=imfilter(i,w)
imshow(i_filter)
第四步:
平滑全部三个分量
h=hsi(:,:,1)
s=hsi(:,:,2)
h_filter=imfilter(h,w)
s_filter=imfilter(s,w)
fen=cat(3,h_filter,s_filter,i_filter)
ishow(fen)
得到图像
四、实训总结
第一个题目可以看到抖动处理之后的图像显示出更好的色调,而且轮廓错误明显减少,这是抖动引入的“随机性”的结果。图像有一点点模糊,但明显比后图的可视性高。
实验四 形态学图像处理
一、实训目的
1. 调入并显示图像“Plane2.jpg”;
2. 选取合适的阈值,得到二值化图像Plane2-2.jpg;
3. 设置结构元素;
4. 对得到的二值图像Plane2-2.jpg进行腐蚀运算;
5. 对得到的二值图像Plane2-2.jpg进行膨胀运算;
6. 对得到的二值图像Plane2-2.jpg进行开运算;
7. 对得到的二值图像Plane2-2.jpg进行闭运算;
二、实训环境配置
把要读取的图片放入MATLAB的根目录bin中
三、实训内容
f = imread('Plane2.jpg');
gg=im2bw(f);
imshow(gg);
se=strel('disk',4);
A=imerode(gg,se);
imshow(A);
b=[0 1 0;1 1 1;0 1 0];
B=imdilate(gg,b);
imshow(B);
se = strel('square',4);
o=imopen(gg,se);
imshow(o);
c=imclose(gg,se);
imshow(c);
得到图像
原图像
二值图像
腐蚀后
膨胀后
开运算
闭运算
选作内容:(图片任选,选作1道)
一、实训目的
1. 车牌识别图像预处理技术:
要求:
1) 对原始车牌图像做增强处理;
2) 对增强后的彩色图像进行灰度变换;
3) 对灰度图像进行直方图均衡处理;
4) 选取自适应的阈值,对图像做二值化处理;
5) 显示每步处理后的图像;
6) 分析此种图像预处理的优缺点及改进措施,简要叙述车牌字符识别。
二、实训环境配置
把要读取的图片放入MATLAB的根目录bin中
三、实训内容
i=imread('timg.jpg');
figure,imshow(i);
title('原图');
w1=ones(25)./(25*25);
i1=imfilter(i,w1,'replicate');
figure,imshow(i1);
title('rgb平滑');
g=rgb2gray(i);
figure,imshow(g);
title('灰度');
c=histeq(g); %直方图均衡化
figure,imshow(c);
title('直方图均衡化');
b=im2bw(g);% b是二值图像,不需要求阈值
figure,imshow(b);
title('二值化');
实训总结
我一直想做计算机视觉,想把视觉运用在机器人智能识别和打击上,我通过这次实训,学习了并掌握做视觉用到的最基本的图像处理算法。让我在使用OpenCV的函数上 更加得心应手。