有兴趣可以对下方的一些方法和参数进行更换,以达到更好的效果。
主要涉及到二值化,阈值,腐蚀,膨胀,反色等
clc;
close all;
clear;
workspace;
fontSize = 14;
grayImage = imread('test.jpg');
[rows, columns, numberOfColorBands] = size(grayImage);
if numberOfColorBands > 1 % 如果是彩色图像则转为灰度图像
grayImage = rgb2gray(grayImage);
end
figure,imshow(grayImage, []);
title('原始灰度图像');
frequencyImage = fftshift(fft2(grayImage)); % 得到频域图
myangle = angle(fft2(grayImage)); % 后续傅里叶反变换使用
amplitudeImage = log(1 + abs(frequencyImage)); % 在FFT变换之后把浮点数据进行对数变化,线性映射到0~255范围内,压缩数据
frequencyImage = abs(frequencyImage);
figure,imshow(amplitudeImage, [])
title('傅里叶变换得到的频域图像');
amplitudeThreshold = 9.2; % 阈值分割的阈值
brightSpikes = amplitudeImage > amplitudeThreshold; % 二值图像
figure,imshow(brightSpikes);
title('频域图像阈值分割');
se=strel('disk',1');% 圆盘型结构元素
fc=imclose(brightSpikes,se); % 形态学闭操作等效于先膨胀再腐蚀
figure,imshow(fc);
title('频域图像阈值分割后膨胀腐蚀');
I_reverse = imcomplement(fc); % 反色
figure,imshow(I_reverse);
title('反色');
I_reverse(275:310, 190:235) = 1; % 保留中心区域
figure,imshow(I_reverse);
title('保留中心区域');
median_filter=medfilt2(I_reverse,[3,3]); %进行3*3模板中值滤波,前面的处理可能会带来新条纹
figure,imshow(median_filter);
title('中值滤波');
mask = imcomplement(median_filter);
frequencyImage(mask) = 0;
amplitudeImage2 = log(abs(frequencyImage));
figure,imshow(amplitudeImage2, []);
title('新的频谱图');
aaa = ifftshift(frequencyImage); % 将处理后的幅度图反移位,恢复到正常状态
bbb = aaa.*cos(myangle) + aaa.*sin(myangle).*1i; % 幅度值和相位值重新进行结合,得到复数
fr = abs(ifft2(bbb)); % 进行傅里叶反变换,得到处理后的时域图像
ret = im2uint8(mat2gray(fr));
figure,imshow(ret); %滤波后的图像
title('傅里叶反变换还原图像');