资源描述
ROBOT VISION - Home Work #3
Date: 2012/9/15 Due:2012/9/24
一、 Wavelet影像处理 - 以peppers.png为处理对象。
1. 利用matlab的现成指令将此图进行one level 与two levels 的小波变换,并将对应的小波系数整合成下面的方式呈现。
注意:two levels时第二层的系数cA2, cH2, cV2, cD2堆叠要先形成cA1(对应于one level时的cA1),叠起后的大小可能大cH1,cV1,cD1(因为pixels/2近似造成),要先将cA1的大小调回cH1的大小,再形成最后的图像矩阵。
One Level Two Levels
2. 针对one level的小波变换系数,请拿掉最高频的cD1系数(即以零矩阵取代),透过inverse小波变换形成新的图像,试问与原图间的PSNR差多少?
答:Matlab代码如下所示:
%%%%%%%%%%%%%%% 第一小题 %%%%%%%%%%%%%%%
% 清空所有数据,图表,并且清屏
clear all;
close all;
clc;
% 读取图像对应的矩阵并转化成灰度图
x0=imread('peppers.png');
x=rgb2gray(x0);
nbcol=255;
% 进行一阶小波变换
[cA1,cH1,cV1,cD1]=dwt2(x,'db1');
% 对小波变换的结果进行伪彩色编码
cod_x=wcodemat(x,nbcol);
cod_cA1=wcodemat(cA1,nbcol);
cod_cH1=wcodemat(cH1,nbcol);
cod_cV1=wcodemat(cV1,nbcol);
cod_cD1=wcodemat(cD1,nbcol);
% 小波变换生成的四个图像结合成一个大图像
dec2d=[cod_cA1 cod_cH1;cod_cV1 cod_cD1 ];
% 显示一阶小波变换的结果
figure
colormap(gray);
imagesc(dec2d);title('Single-level Wavelet');
% 进行二阶小波变换,并且从中提取出一阶和二阶A,H,V,D分量
[C,S]=wavedec2(x,2,'db1');
lv2_size=S(1,1)*S(1,2);
lv1_size=S(3,1)*S(3,2);
cA2=reshape(C(1:lv2_size),S(1,1),S(1,2));
cH2=reshape(C((1+lv2_size):2*lv2_size),S(1,1),S(1,2));
cV2=reshape(C((1+2*lv2_size):3*lv2_size),S(1,1),S(1,2));
cD2=reshape(C((1+3*lv2_size):4*lv2_size),S(1,1),S(1,2));
lv2_cH1=reshape(C((1+4*lv2_size):(lv1_size+4*lv2_size)),...
S(3,1),S(3,2));
lv2_cV1=reshape(C((1+lv1_size+4*lv2_size):...
(2*lv1_size+4*lv2_size)),S(3,1),S(3,2));
lv2_cD1=reshape(C((1+2*lv1_size+4*lv2_size):...
(3*lv1_size+4*lv2_size)),S(3,1),S(3,2));
% 对小波变换的结果进行伪彩色编码
cod_cA2=wcodemat(cA2,nbcol);
cod_cH2=wcodemat(cH2,nbcol);
cod_cV2=wcodemat(cV2,nbcol);
cod_cD2=wcodemat(cD2,nbcol);
cod_lv2_cH1=wcodemat(lv2_cH1,nbcol);
cod_lv2_cV1=wcodemat(lv2_cV1,nbcol);
cod_lv2_cD1=wcodemat(lv2_cD1,nbcol);
% 小波变换生成的图像分量结合成一个大图像
dec2d_2=[[cod_cA2,cod_cH2;cod_cV2,cod_cD2],cod_lv2_cH1;...
cod_lv2_cV1,cod_lv2_cD1];
% 显示一阶小波变换的结果
figure
colormap(gray);
imagesc(dec2d_2);title('2-level Wavelet');
%%%%%%%%%%%%%%% 第二小题 %%%%%%%%%%%%%%%
% 消掉高频分量并进行逆小波变换
[M,N]=size(cD1);
y=idwt2(cA1,cH1,cV1,zeros(M,N),'db1');
% 画出逆小波变换后的结果
figure;
colormap(gray);
imagesc(y);title('Inverse Wavelet');
% 计算信噪比(调用了老师写的psnr.m函数)
xy_psnr=psnr(x,y);
disp(['The psnr between image x and y is ' num2str(xy_psnr)]);
%%%%%%%%%%%%%%%%%%%% Function: psnr.m %%%%%%%%%%%%%%%%%%%%%%
%PSNR calculate the PSNR between two gray images.
% PSNR = psnr(f1,f2)
% f1, f2 are two input images
function PSNR = psnr(f1, f2)
bits=8;
if numel(size(f1))>2
[m1,n1,s1]=size(f1);
f1=rgb2gray(f1);
else
[m1,n1]=size(f1);
end
if numel(size(f2))>2
[m2,n2,s2]=size(f2);
f2=rgb2gray(f2);
else
[m2,n2]=size(f2);
end
if m2~=m1 ||n2~=n1
error('Error!!!');
end
L = 2.^bits - 1;
a = L.^2;
e = double(f1) - double(f2);
MSE = sum(sum(e.^2));
PSNR = 10*log10(m1*n1*a/MSE);
画出的图像如下所示:
一阶小波变换结果:
二阶小波变换结果:
二、 Wooden cube影像处理分析 – 以Wooden Gripper 3.png为处理对象。
1. 尝试将不同的filter和threshold的上下界范围搭配,以凸显中间的cube。
2. 进一步,筛选上述cube的边界出来.
答:本文采用Gabor Filter,之后尝试不同的Threshold上下界范围。再确定上下界的过程中,先随机产生多对上下界,生成对应的图像,从中挑选出能够凸显中间Cube的上下界,将符合条件的上下界做平均化处理,得到最终上下界(147,241)
Matlab代码如下所示:
% 清空所有数据,图表,并且清屏
clear all;
close all;
clc;
% 读取图像对应的矩阵并转化成灰度图
img0=imread('Wooden Gripper 3.png');
img=rgb2gray(img0);
% 建立Gabor示波器模型
phi=pi/2;
theta=2;
sigma=0.65*theta;
filterSize=6;
G=zeros(filterSize);
for i=(0:filterSize-1)/filterSize
for j=(0:filterSize-1)/filterSize
xprime=j*cos(phi);
yprime=i*sin(phi);
K=exp(2*pi*theta*sqrt(-1)*(xprime+yprime)); G(round((i+1)*filterSize),round((j+1)*filterSize))=...
exp(-(i^2+j^2)/(sigma^2))*K;
end
end
% 显示经过滤波之后的图像
J=uint8(abs(conv2(double(img),G)));
figure;imshow(J);
%
% 随机产生Threshold上下界,多次执行,
% 选取出能凸显中间的cube的多组上下界,
% 在进行平均处理,得到一对上下界(147,241)
%
sum=0;
for i=randi([100,200],1,3)
for j=randi([150,255],1,3)
if j<=i
continue;
end
sum=sum+1;
K=threshold(J,i,j);
subplot(3,3,sum);imshow(255*K);title(num2str([i,j]));
end
end
% 显示经过Threshold处理之后的图像
K=threshold(J,147,241);
figure;imshow(255*K);
%%%%%%%%%%%%%%%% Function:threshold.m %%%%%%%%%%%%%%%%%%%
function out=threshold(in,lobo,upbo)
a1=real(in)>=lobo;
a2=real(in)<=upbo;
out=and(a1,a2);
end
生成的图像如下所示:
经过Gabor Filter处理后的图像:
再经过Threshold(147,241)之后的图像:
展开阅读全文