matlab中使用二值化 腐蚀 膨胀 进行滤波

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('傅里叶反变换还原图像');

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是一个基本的粒子群优化算法的图像二值化matlab代码实现: ```matlab function [BW, Gbest] = PSO_Binarization(I, NP, MaxIter) % I - 输入灰度图像 % NP - 粒子数量 % MaxIter - 迭代次数 % 初始化参数 [row, col] = size(I); Vmax = 255; % 粒子速度最大值 w = 0.8; % 惯性权重 c1 = 2; % 个体学习因子 c2 = 2; % 全局学习因子 % 随机生成粒子位置 x = randi([0, 255], NP, 1); % 初始化粒子速度 v = zeros(NP, 1); % 初始化粒子最好位置和全局最好位置 Pbest = x; Gbest = x(1); % 计算初始适应度值 f = zeros(NP, 1); for i = 1:NP BW = im2bw(I, x(i)/255); f(i) = sum(sum(abs(BW - double(I)/255))); end % 迭代更新 for iter = 1:MaxIter for i = 1:NP % 更新粒子速度 v(i) = w*v(i) + c1*rand()*(Pbest(i) - x(i)) + c2*rand()*(Gbest - x(i)); if v(i) > Vmax v(i) = Vmax; end if v(i) < -Vmax v(i) = -Vmax; end % 更新粒子位置 x(i) = x(i) + v(i); if x(i) > 255 x(i) = 255; end if x(i) < 0 x(i) = 0; end % 计算适应度值 BW = im2bw(I, x(i)/255); fit = sum(sum(abs(BW - double(I)/255))); % 更新个体最好位置和全局最好位置 if fit < f(i) f(i) = fit; Pbest(i) = x(i); end if fit < sum(sum(abs(im2bw(I, Gbest/255) - double(I)/255))) Gbest = x(i); end end end % 输出二值化图像和全局最好位置 BW = im2bw(I, Gbest/255); Gbest = Gbest/255; end ``` 使用方法: ```matlab I = imread('test.jpg'); % 读取图像 NP = 20; % 粒子数量 MaxIter = 50; % 迭代次数 [BW, Gbest] = PSO_Binarization(I, NP, MaxIter); % 粒子群优化二值化 imshow(BW); % 显示二值化结果 ``` 注意,该代码只是一个基本实现,需要根据具体情况进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alocus_

如果我的内容帮助到你,打赏我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值