我有一个用八度音阶使我的生活复杂化的问题,我正在使用一种蜜蜂算法,为了使用它,我首先使用“无噪声”向图像添加噪声,但问题是,当我添加噪声时,出于某种原因,当我试图对原始图像和带有噪声的图像执行操作时,它告诉我这些图像有不同的大小。
噪波添加
clc;
pkg load image;
I=imread('emigray.jpg');
%I=rgb2gray(I);
sigmaNoise = 0.250;
Inoisy = imnoise(I, "gaussian",0.05);
imwrite(Inoisy,'sucia.jpg');
size(I);
size(Inoisy);
ABCPAR(50,50,0,'emigray.jpg','sucia.jpg');
在执行BEE算法之前,它会计算RMSE,但会抛出图像大小不同的错误。
function [mse, rmse] = RMSE(signal1, signal2)
originalRowSize = size(signal1,1);
originalColSize = size(signal1,2);
originalRowSize
originalColSize
size(signal2,1)
size(signal2,2)
signal1 = signal1(:);
signal2 = signal2(:);
size(signal1)
size(signal2)
mse = sum((signal1 - signal2).^2)./(originalRowSize*originalColSize);
rmse = sqrt(mse);
那就是错误。
error: operator -: nonconformant arguments (op1 is 11x1, op2 is 9x1)
error: called from
RMSE at line 15 column 9
ABCPAR at line 52 column 23
filtro at line 12 column 1
我不知道怎么解决,我尝试的每一件事都不起作用,帮帮我,非常感谢你的帮助。
ABCPAR是BEE算法,错误是因为它使用MSE的值,但找不到它,因为RMSE中的错误就是在那里生成的。
ABCPAR
function [GlobalOpt, GlobalParams, conv]=ABCPAR(Np, gmax,opti, I, Inoisy)
O = size(I)
N = size(Inoisy)
I
Inoisy
if(opti==0)
GlobalOpt=inf;
else
GlobalOpt=0;
end
%Inicializo los vectores de par�metros
vector_numIt=1:100;
vector_dt=0.1:0.01:0.2;
vector_k=1:0.5:30;
range=[1 100 1 11 1 59];
%Parametros iniciales
d=3; %dimensiones
%Np=250; %tama�o poblacion
fuente_comida=round(Np/2); %Fuentes de comida
limit=5; %criterio de abandono
Aux=1;
Rango=zeros(1,3);
for i=1:d
Rango(i)=range(1,Aux+1)-range(1,Aux);
Aux=Aux+2;
end
%Poblacion inicial aleatoria
%Poblacion=(rand(fuente_comida,d)*Rango)+range(1)
Poblacion=zeros(fuente_comida,d)
for i=1:d
Poblacion(:,i)=round((rand(fuente_comida,1)*Rango(i))+1);
end
%Calcula fitness de la funci�n objetivo para la poblaci�n inicial
for ii=1:fuente_comida
IFiltrada=difusionAnisotropicaPM(Inoisy, vector_numIt(Poblacion(ii,1)), vector_dt(Poblacion(ii,2)), vector_k(Poblacion(ii,3)));
variable = 'size 1'
size(IFiltrada)
if(opti==0)
ValFit(ii)=RMSE(I,IFiltrada);
Fitness(ii)=ValFit(ii);
else
ValFit(ii)=snr(I,IFiltrada);
Fitness(ii)=ValFit(ii);
end
end
%inicializar contadores de prueba
prueba=zeros(1,fuente_comida);
%Se actualiza la fuente donde se encontr� la mejor fuente de comida
if(opti==0)
MejorInd=find(ValFit==min(ValFit));
else
MejorInd=find(ValFit==max(ValFit));
end
MejorInd=MejorInd(end);
GlobalOpt=ValFit(MejorInd);
GlobalParams=Poblacion(MejorInd,:); %Se refiere a la Ubicaci�n del mejor individuo
g=1; %contador de generaciones
while((g<=gmax))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%Fase de abeja obrera%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:fuente_comida
%Parametro a modificar determinado aleatoriamente
Param2Change=fix(rand*d)+1;
%Se utiliza una solucion aleatoria para producir una nueva solucion mutante, ambas deben ser diferentes
vecino=fix(rand*(fuente_comida))+1;
%Por si justo el vecino es el mismo
while(vecino==i)
vecino=fix(rand*(fuente_comida))+1;
end
soluciones=Poblacion(i,:);
%es aplicado: v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij})
soluciones(Param2Change)=round(Poblacion(i,Param2Change)+(Poblacion(i,Param2Change)-Poblacion(vecino,Param2Change))*(rand-0.5)*2);
if(soluciones(Param2Change)<1)
soluciones(Param2Change)=1;
end
if(soluciones(Param2Change)>range(2*Param2Change))
soluciones(Param2Change)=range(2*Param2Change);
end
IFiltrada=difusionAnisotropicaPM(Inoisy, vector_numIt(soluciones(1)), vector_dt(soluciones(2)), vector_k(soluciones(3)));
variable = 'size 2'
size(IFiltrada)
if(opti==0)
ValFitSol=RMSE(I,IFiltrada);
FitnessSol=ValFit(ii);
else
ValFitSol=snr(I,IFiltrada);
FitnessSol=ValFit(ii);
end
%Se aplica un criterio de selecci�n Greedy entre la solucion
%actual y la producida(mutante), se conserva la mejor entre ellas
if(opti==0)
if(FitnessSol<Fitness(i))
Poblacion(i,:)=soluciones;
Fitness(i)=FitnessSol;
ValFit(i)=ValFitSol;
prueba(i)=0;
else
prueba(i)=prueba(i)+1; %se incrementa el contador de prueba
end
else
if(FitnessSol>Fitness(i))
Poblacion(i,:)=soluciones;
Fitness(i)=FitnessSol;
ValFit(i)=ValFitSol;
prueba(i)=0;
else
prueba(i)=prueba(i)+1; %se incrementa el contador de prueba
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%Fin fase Abeja obrera%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%se calculan probabilidades utilizando los valores de fitness normalizados
probab=(0.9.*Fitness./max(Fitness))+0.1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%Fase de abeja observadora%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
i=1;
t=0;
while t<fuente_comida
%Las abejas observadoras ver�n la danza de las obreras y eligiran una buena fuente
if rand<probab(i)
t=t+1;
%el parametro a modificar se selecciona aleatoriamente
Param2Change=fix(rand*d)+1;
%es utilizada una solucion aleatoria para producr una nueva solucion caldidato, deber�n ser diferentes entre si
while(vecino==i)
vecino=fix(rand*(fuente_comida))+1;
end
soluciones=Poblacion(i,:);
%Se aplica: v_{ij}=x_{ij}+\phi_{ij}*{kj}-x_{ij})
soluciones(Param2Change)=round(Poblacion(i,Param2Change)+(Poblacion(i,Param2Change)-Poblacion(vecino,Param2Change))*(rand-0.5)*2);
%Si el parametro generado est� fuera de los limites, es llevado al limite m�s proximo
if(soluciones(Param2Change)<1)
soluciones(Param2Change)=1;
end
if(soluciones(Param2Change)>range(2*Param2Change))
soluciones(Param2Change)=range(2*Param2Change);
end
IFiltrada=difusionAnisotropicaPM(Inoisy, vector_numIt(soluciones(1)), vector_dt(soluciones(2)), vector_k(soluciones(3)));
variable = 'size 3'
size(IFiltrada)
if(opti==0)
ValFitSol=RMSE(I,IFiltrada);
FitnessSol=ValFit(ii);
else
ValFitSol=snr(I,IFiltrada);
FitnessSol=ValFit(ii);
end
%Se aplica un criterio de selecci�n Greedy entre la solucion
%actual y la producida(mutante), se conserva la mejor entre ellas
if(opti==0)
if(FitnessSol<Fitness(i))
Poblacion(i,:)=soluciones;
Fitness(i)=FitnessSol;
ValFit(i)=ValFitSol;
prueba(i)=0;
else
prueba(i)=prueba(i)+1; %se incrementa el contador de prueba
end
else
if(FitnessSol>Fitness(i))
Poblacion(i,:)=soluciones;
Fitness(i)=FitnessSol;
ValFit(i)=ValFitSol;
prueba(i)=0;
else
prueba(i)=prueba(i)+1; %se incrementa el contador de prueba
end
end
end
i=i+1;
%Si supera la cantidad de fuentes de comida vuelve a empezar
if (i==(fuente_comida)+1)
i=1;
end
end
if(opti==0)
%Se incrementa la mejor fuente de comida
ind=find(ValFit==min(ValFit));
ind=ind(end);
if (ValFit(ind)<GlobalOpt)
GlobalOpt=ValFit(ind);
GlobalParams=Poblacion(ind,:);
end
else
%Se incrementa la mejor fuente de comida
ind=find(ValFit==max(ValFit));
ind=ind(end);
if (ValFit(ind)>GlobalOpt)
GlobalOpt=ValFit(ind);
GlobalParams=Poblacion(ind,:);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Fin de la fase de la abeja observadora%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Fase de la abeja exploradora%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%if(opti==0)
%else
%end
%se determinan las fuentes de comida cuyo valor de l�mite es alcanzado
ind=find(prueba==max(prueba));
ind=ind(end);
if(prueba(ind)>limit)
prueba(ind)=0;
soluciones=zeros(1,d);
for i=1:d
soluciones(i)=round((Rango(i)).*rand(1,1)+1);
end
if(opti==0)
IFiltrada=difusionAnisotropicaPM(Inoisy, vector_numIt(soluciones(1)), vector_dt(soluciones(2)), vector_k(soluciones(3)));
variable = 'size 4'
size(IFiltrada)
ValFitSol=RMSE(I,IFiltrada);
FitnessSol=ValFit(ii);
else
IFiltrada=difusionAnisotropicaPM(Inoisy, vector_numIt(soluciones(1)), vector_dt(soluciones(2)), vector_k(soluciones(3)));
variable = 'size 5'
size(IFiltrada)
ValFitSol=snr(I,IFiltrada);
FitnessSol=ValFit(ii);
end
Poblacion(ind,:)=soluciones;
Fitness(ind)=FitnessSol;
ValFit(ind)=ValFitSol;
end
conv(g)=GlobalOpt
Poblacion
g=g+1; %se incrementa la iteracion
%clc
%se despliegan la posicion y fitness del mejor individuo
%disp(g)
%disp(GlobalOpt)
%disp(GlobalParams)
end
return;
end
输液各向异性PM
function Ifiltrada = difusionAnisotropicaPM(Inoisy, numIt, dt, k)
Ifiltrada = double(Inoisy);
[xDim, yDim] = size(Ifiltrada);
in = [1 1:xDim-1];
is = [2:xDim xDim];
ie = [1 1:yDim-1];
io = [2:yDim yDim];
for it = 1: numIt
gn = Ifiltrada(in,:) - Ifiltrada;
gs = Ifiltrada(is,:) - Ifiltrada;
ge = Ifiltrada(:,ie) - Ifiltrada;
go = Ifiltrada(:,io) - Ifiltrada;
cn = lorenciana(gn,k);
cs = lorenciana(gs,k);
ce = lorenciana(ge,k);
co = lorenciana(go,k);
Ifiltrada = Ifiltrada + dt.*(gn.*cn + gs.*cs + ge.*ce + go.*co);
end
Ifiltrada = uint8(Ifiltrada);
end
function g = lorenciana(grad,k)
g = 1./(1+ (grad./k).^2);
end
信噪比
function v = snr(x,y)
x = double(x);
y = double(y);
% snr - signal to noise ratio
%
% v = snr(x,y);
%
% v = 20*log10( norm(x(:)) / norm(x(:)-y(:)) )
%
% x is the original clean signal (reference).
% y is the denoised signal.
%
% Copyright (c) 2008 Gabriel Peyre
v = 20.*log10(norm(x(:))./norm(x(:)-y(:)));
调整输出大小
O =
1 11
N =
1 9
I = emigray.jpg
Inoisy = sucia.jpg
Poblacion =
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
variable = size 1
ans =
1 9
originalRowSize = 1
originalColSize = 11
ans = 1
ans = 9
ans =
11 1
ans =
9 1
error: operator -: nonconformant arguments (op1 is 11x1, op2 is 9x1)
error: called from
RMSE at line 15 column 9
ABCPAR at line 52 column 23
filtro at line 12 column 1
1条答案
按热度按时间p3rjfoxz1#
您需要按如下方式调用
ABCPAR
:您传入了文件名,但该函数不需要文件名,它需要数组。因此,它使用名称就好像它们是数据一样,因此大小为1x9和1x11,这与文件名的大小相对应。