目录
一、Matlab 中图像的读取方法
在Matlab中,我们可以使用imread函数来读取图像。以下是读取图像的步骤:
1.需要确保图像文件保存在Matlab的当前工作目录中,或者知道文件的完整路径。
2.通过imread函数,并将图像文件的名称作为输入参数,例如:
img = imread('image.jpg');
这步操作可以读取名为'imagejpg'的图像文件,并将其存储在变量img中。
3用imshow函数来显示图像。例如:imshow(img);
并且,在读取图像之前,需要确保Matlab可以找到该图像文件,并使用正确的文件路径和文件名输入到imread函数中。
本文以“罗中立 父亲.jpg"为例,读入图像代码如下:
close all;
clear all;
clc;
I = imread('罗中立 父亲.jpg');
% I=rgb2gray(I);//将图像转换成灰度图
二、观察图像频域波形
图像的频域看法:
低频成分: 在频域波形的中心通常代表着图像中的低频成分,这些成分对应着图像中的整体结构和轮廓信息。
高频成分: 频域波形的边缘部分通常代表着图像中的高频成分,这些成分对应着图像中的细节和纹理信息。
能量分布: 波形的亮度表示了在对应频率下的能量大小,更亮的区域通常表示有更多的能量。
% 对图像进行傅里叶变换
fftImage = fft2(Image);
% 将零频分量移到频谱中心
fftImage = fftshift(fftImage);
% 计算幅度谱
amplitudeSpectrum = log(abs(fftImage) + 1);
% 显示幅度谱
figure;
imshow(amplitudeSpectrum, []);
可以得到彩色频率图和灰度频率图如下:
图1彩色频率图和灰度频率图
三、滤除不同频率分量得到不同效果
首先使用高斯低通滤波器观察彩图和灰度图,然后滤去了不同频率分量观察彩图和灰度图,可以明显地看到,滤除低通会失去图像的背景、平坦区域以及大体结构等信息,滤除高通会失去图像的边缘、纹理和细微结构等信息。因此,使用双边滤波能够较好实现美颜。
1.高斯低通滤波器
close all;
clear all;
clc;
I = imread('罗中立 父亲.jpg');
% I=rgb2gray(I);//将图像转换成灰度图
I=im2double(I);
subplot(121),imshow(I);
title('原始图像');
s=fftshift(fft2(im2double(I)));
[a,b]=size(s);
a0=round(a/2);
b0=round(b/2);
d0=50; % 将滤波器的截止频率D0设置为50
d1=300;
for i=1:a %双重for循环计算频率点(i,j)与频域中心的距离D(i,j)=sqrt((i-round(a/2)^2+(j-round(b/2)^2))
for j=1:b
distance=sqrt((i-a0)^2+(j-b0)^2);
if distance<=d0 || distance>=d1 % 根据理想带阻滤波器产生公式,置为1
h=1;
else
h=0; % 根据滤波器产生公式,当D1>D(i,j)>D0,置为0
end
s(i,j)=h*s(i,j);% 频域图像乘以滤波器的系数
end
end
% real函数取元素的实部
s=real(ifft2(ifftshift(s)));% 最后进行二维傅里叶反变换转换为时域图像
subplot(122),imshow(s,[]);
title('理想带阻滤波所得图像');
图2高斯低通灰度图
图3高斯低通彩图
图4不同频段滤波滤波图像
从上图分析结果中可以看到高斯滤波导致图像变得模糊了,原因是它在滤波过程中只关注了位置信息。因此我们引入双边滤波以获得更好滤波效果。
2.双边滤波器
在双边滤波中,每个像素的滤波权重不仅取决于其与中心像素的空间距离(即位置关系),还取决于它们的像素值之间的差异。这意味着对于像素值相近的像素,它们会被赋予更大的权重,而对于像素值差异较大的像素,它们会被赋予较小的权重。
双边滤波中使用的算法:
空间域核函数:基于像素之间的空间距离来计算权重。
灰度域核函数:基于像素之间的灰度差异来计算权重。
权重计算:双边滤波器将空间域核函数和灰度域核函数的结果相乘,得到最终的权重。
clc;clear;close all;
img0 = imread('罗中立 父亲.jpg');
tempsize = 5;
sigma1 = 3;
sigma2 = 0.1;
img = double(padarray(img0,[tempsize,tempsize],0))/255;
%通道提取
imgr = img(:,:,1);
imgg = img(:,:,2);
imgb = img(:,:,3);
[m,n] = size(imgr);
figure(1)
subplot(1,2,1)
imshow(img0)
title('原图')
%通道处理1
img(:,:,1) = B_filter(imgr,tempsize,sigma1,sigma2);
img(:,:,2) = B_filter(imgg,tempsize,sigma1,sigma2);
img(:,:,3) = B_filter(imgb,tempsize,sigma1,sigma2);
subplot(1,2,2)
imshow(img(tempsize+1:m-tempsize,tempsize+1:n-tempsize,:))
title('双边滤波处理后图像')
function out = B_filter(Img,tempsize,sigma0,sigma1)
%模板定义
gauss = fspecial('gauss',2*tempsize+1,sigma0);
[m,n] = size(Img);
for i = 1+ tempsize : m - tempsize
for j = 1+ tempsize : n - tempsize
%提取处理区域得到梯度敏感矩阵
temp = abs(Img(i - tempsize:i + tempsize,j - tempsize:j + tempsize) - Img(i,j));
temp = exp(-temp.^2/(2*sigma1^2));
%得到双边滤波器并将权值和化为一
filter = gauss.*temp;
filter = filter/sum(filter(:));
%卷积
Img(i,j) = sum(sum((Img(i - tempsize:i + tempsize,j - tempsize:j + tempsize).*filter))); end
end
out = Img;
end
图5双边滤波前后图像