2017-10-18 23 views
1

J'ai généré une fonction pour appliquer une transformation linéaire par morceaux à une image. Sur la base de cette fonction, je ne suis pas sûr si elle fonctionne correctement. Parfois, l'image entière apparaît en blanc et tous les pixels sont répertoriés en 255. D'autres fois, l'image de sortie apparaît mais les résultats varient. En raison des résultats variables, je crois qu'il y a un problème avec ma fonction. Le code de la fonction est ici:Fonction de transformation linéaire par morceaux MATLAB

function T = piecewise_transform(f,n,r1,s1,r2,s2,r3,s3) 

% breakpoints: (0,0),(r1,s2),(r2,s2),(r3,s3),((L-1),(L-1)) 

% to get alpha, beta, etc, don't suppress echoing (remove ;) 

% find the parameters of each line 

L = 2^n; 

% s = a*r+b 

a1 = ((s1-0)/(r1-0)); 
b1 = ((s1/r1)); 
a2 = ((s2-s1)/(r2-r1)); 
b2 = ((s1*r2)-(s2*r1)/(r2-r1)); 
a3 = ((s3-s2)/(r3-r2)); 
b3 = (((s3-s2)/(r3-r2))*(s2/r2)); 
a4 = (((L-1)-s3)/((L-1)-r3)); 
b4 = (((L-1)-s3)/((L-1)-r3)*(s3/r3)); 

% put all parameters in two vectors 

A = [a1,a2,a3,a4] 
B = [b1,b2,b3,b4] 

[row,col] = size(f); 
T = f; 

for i = 1:row 
    for j=1:col 

    % find which line to use 

    %line 1 
    if f(i,j) < r1 
     flag = 1; 
    end 

    % line 2 
    if f(i,j) > r1 && f(i,j)<r2 
     flag = 2; 
    end 

    % line 3 
    if f(i,j) > r2 && f(i,j)<r3 
     flag = 3; 
    end 

    % line 4 
    if f(i,j) > r3 && f(i,j)<(L-1) 
     flag = 4; 
    end 

    T(i,j) = (A(flag)*f(i,j) + B(flag)); 
    end 
end 

T = uint8(T); 

imshow(T) 

Voici les résultats de certains de mes tests:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

Sur la base de mon code, pourquoi suis-je recevoir des résultats différents?

Répondre

1

Il y a plusieurs problèmes dans le code qui provoquent des comportements étranges. Tout d'abord, il n'y a pas de vérification d'erreur pour les choses comme Inf et NaN lorsque vous définissez a1: a4 et b1: b4. Si vous passez des valeurs à la fonction qui cause la division par un zéro alors vous recevrez Inf ou dans le cas de 0/0 alors vous recevrez NaN.

En second lieu, la logique dans les if déclarations ne tiennent pas compte lorsque la valeur est égale à f(i,j) aux valeurs de l'une ou r1,r2,r3L-1. Troisièmement, il n'y a pas de normalisation de T(i,j) sur l'échelle de 0 à 255. Cela signifie que si votre valeur est supérieure à 255 et que vous lancez T comme uint8, elle deviendra 255. C'est probablement la raison pour laquelle votre première image était toute blanc. imread interprète 255 comme blanc et 0 comme noir.

Ce code ne sera également bon que pour les images en noir et blanc. Si vous souhaitez utiliser RVB, vous devrez prendre en compte une troisième dimension de couleur.