-
2021-04-20 03:57:39
%%%%%%%%%%%%%%% FCM算法分割图像 %%%%%%%%%%%%%%
%matlab
function clusterResult = FCM(imagePath, C, V, M, iter, epsm)
% 模糊C均值(FCM)聚类算法分割图像
% clusterResult = FCM(imagePath, C, V, M, iter, epsm)
% Example: clusterResult = FCM('E:\Image\lena.bmp')
% clusterResult = FCM('E:\Image\lena.bmp',3,[0 127 255])
% Input:
% imagePath: 图像路径
% C: 类别数,缺省值为2
% V: 初始化聚类中心,缺省值为[0 255]
% M: 加权指数,缺省值为2
% iter: 迭代次数,缺省值为100
% epsm: 迭代停止阈值,缺省值为1.0e-2
% Output:
% clusterResult: 聚类中心结果
% Note:
% C的值要与V的初始化聚类中心个数相同
% 设定缺省值
I= imread('1024.bmp');
if nargin < 6
epsm = 1.0e-2;
end
if nargin < 5
iter = 100;
end
if nargin < 4
M = 2;
end
if nargin < 3
[x,y,z]=impixel(I);
V(1)=z(1);
V(2)=z(2);
V(3)=z(3);
end
if nargin < 2
C = 3;
end
% 读入图像及其信息
figure, imshow(I);
title('原图像');
[row col] = size(I);
grayHist = imhist(I);
% figure, imhist(I);
% title('直方图');
histProb = grayHist / (row * col);
len = length(histProb);
% tic
% FCM迭代过程
cnt = 0;
while(cnt < iter)
% 计算隶属度函数(注意要特殊考虑某个像素点和聚类中心一样的情况)
for i = 1 : len
flag = 0;
for j = 1 : C
if i == V(j)
U(j, i) = 1.0;
if j == 1
U(j + 1 : C, i) = 0.0;
elseif j == 3
U(1 : C - 1, i) = 0.0;
elseif j == 2
U(1 : j - 1, i) = 0.0;
U(j + 1 : C, i) = 0.0;
end
flag = 1;
break;
end
end
if flag == 0
u = (1.0 ./ ((i - V) .^ 2)) .^ (1.0 / (M - 1));
uSum = sum(u);
U(1 : C, i) = u' / uSum;
end
end
% 计算更新各类聚类中心
for j = 1 : C
i = linspace(1, len, len);
v = sum(histProb' .* i .* (U(j, .^ M));
vSum = sum(histProb' .* (U(j, .^ M));
if vSum == 0
clusterResult(j) = 0;
else
clusterResult(j) = v / vSum;
end
end
% 计算误差并判断算法迭代是否停止
diff = sum((clusterResult - V) .^ 2);
if diff <= epsm
break;
else
V = clusterResult;
end
cnt = cnt + 1;
end
% toc
% 分割图像
for i = 1 : row
for j = 1 : col
temp = (double(I(i, j)) - clusterResult) .^ 2;
[fmin pos] = min(temp);
I(i, j) = pos * 255 / C;
end
end
figure, imshow(uint8(I));
title('分类后的图像');
imshow(uint8(I),'Colormap',hsv(255));
%disp('迭代次数:iterTimes = ');
disp(cnt);
% end of FCM.m,
更多相关内容 -
模式识别C-means matlab实现
2019-12-15 22:03:05对于C-Means,实质也是一个对样本的分类,最初我以为是对特征的...二、matlab实现代码 %% C_menans clear ;clc; male_data = importdata('male.txt'); male_av = mean(male_data); female_data = importdata('f...对于C-Means,实质也是一个对样本的分类,最初我以为是对特征的分类,让我吃了很多苦!!
一、C-Means的原理:
二、matlab实现代码
%% C_menans clear ;clc; male_data = importdata('male.txt'); male_av = mean(male_data); female_data = importdata('female.txt'); female_av = mean(female_data); x = [male_data;female_data]; %plot(x(:,1),x(:,2),'.'); k = 2; %取初值 m = zeros(k,2); m = [160,50;176,68]; %c==2 % m = [male_av;female_av]; m_ref = zeros(k,2); data_ad_la = zeros(length(x),1); value =zeros(k,1);%记录每个类别样本的值,第一列是值,第二列是类别 w_num = zeros(k,1);%每一类的个数 x_temp =zeros(k,1); hei = zeros(k,1); wei = zeros(k,1); %还要改这里 s1 = [];s2 = []; while ( norm(m-m_ref)>0.0001 ) m_ref = m; for i=1:length(x) for j=1:k x_temp(j) = norm(x(i,:) -m(j,:) ); %1*2-1*2 end [A,B] = min(x_temp); data_ad_la(i) = B; hei(B) = hei(B) +x(i,1); wei(B) = wei(B) +x(i,2); value(B) = value(B)+A; %每一个类别都有个距离的和 %类别个数不同,这里要改改 if(B==1) s1 = [s1,i]; else s2 = [s2,i]; end end for i = 1:k w_num(i) = sum(data_ad_la==i); m(i,:) = [hei(i)/w_num(i),wei(i)/w_num(i)]; end Je = sum( value./w_num ); value = zeros(k,1); hei =zeros(k,1); wei = zeros(k,1); % s1 = [];s2 = []; end figure; % plot(x(s1,1),x(s1,2),'*',x(s2,1),x(s2,2),'o',x(s3,1),x(s3,2),'+');legend('类1','类2','类3');title('C=3时的分类'); plot(x(s1,1),x(s1,2),'*',x(s2,1),x(s2,2),'o');legend('类1','类2'); % title('C=2时的分类,初值:m = [160,53;178,70];'); fprintf(' Je is %f',Je);
测试结果:
改变类别数,分别进行两类、三类、四类、五类聚类:
注:这里的这个图像我是通过Je/(聚类个数)得到的,按理说随着聚类个数的增加,Je应该会变小,可能代码有问题,还请大家指正
:
结论:随着聚类个数的增加,其Je会减小,但不会无限制的减小。聚类的结果还收初始聚类中心的影响。
-
k-mean.rar_matlab例程_C/C++_
2021-08-12 05:39:39这是一个matlab编写的程序。实现k均值。实现成功。 -
[转载]MATLAB程序设计教程(3-1)---MATLAB程序设计
2021-04-22 11:21:393.2.3循环结构1.for语句for语句的格式为:for 循环变量=表达式1:表达式2:表达式3循环体语句end其中表达式1的值为循环变量的初值,表达式2的值为步长,...程序如下:for m=100:999m1=fix(m/100);%求m的百位数字...3.2.3 循环结构
1.for语句
for语句的格式为:
for 循环变量=表达式1:表达式2:表达式3
循环体语句
end
其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。步长为1时,表达式2可以省略。
例3-8 一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。
程序如下:
for m=100:999
m1=fix(m/100); %求m的百位数字
m2=rem(fix(m/10),10); %求m的十位数字
m3=rem(m,10); %求m的个位数字
if m==m1*m1*m1+m2*m2*m2+m3*m3*m3
disp(m)
end
end
例3-9 已知,当n=100时,求y的值。
程序如下:
y=0;
n=100;
for i=1:n
y=y+1/(2*i-1);
end
y
在实际MATLAB编程中,采用循环语句会降低其执行速度,所以前面的程序通常由下面的程序来代替:
n=100;
i=1:2:2*n-1;
y=sum(1./i);
y
for语句更一般的格式为:
for 循环变量=矩阵表达式
循环体语句
end
执行过程是依次将矩阵的各列元素赋给循环变量,然后执行循环体语句,直至各列元素处理完毕。
例3-10 写出下列程序的执行结果。
s=0;
a=[12,13,14;15,16,17;18,19,20;21,22,23];
for k=a
s=s+k;
end
disp(s');
2.while语句
while语句的一般格式为:
while (条件)
循环体语句
end
其执行过程为:若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环。
例3-11 从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。
程序如下:
sum=0;
cnt=0;
val=input('Enter a number (end in
0):');
while (val~=0)
sum=sum+val;
cnt=cnt+1;
val=input('Enter a number (end in 0):');
end
if (cnt > 0)
sum
mean=sum/cnt
end
3.break语句和continue语句
与循环结构相关的语句还有break语句和continue语句。它们一般与if语句配合使用。
break语句用于终止循环的执行。当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句的下一语句。
continue语句控制跳过循环体中的某些语句。当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。
例3-12 求[100,200]之间第一个能被21整除的整数。
程序如下:
for n=100:200
if rem(n,21)~=0
continue
end
break
end
n
4.循环的嵌套
如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。
例3-13 若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。求[1,500]之间的全部完数。
for m=1:500
s=0;
for k=1:m/2
if rem(m,k)==0
s=s+k;
end
end
if m==s
disp(m);
end
end
3.3 函数文件
3.3.1 函数文件的基本结构
函数文件由function语句引导,其基本结构为:
function 输出形参表=函数名(输入形参表)
注释说明部分
函数体语句
其中以function开头的一行为引导行,表示该M文件是一个函数文件。函数名的命名规则与变量名相同。输入形参为函数的输入参数,输出形参为函数的输出参数。当输出形参多于一个时,则应该用方括号括起来。
例3-14 编写函数文件求半径为r的圆的面积和周长。
函数文件如下:
function [s,p]=fcircle(r)
%CIRCLE calculate the
area and perimeter of a circle of radii r
%r 圆半径
%s 圆面积
%p 圆周长
%2004年7月30日编
s=pi*r*r;
p=2*pi*r;
3.3.2 函数调用
函数调用的一般格式是:
[输出实参表]=函数名(输入实参表)
要注意的是,函数调用时各实参出现的顺序、个数,应与函数定义时形参的顺序、个数一致,否则会出错。函数调用时,先将实参传递给相应的形参,从而实现参数传递,然后再执行函数的功能。
例3-15 利用函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。
函数文件tran.m:
function [rho,theta]=tran(x,y)
rho=sqrt(x*x+y*y);
theta=atan(y/x);
调用tran.m的命令文件main1.m:
x=input('Please input x=:');
y=input('Please input y=:');
[rho,the]=tran(x,y);
rho
the
在MATLAB中,函数可以嵌套调用,即一个函数可以调用别的函数,甚至调用它自身。一个函数调用它自身称为函数的递归调用。
例3-16 利用函数的递归调用,求n!。
n!本身就是以递归的形式定义的:
显然,求n!需要求(n-1)!,这时可采用递归调用。递归调用函数文件factor.m如下:
function f=factor(n)
if n<=1
f=1;
else
f=factor(n-1)*n; %递归调用求(n-1)!
end
3.3.3 函数参数的可调性
在调用函数时,MATLAB用两个永久变量nargin和nargout分别记录调用该函数时的输入实参和输出实参的个数。只要在函数文件中包含这两个变量,就可以准确地知道该函数文件被调用时的输入输出参数个数,从而决定函数如何进行处理。
例3-17 nargin用法示例。
函数文件examp.m:
function fout=charray(a,b,c)
if nargin==1
fout=a;
elseif nargin==2
fout=a+b;
elseif nargin==3
fout=(a*b*c)/2;
end
命令文件mydemo.m:
x=[1:3];
y=[1;2;3];
examp(x)
examp(x,y')
examp(x,y,3)
3.3.4 全局变量与局部变量
全局变量用global命令定义,格式为:
global 变量名
例3-18 全局变量应用示例。
先建立函数文件wadd.m,该函数将输入的参数加权相加。
function f=wadd(x,y)
global ALPHA BETA
f=ALPHA*x+BETA*y;
在命令窗口中输入:
global ALPHA BETA
ALPHA=1;
BETA=2;
s=wadd(1,2)
3.4 程序举例
例3-19 猜数游戏。首先由计算机产生[1,100]之间的随机整数,然后由用户猜测所产生的随机数。根据用户猜测的情况给出不同提示,如猜测的数大于产生的数,则显示“High”,小于则显示“Low”,等于则显示“You
won”,同时退出游戏。用户最多可以猜7次。
例3-20 用筛选法求某自然数范围内的全部素数。
素数是大于1,且除了1和它本身以外,不能被其他任何整数所整除的整数。用筛选法求素数的基本思想是:要找出2~m之间的全部素数,首先在2~m中划去2的倍数(不包括2),然后划去3的倍数(不包括3),由于4已被划去,再找5的倍数
(不包括5),…,直到再划去不超过的数的倍数,剩下的数都是素数。
例3-21 设,求s=。
求函数f(x)在[a,b]上的定积分,其几何意义就是求曲线y=f(x)与直线x=a,x=b,y=0所围成的曲边梯形的面积。为了求得曲边梯形面积,先将积分区间[a,b]分成n等分,每个区间的宽度为h=(b-a)/n,对应地将曲边梯形分成n等分,每个小部分即是一个小曲边梯形。近似求出每个小曲边梯形面积,然后将n个小曲边梯形的面积加起来,就得到总面积,即定积分的近似值。近似地求每个小曲边梯形的面积,常用的方法有:矩形法、梯形法以及辛普生法等。
例3-22 Fibonacci数列定义如下:
f1=1
f2=1
fn=fn-1+fn-2 (n>2)
求Fibonacci数列的第20项。
例3-23 根据矩阵指数的幂级数展开式求矩阵指数。
3.5 程序调试
3.5.1 程序调试概述
一般来说,应用程序的错误有两类,一类是语法错误,另一类是运行时的错误。语法错误包括词法或文法的错误,例如函数名的拼写错、表达式书写错等。
程序运行时的错误是指程序的运行结果有错误,这类错误也称为程序逻辑错误。
3.5.2 调试器
1.Debug菜单项
该菜单项用于程序调试,需要与Breakpoints菜单项配合使用。
2.Breakpoints菜单项
该菜单项共有6个菜单命令,前两个是用于在程序中设置和清除断点的,后4个是设置停止条件的,用于临时停止M文件的执行,并给用户一个检查局部变量的机会,相当于在M文件指定的行号前加入了一个keyboard命令。
3.5.3 调试命令
除了采用调试器调试程序外,MATLAB还提供了一些命令用于程序调试。命令的功能和调试器菜单命令类似,具体使用方法请读者查询MATLAB帮助文档。
-
数字图像处理---图像复原---MATLAB---实例程序
2022-05-03 20:17:09=============================MATLAB代码============================ 注意将不是灰度图的转为灰度图,如果已经是灰度图就要将rgb2gray函数去掉,后面的代码同理。 如果想显示出比较高清的图片,可以使用imwrite...1.绪
图像复原目的:获得关于原始图像的近似估计f(x,y)。
由于种种原因(拍摄、传输、保存等),图像变得模糊,或者被噪声污染,图像退化,退化的模型可以被模型化为一个退化函数和一个加性噪声项,这个时候想得到一个比较清晰完整的图像,就需要图像复原。
主要处理以噪声引起的退化。
2.噪声
2.1 一些重要噪声的概率密度函数
=====================================================================
=========================================================================
=========================================================================
2.2 添加噪声(实例1)
图1.1
对图1.1分别加入上面各种噪声,并显示出其直方图。
=============================MATLAB代码============================
注意将不是灰度图的转为灰度图,如果已经是灰度图就要将rgb2gray函数去掉,后面的代码同理。
如果想显示出比较高清的图片,可以使用imwrite(fig,'a.jpg');fig为要保存的图片,a.jpg为保存的名字和格式,可以直接保存。
直方图可以点击编辑窗口,进行参数范围,字体大小等的调整,使得呈现的图片更加饱满。
噪声添加,也可以使用imnoise(f,type,parameters);其中,f是输入图像,type选择噪声类型,parameters为可调整的参数(噪声的均值和方差等)。
clc; clear; %读入图像,并转换为double型 B=imread('huade.jpg'); I = rgb2gray(B); %转化为灰度图 I_D=im2double(I); %获得图像大小 [M,N]=size(I_D); %========================生成高斯白噪声================================== a=0; b=0.001; N_Gau=a+sqrt(b)*randn(M,N); %将噪声叠加到图像上 J_Gaussian=I_D+N_Gau; %保存噪声数据 %======================生成瑞利噪声====================================== a=0; b=0.08; B=1; N_Ray1=a+b*raylrnd(B,M,N); %将噪声叠加到图像上 J_rayl=I_D+N_Ray1; %=====================叠加伽马噪声======================================= a=0; b=0.08; A=1; B=2; N_Gam=a+b*gamrnd(A,B,[M,N]); %将噪声叠加到图像上 J_Gamma=I_D+N_Gam; %====================叠加指数噪声======================================= a=0; b=0.08; mu=2; N_exp=a+b*exprnd(mu,[M,N]); J_exp=I_D+N_exp; %=====================叠加均匀分布噪声======================================= a=0; b=0.08; A=0; B=2; N_unif=a+b*unifrnd(A,B,[M,N]); J_unif=I_D+N_unif; %=====================叠加椒盐分布噪声======================================= a=0.25; J_salt = imnoise(I_D,'salt & pepper',a); subplot(2,3,1); imshow(J_Gaussian); title('高斯噪声'); subplot(2,3,2); imshow(J_rayl); title('瑞利噪声'); subplot(2,3,3); imshow(J_Gamma); title('伽马噪声'); subplot(2,3,4); imshow(J_exp); title('指数噪声'); subplot(2,3,5); imshow(J_unif); title('均匀分布噪声'); subplot(2,3,6); imshow(J_salt); title('椒盐噪声'); figure; subplot(2,3,1); imhist(J_Gaussian); title('高斯噪声'); subplot(2,3,2); imhist(J_rayl); title('瑞利噪声'); subplot(2,3,3); imhist(J_Gamma); title('伽马噪声'); subplot(2,3,4); imhist(J_exp); title('指数噪声'); subplot(2,3,5); imhist(J_unif); title('均匀分布噪声'); subplot(2,3,6); imhist(J_salt); title('椒盐噪声');
运行结果:
2.3 周期噪声
周期噪声是在图像获取时从电力或机电干扰中产生的。这是唯一的一种空间依赖型噪声。通常有正弦噪声和余弦噪声等。周期噪声通过频域滤波可以显著地减少。
2.4 添加正弦噪声(实例2)
图2
向图2加入正弦噪声,并画出其频谱图。
=============================MATLAB代码============================
clear; clc; %=======加入正弦噪声======== t=imread('einstein.jpg'); [m,n]=size(t); t_1=t; for i=1:m for j=1:n t_1(i,j)=t(i,j)+40*sin(40*i)+40*sin(40*j); end end imshow(t),title('原图'); imwrite(t_1,'einstein1.jpg'); %===========谱============= data = imread('einstein1.jpg'); data = rgb2gray(data); F = fft2(data); FC = fftshift(F); S2 = log(1+abs(FC)); imshow(S2,[]);
运行结果:
3.均值滤波
3.1 算术均值滤波
最简单的均值滤波器,m*n的矩形子图像窗口的各个值相加的和除以m*n。均值简单地平滑了一幅图像的局部变化,在模糊图像的同时减少了噪声。
3.2 几何均值滤波
每个被复原像素由子图像窗口中像素点的乘积并自乘到1/mn次幂。与算术均值相比,在滤波过程中会更少丢失图像细节。
3.3 均值滤波1(实例3)
图3
对图3加入均值为0,方差为0.02(归一化后)的高斯噪声,再分别用同样大小的窗口进行算术均值滤波和几何均值滤波。
=============================MATLAB代码============================
%高斯噪声部分 clc;clear; I=imread('test1.jpg'); I=im2double(I); %添加高斯噪声 I_noise=double(imnoise(I,'gaussian',0,0.02));%均值为0 imwrite(I_noise,'a.jpg'); %算术均值滤波 %定义子窗口的尺寸 m=3; n=3; %确定要扩展的行列数 len_m=floor(m/2); len_n=floor(n/2); %将原始图像进行扩展,这里采用了镜像扩展,以进行图像边缘计算 I_2=im2double(I_noise); [M2,N2]=size(I_2); I_2_pad=padarray(I_2,[len_m,len_n],'symmetric'); I_3=fspecial('average',[3,3]);%3*3均值滤波 建立预定义的滤波算子 I_3=imfilter(I_2_pad,I_3);%(待处理矩阵,滤波器) imwrite(I_3,'b.jpg'); %几何均值滤波 I_D=im2double(I_noise); [MM,NN]=size(I_D); %定义子窗口的尺寸 m=3; n=3; %确定要扩展的行列数 len_m=floor(m/2); len_n=floor(n/2); %将原始图像进行扩展,这里采用了镜像扩展,以进行图像边缘计算 I_D_pad=padarray(I_D,[len_m,len_n],'symmetric'); %获得扩展后的图像尺寸 [M,N]=size(I_D_pad); J_Geometric=zeros(MM,NN); %逐点计算子窗口的几何平均 for i=1+len_m:M-len_m for j=1+len_n:N-len_n %从扩展图像中取出子图像 Block=I_D_pad(i-len_m:i+len_m,j-len_n:j+len_n); %求子窗口的几何均值 J_Geometric(i-len_m,j-len_n)=(prod(prod(Block)))^(1/(m*n)); end end imwrite(J_Geometric,'c.jpg');
运行结果:
(a)原图 (b)高斯噪声污染
(c)3*3均值滤波 (d)3*3几何均值滤波
3.4 谐波均值滤波
谐波均值滤波器对“盐”噪声效果更好,但是不适用于“胡椒”噪声,它善于处理像高斯噪声那样的其他噪声。
3.5 逆谐波均值滤波
适合减少或在实际中消除椒盐噪声的影响。
Q称为滤波器的阶数。
当Q值为正数时,滤波器用于消除“胡椒”噪声。
当Q值为负数时,滤波器用于消除“盐粒”噪声。
当Q=0时,为算术均值滤波器。
当Q为-1时,为谐波均值滤波器。
3.6 均值滤波2(实例4)
对lena图分别加入概率为0.2的胡椒噪声和盐粒噪声,再用不同Q值得逆谐波滤波器分别对图像进行滤波。
=============================MATLAB代码============================
%椒盐噪声部分 clc;clear; I=imread('lena.bmp'); %I=rgb2gray(I); imshow(I); I=im2double(I); %添加胡椒信号 J = imnoise(I,'salt & pepper',0.1); [M,N]=size(J); for i=1:M for j=1:N if(J(i,j)==1) J(i,j)=0; else J(i,j)=J(i,j); end end end figure;imshow(J); %Q=1.5逆谐波滤波器滤波对胡椒 Q=1.5; I_mean=imfilter(J.^(Q+1),fspecial('average',3))./imfilter(J.^Q,fspecial('average',3)); figure;imshow(I_mean); % Salt Noise H = imnoise(I,'salt & pepper',0.1); [M,N]=size(H); for i=1:M for j=1:N if(H(i,j)==0) H(i,j)=1; else H(i,j)=H(i,j); end end end figure;imshow(H); %Q=-1.5逆谐波滤波器滤波对盐粒 Q=-1.5; I_mean=imfilter(H.^(Q+1),fspecial('average',3))./imfilter(H.^Q,fspecial('average',3)); figure;imshow(I_mean);
运行结果:
如果Q值选取错误,即用正值的Q对“盐粒”进行滤波,用负值的Q对“胡椒”进行滤波,会导致更不好的效果。
=============================MATLAB代码============================
%椒盐噪声部分 clc;clear; I=imread('lena.bmp'); %I=rgb2gray(I); imshow(I); I=im2double(I); %添加胡椒信号 J = imnoise(I,'salt & pepper',0.1); [M,N]=size(J); for i=1:M for j=1:N if(J(i,j)==1) J(i,j)=0; else J(i,j)=J(i,j); end end end figure;imshow(J); %Q=1.5逆谐波滤波器滤波对胡椒 Q=1.5; I_mean=imfilter(J.^(Q+1),fspecial('average',3))./imfilter(J.^Q,fspecial('average',3)); figure;imshow(I_mean); % Salt Noise H = imnoise(I,'salt & pepper',0.1); [M,N]=size(H); for i=1:M for j=1:N if(H(i,j)==0) H(i,j)=1; else H(i,j)=H(i,j); end end end figure;imshow(H); %Q=-1.5逆谐波滤波器滤波对盐粒 Q=-1.5; I_mean=imfilter(H.^(Q+1),fspecial('average',3))./imfilter(H.^Q,fspecial('average',3)); figure;imshow(I_mean);
运行结果:
(a)Q=-1.5对“胡椒”进行滤波 (b)Q=1.5对“盐粒”进行滤波
4.统计排序滤波
4.1 中值滤波
最著名的统计排序滤波器就是中值滤波器,就是用该像素的相邻像素的灰度中值来代替该像素的值。相同尺寸下,比线性平滑滤波器引起的模糊更少。对单极或双极脉冲噪声非常有效。
4.2 多次中值滤波(实例5)
对lena图加入0.2的椒盐噪声,再进行中值滤波。
=============================MATLAB代码============================
%椒盐噪声部分 clc;clear; I=imread('test1.jpg'); I=im2double(I); I_noise=double(imnoise(I,'salt & pepper',0.2));%salt & pepper注意中间的空格 无空格报错 imshow(I_noise);title('椒盐噪声'); %中值滤波 f1 = medfilt2(I_noise,'symmetric');%symmetric指出图像按照镜像反射方式对称地沿边界扩展 figure;imshow(f1); %再次滤波 f2 = medfilt2(f1,'symmetric');%symmetric指出图像按照镜像反射方式对称地沿边界扩展 figure;imshow(f2); %再一次滤波 f3 = medfilt2(f2,'symmetric');%symmetric指出图像按照镜像反射方式对称地沿边界扩展 figure;imshow(f3);
运行结果:
(a)被概率为0.2的椒盐噪声污染 (b)使用3*3的中值滤波对(a)处理
(c)使用3*3的中值滤波对(b)处理 (d)使用3*3的中值滤波对(c)处理
4.3 最大值和最小值滤波
最大值:用该像素的相邻像素的灰度最大值来代替该像素的值,滤除“胡椒”比较好。
最小值:用该像素的相邻像素的灰度最小值来代替该像素的值,滤除“盐粒”比较好。
4.4 最大最小滤波(实例6)
向lena图分别加入0.5的胡椒噪声和盐粒噪声,然后进行最大值最小值滤波。
=============================MATLAB代码============================
clc;clear; I=imread('hong.jpg'); I=rgb2gray(I); I=im2double(I); %添加胡椒信号 J = imnoise(I,'salt & pepper',0.25); [M,N]=size(J); for i=1:M for j=1:N if(J(i,j)==1) J(i,j)=0; else J(i,j)=J(i,j); end end end % Salt Noise H = imnoise(I,'salt & pepper',0.25); [M,N]=size(H); for i=1:M for j=1:N if(H(i,j)==0) H(i,j)=1; else H(i,j)=H(i,j); end end end %使用最大值 f3 = ordfilt2(J,9,ones(3,3)); imshow(f3); %使用最小值 f4 = ordfilt2(H,1,ones(3,3)); figure;imshow(f4);
运行结果:
4.5 修正后的阿尔法均值滤波器
-
混合算法的图像去噪的matlab程序(主要讲述小波+NL-means的图像去噪)
2021-01-19 18:20:48根据小波分解的第N层的低频系数和经过修改的从第一层到第N的各层高频系数,计算二维信号的小波重构 小波去噪的MATLAB程序: clc clear; zyy = imread('y.jpg'); %读取原图像 subplot(221); imshow(zyy); title('原图... -
实现代码 - 模糊C均值聚类算法(原理+Matlab代码)
2021-04-18 06:30:27j++) { //取出该列的最大值 if(c[j]》a[i]) { a[i]=c[j]; } //取出该列的最小值 if(c[j]《b[i]) { b[i]=c[j]; } } } //数据标准化 for(i=0;i《row;i++) { for(j=0;j《col;j++) { data[i]... -
MATLAB 实现K-means算法
2018-09-08 22:14:28本文参考头条文章K-means算法MATLAB实现原文地址 K-menas算法 概念: K-MEANS算法是对含有n个数据的数据集,根据数据之间相似性程度分类为k类。k-means 算法接受输入量 k ;相似度的度量有不同的量来表示,常见的... -
FCM模糊C均值聚类分析(Fuzzy C-means)公式推导与MATLAB程序
2020-05-09 12:22:16如何快速上手FCM,无疑是理论公式推导结合实战程序,话不多说,直接进入正题。 1 理论公式推导 你好! 1.1 目标函数构建 1.2 隶属度公式推导 1.3 聚类中心公式推导 2 MATLAB实例代码 文件运行需要iris.txt... -
meancell:该程序从不同长度的单元格中获取平均行-matlab开发
2021-05-30 17:08:36我们可以得到数据中不同单元格长度的行均值。 % 例子: %A=rand(2,1)*10; %B=rand(2,1)*10; %C=rand(30,1)*10;... %mean_row_cell =meancell(all) % 将每行均值的单元格检索到矩阵 mean_row_cell 中 -
随机走动-附matlab程序仿真[材料相关]
2021-04-20 12:33:06《随机走动-附matlab程序仿真[材料相关]》由会员分享,可在线阅读,更多相关《随机走动-附matlab程序仿真[材料相关](7页珍藏版)》请在人人文库网上搜索。1、信息与随机性报告随机走动(1) 随机走动回到零点的概率a.一... -
白化滤波器-matlab-程序.doc
2021-04-19 05:11:41白化滤波器的设计方法是: 首先计算色噪声自相关函数,根据色噪声的自相关函数,计算出色噪声的功率谱(色噪声的自相关函数和功率谱构成一对傅里叶变换对),然后根据公式 程序 %*******色噪声的产生**************... -
基于C均值算法简单分类(matlab实现)
2017-12-14 19:00:14% 样本集 x=[0,1;0,2;4,4;-1,-1;4,5;5,6;5,5;1,1];...% 选取存储中心点的位置,分别为前两类的中心,后一次两类中心,初始化前一次中心点 ...title('C-均值法实现'); xlabel('x1'); ylabel('x2'); -
Matlab学习笔记(1)--Matlab基础矩阵运算学习
2020-10-18 21:10:32最近接触并学习了Matlab,充分感受到了Matlab的强大,正所谓好记忆不如烂笔头,所以在此写一下学习笔记,以便后续温习。因为Matlab是一个十分重实践的软件,所以学习笔记我打算不按照常规写法来进行,而是通过作者在... -
基于MATLAB的MeanShift运动目标跟踪 matlab程序
2022-02-17 12:07:024.计算两者比重函数,如果后者差距过大, 更新新的矩阵中心Y,进行迭代(MeanShift是一种变步长可以迅速接近概率密度峰值的方法),直至一定条件后停止。二、源程序参考function [] = select() close all... -
matlab kmeans c 代码,K-means之matlab实现
2021-04-21 10:35:46引入作为练手,不妨用matlab实现K-means要解决的问题:n个D维数据进行聚类(无监督),找到合适的簇心。这里仅考虑最简单的情况,数据维度D=2,预先知道簇心数目K(K=4)理论步骤关键步骤:(1)根据K个簇心(clusters,... -
MATLAB源代码MATLAB源码大集合220MB上千个源码文件.zip
2021-05-21 15:39:09《MATLAB程序设计教程》源代码-2660.rar 《图像分割中常用的水平集方法的matlab源代码》.zip 【MATLAB GUI设计学习手记】源代码.rar 国外的车牌识别程序.rar 图像分割算法的Matlab源程序matlab.zip 图像压缩.rar ... -
MATLAB编程源代码文件大全集合【约1000+】
2021-09-07 15:47:59《MATLAB程序设计教程》源代码-2660.rar 《图像分割中常用的水平集方法的matlab源代码》.zip 【MATLAB GUI设计学习手记】源代码.rar 国外的车牌识别程序.rar 图像分割算法的Matlab源程序matlab.zip 图像压缩.rar ... -
K-means 算法原理以及程序实现(Matlab)
2021-04-18 05:20:05最近突然想理解一下K-Means聚类算法的基本原理以及程序实现,然后大量搜索阅览,终于比较透彻的理解了,过程是艰苦,但是结果总是让人happy。聚类分析又称群分析,它是研究(样品或者指标)分类问题的一种多元统计方法... -
MATLAB编程源代码文件大全集合【1000多个】
2021-09-09 11:29:33《MATLAB程序设计教程》源代码-2660.rar 《图像分割中常用的水平集方法的matlab源代码》.zip 【MATLAB GUI设计学习手记】源代码.rar 国外的车牌识别程序.rar 图像分割算法的Matlab源程序matlab.zip 图像压缩.rar ... -
MeanShift(均值漂移)MATLAB程序详解
2019-04-26 16:44:52首先给出了简介,然后详细介绍了基于MeanShift的目标跟踪算法,之后给出了MeanShift的算法实现流程,最后实现了一个单目标跟踪的MeanShift算法程序【Matlab/C++两个版本】 该程序应该是网上为数不... -
贝叶斯网络-使用matlab工具集
2021-04-24 12:44:20bnet.CPD{C} = gaussian_CPD(bnet,C,'mean',[-2 -1],'cov',[0.1 0.3]); bnet.CPD{L} = gaussian_CPD(bnet,L,'mean',3,'cov',0.25,'weights',-0.5); bnet.CPD{Min} = gaussian_CPD(bnet, Min,'mean',[0.5 -0.5],'cov... -
K-means聚类 —— matlab
2022-02-16 18:43:48K-mean算法步骤如下: (1)随机选取K个样本为中⼼ (2)分别计算所有样本到随机选取的K个中⼼的距离 (3)样本离哪个中⼼近就被分到哪个中⼼ (4)计算各个中⼼样本的均值(最简单的⽅法就是求样本每个维度的平均... -
【Matlab】【图像分割】模糊C均值(Fuzzy C-Means, FCM)聚类算法用于图像分割
2021-06-23 19:38:23概述 FCM作为经典的无监督聚类算法,在很多场合得到了广泛应用。楼主本人研究方向为图像分割,在学习完师兄的论文之后,自己...2、更新聚类中心ci{c}_{i}ci,更新公式为ci=∑j=1Nuijmxj∑j=1Nuijm{{c}_{i}}=\frac{\s -
Zernike函数拟合曲面--MATLAB实现
2018-05-18 23:33:05脚本程序 clc;clear; load unwrap_ph.mat unwrap_ph=max(max(unwrap_ph))-unwrap_ph; unwrap_ph=unwrap_ph(:,81:560); x=linspace(-1,1,size(unwrap_ph,1)); y=linspace(-1,1,size(unwrap_ph,2)... -
均值漂移(mean shift )聚类算法Matlab实现详解
2021-12-03 11:07:12Meanshift算法是基于核密度估计的爬山算法,可用于聚类、图像分割、跟踪等,其在声呐图像数据处理也有广泛的应用,笔者在网上找了一遍也没有找到关于Meanshift的matlab实现代码,找到的都是关于它的文字描述,无奈... -
蚁群算法---matlab代码
2017-08-03 00:39:50蚁群算法—matlab代码文明转帖,代码摘自:FPGA机器学习之蚁群算法 matlab程序蚁群算法简介 蚁群是自然界中常见的一种生物,人们对蚂蚁的关注大都是因为“蚁群搬家,天要下雨”之类的民谚。然而随着近代仿生学的... -
k-means聚类算法及matlab实现(简单实现)
2020-05-24 20:08:33hold on plot(C(:,1),C(:,2),'kx') legend('Cluster 1','Cluster 2','Cluster 3','ClusterCentroid') 聚类效果: 本文为了顺带提一嘴距离度量因此自己十分简陋的写了一个计算距离的函数,实际上使用matlab中... -
K-SVD算法matlab实现
2019-08-16 15:23:03K-SVD算法 转载自:K-SVDMatlab实现 自己改了之后就可以运行. 1.show.m %***************************** read in the image *****...img=imread('C:\Users\xxx\Desktop\x.jpg'); img0 = img; img=double(img); [N,n]... -
多目标优化NSGA-II的实现(MATLAB完整代码)
2022-01-03 21:24:18多目标优化NSGA-II的实现(MATLAB完整代码) 测试函数ZDT1、ZDT2、ZDT3、ZDT4、ZDT6。