matlab 倍频程和噪声问题(不一致的参数(OP1为11x1,OP2为9x1))

eeq64g8w  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(94)

我有一个用八度音阶使我的生活复杂化的问题,我正在使用一种蜜蜂算法,为了使用它,我首先使用“无噪声”向图像添加噪声,但问题是,当我添加噪声时,出于某种原因,当我试图对原始图像和带有噪声的图像执行操作时,它告诉我这些图像有不同的大小。
噪波添加

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
p3rjfoxz

p3rjfoxz1#

您需要按如下方式调用ABCPAR

ABCPAR(50,50,0,I,Inoisy);

您传入了文件名,但该函数不需要文件名,它需要数组。因此,它使用名称就好像它们是数据一样,因此大小为1x9和1x11,这与文件名的大小相对应。

相关问题