📄 pcnn.m
字号:
function[Edge,Numberofaera] = pcnn(X)
% X:输入的灰度图像,Edge:为检测到的一些边界点
% Numberofaera:表明了在各次迭代激活的块区域
X = (imread('C:\shi.BMP'));
ADD = imnoise(X,'salt & pepper', 0.1);
%X=ADD./max(max(ADD))
figure,imshow(ADD);
X = double(ADD);
Weight = [0.5 1 0.5;1 0 1;0.5 1 0.5];
Beta = 0.4;
Yuzhi = 240;
Decay = 0.3;
[a,b] = size(X);
Threshold = zeros(a,b);
S = zeros(a+2,b+2);
B = zeros(a,b); %标记样板,表明该pixel是否被激活过
Y = zeros(a,b);
T = zeros(a,b);
Edge = zeros(a,b);
Numberofaera = zeros(a,b);
Numberofaera_1 = zeros(a,b);
Num_1 = 0;
Num = 0;
n=1;
while (sum(sum(B))~=256*256)
for i0=2:a+1
for i1=2:b+1
V=[ S(i0-1,i1-1) S(i0-1,i1) S(i0-1,i1+1);
S(i0,i1-1) S(i0,i1) S(i0-1,i1+1);
S(i0+1,i1-1) S(i0+1,i1) S(i0+1,i1+1)];
L=sum(sum(V.*Weight));
F=X(i0-1,i1-1);
U=double(F)*(1+Beta*double(L));
if U>=Threshold(i0-1,i1-1)|Threshold(i0-1,i1-1)<60
T(i0-1,i1-1) = Yuzhi;
Y(i0-1,i1-1) = 1;
if n==1
B(i0-1,i1-1) = 0;
else
B(i0-1,i1-1) = 1;%已发射过的标记
Threshold(i0-1,i1-1) = 1000000;
end
else
T(i0-1,i1-1) = 0;
Y(i0-1,i1-1) = 0;
end
end
end
Threshold(find(B~=1)) = exp(-Decay)*Threshold(find(B~=1));
%被激活过的象素不再参与迭代过程
if(n~=1)
Edge=Edge+judge_edge(Y,n);
%边界点被置零,Y本身是激发的象素,现在边界被置零,也不能说是白激发了
%B矩阵有记录!当然下次不能再被激发了
Y(find(Edge<0)) = 0;
[ Numberofaera_1,Num_1] = bwlabel(Y,4);
for i=1:a
for j=1:b
if Numberofaera_1(i,j) ~= 0
Numberofaera_1(i,j) = Numberofaera_1(i,j)+Num;
end
end
end
Numberofaera = Numberofaera + Numberofaera_1;
Num = Num_1;
end
if n == 1
S = zeros(a+2,b+2);
else
S = Bianhuan(T);
end
n = n + 1;
Numberofaera_1 = zeros(a,b);
end
figure,imshow(Y);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -