MATLAB入门级演示

实在是不想贴出来,因为实在是真的太简单了,但是文档了删了又白白浪费了自己的时间,左思右想还是贴出来算了。

1、Matlab图像常用函数:

查看一个函数的三种方式:doc / help / edit ayuhz

空间滤波:

代码:
clear,clc;
 
Img = imread('./T002.bmp');
% figure(1); imshow(Img);
% 1. 直方图处理
% imhist(Img);
% 2. 对图像的标示
% xlabel('x轴');
% ylabel('y轴');
% title('直方图');
% text(20,100,'图像每个灰度对应点数');
% 3. 得到直方图的定点的连线。
% h = imhist(Img);
% x = 0:255;
% y = 1:1000;
% plot(h);
% plot(x,h,'--^');
% axis([0 255 0 400]);
% Hp = plot(h);
% set(Hp,'Color','black'); % green/red/blue/white/black
% 4. plotyy
% x = 0:0.01:20;
% y1 = 200*exp(-0.05*x).*sin(x);
% y2 = 0.8*exp(-0.5*x).*sin(10*x);
% figure                % new figure
% [HA,HLine1,HLine2] = plotyy(x,y1,x,y2);
% 
% title('Multiple Decay Rates')
% xlabel('Time (\musec)')
% 
% ylabel(HA(1),'Slow Decay') % left y-axis
% ylabel(HA(2),'Fast Decay') % right y-axis
% set(HLine2,'Color','black');
% set(HLine1,'Color','green');
% 5. 直方图均衡化:histeq
% figure;
% J = histeq(Img,64);
% subplot(1,2,1); imshow(Img); title('原图');
% subplot(122) ;  imshow(J);   title('直方图均衡化');
 
% 6、空间滤波
% 6.1 线性滤波: 基于乘积和,一种算数运算(均值)
%  prewitt/sobel/laplacian/gaussian/average
% H = fspecial('prewitt');    % 产生滤波掩膜
% g = imfilter(Img,H,'corr','replicate','full'); % 线性空间滤波
% figure;
% subplot(121); imshow(Img); title('原图');
% subplot(122); imshow(g);   title('滤波后');
 
% 6.2 非线性滤波:基于非线性操作结果,输出于输入之间是一种逻辑关系
% 中值
% I = imread('tire.tif');
% re1 = medfilt2(Img,[3,3],'symmetric');
% figure(1)
% subplot(1,2,1), imshow(Img), title('Original Image')
% subplot(1,2,2), imshow(re1), title('Filtered Image')

% 实践:中值滤波
re2 = medianfilt2(Img,3);
figure(2)
subplot(1,2,1), imshow(Img), title('Original Image');
subplot(1,2,2), imshow(re2,[]), title('Filtered Image');%将imshow(re,[]);实现问题处理
function re = medianfilt2(I,n)
%% 中值滤波
[r,c] = size(I);
t = floor(n/2);% fix/floor/ceil/round
% 扩展
nTemp = zeros(r+2,c+2);
nTemp(2:r+1,2:c+1)=I;
nTemp(1,:) = nTemp(2,:); nTemp(r+2,:) = nTemp(r+1,:);
nTemp(:,1) = nTemp(:,2); nTemp(:,c+2) = nTemp(:,c+1);
 
re = zeros(r,c);
mask = ones(n,n);
temp = zeros(n,n);
for i = 1+t : r+2-t
    for j = 1+t : c+2-t
        temp = nTemp(i-t:i+t, j-t:j+t); 
        re(i-t,j-t) = sum(sum( temp .* mask))/(n * n);
    end
end
% 对行边界 采用symmetric
% for i = 1:r
%     re(i,1) = 
%     re(i,c) = I(i,c-1);
% end
% % 对列扩展
% for j = 1:c
%     re(1,j) = I(2,j);
%     re(r,j) = I(r-1,j);
% end
 
re = uint8(re);
end

为什么取对数:

因为进行了傅氏变换以后图像上每点的值都成了复数,取abs(即取模值)后才能显示为图像。但是问题是进行变换再取模值后数字有时会变得非常大,拿常用的数据类型uint8(即8位无符号整型数)为例,所能表示的范围仅为0~255,如果数据超过255,在显示图像时系统自动把数据变成255,所以如果有很多数据都超过255,即使这些数据之间差别也蛮大,傅立叶变换显示的图像只会白茫茫一片(255代表白色),看不出差异来。所以需要对这些数据进行处理,常用的就是取对数(log),将很大的数据变成小一些的数据,落在0~255之间,能够准确地表示在图像上,更直观地发现数据之间的差异,也是进行傅氏变换的意义所在,区分高频分量和低频分量。

% 1 读取一张BMP图像
I = imread('T001.bmp');
% 2 显示幅度谱
% f  = fft2( double(I) );
% ff = fftshift(f);
% f_range = abs( ff );   % 幅度谱
% f_angle = angle( ff ); % 相位谱
% I2 =  uint8(f_range);  % 幅度谱
% I3 =  uint8(f_angle);  % 相位谱
% 
% figure(1);
% subplot(131); imshow(I,[]);      title('original Image');
% subplot(132); imshow(I2,[]);     title('幅度谱');
% subplot(133); imshow(I3,[]);     title('相位谱');
% 
% margin = log(f_range);           %像幅度谱,加log便于显示
% phase =  log(f_angle*180/pi);    %转化为弧度角度
% figure(2);
% subplot(131); imshow(I,[]);       title('original Image');
% subplot(132); imshow(margin,[]);  title('幅度谱');
% subplot(133); imshow(phase,[]);   title('相位谱');
 
% 重构原图
% clear,clc;
% x = imread('T001.bmp');
% 
% z = fft2( double(x) );
% zf1 = abs(z);
% zf2  =angle(z);
% 
% PicNew = zf1.*cos(zf2) + zf1.*sin(zf2).*i;
% 
% PicNew = abs(ifft2(PicNew));
% PicNew = uint8(PicNew);
% 
% figure(3);
% subplot(1,2,1); imshow(x);      title('原始图像');
% subplot(1,2,2); imshow(PicNew); title('重构图像');
 
% 3 频域低通滤波
% clear,clc;
% I=imread('T001.bmp');
% figure;
% subplot(2, 2, 1); imshow(I); title('原图像');
% J1 = imnoise(I, 'salt & pepper');   % 叠加椒盐噪声
% subplot(2, 2, 2); imshow(J1); title('加噪声图像');
% g = fft2(double(J1));        % 傅立叶变换
% g = fftshift(g);             % 转换数据矩阵
% [M, N]=size(g);
% nn = 2;                      % 二阶巴特沃斯(Butterworth)低通滤波器
% d0 = 20;                     % 截止频率
% m = fix(M/2);                % 中心频率点x
% n = fix(N/2);                % 中心频率点y
% c = 0.414;                   % 锐度系数
% for i = 1:M
%     for j = 1:N
%         d = sqrt((i-m)^2+(j-n)^2);
%         h = 1/(1 + c*(d/d0)^(2*nn));   % 计算低通滤波器传递函数
%         result(i,j) = h*g(i,j);
%         T(i, j) = h;
%     end
% end
% result = ifftshift(result);
% J2 = ifft2(result);
% J3 = uint8(real(J2));
% subplot(2, 2, 3); mesh(T); title('滤波器示意图')
% box on;          % 坐标系右边和上边加边框
% % 显示滤波处理后的图像
% subplot(2, 2, 4); imshow(J3,[]); title('滤波结果') 
 
% 4 相位谱互换
clear,clc;
x = imread('T001.bmp');
y = imread('T002.bmp');
 
% 傅里叶变换
xf = fft2( double(x) );
yf = fft2( double(y) );
% 取幅度和相位
x_abs = abs( xf );
x_angle = angle( xf );
 
y_abs = abs( yf );
y_angle = angle( yf );
 
% 重构
z1 = y_abs.*cos(x_angle) + y_abs.*sin(x_angle).*i; % 得到的图像:相位是x的,幅度是中和的。
 
% 傅里叶逆变换
z1 = abs(ifft2(z1));
z = uint8(z1);
 
% 显示幅度谱和相位谱图像
figure(1);
subplot(1,3,1); imshow(x); title('x原图');
subplot(1,3,2); imshow(y); title('y原图');
subplot(1,3,3); imshow(z); title('x相位谱+y幅度谱');
发布了91 篇原创文章 · 获赞 75 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/fengxianghui01/article/details/104318723