简体   繁体   中英

Problem with Octave and imnoise (nonconformant arguments (op1 is 11x1, op2 is 9x1))

I have a problem that is complicating my life with octave, I am working with a bee algorithm, to work with it, first I use "imnoise" to add noise to the image, but the problem is that when I add noise, for some reason when trying to perform operations with the original image and the image with noise, it tells me that these images have different sizes.

Noise add

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');

Before executing the bee algorithm, it calculates the rmse but there is where it throws the error that the images have different sizes.

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);

The error.

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

I don't know how to solve it, every thing I try doesn't work, help, thank you very much for your help.

ABCPAR is the bee algorithm and the error is because it uses the value of mse and does not find it, because that is where the error in RMSE was generated.

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

difusionAnisotropicaPM


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

snr

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(:)));

Sizes output

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

You need to call ABCPAR as follows:

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

You pass in file names, but this function does not expect file names, it expects arrays. So it uses the names as if they were data, hence the sizes of 1x9 and 1x11, which correspond to the sizes of the file names.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM