2017-10-18 962 views
1

我已經生成了一個函數來對圖像應用分段線性變換。基於這個功能,我不確定它是否正確執行。有時整個圖像顯示爲白色,所有像素列爲255.其他時間顯示輸出圖像,但結果不同。由於結果不同,我相信我的功能存在問題。該函數的代碼是在這裏: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) 

下面是我的一些測試結果:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

根據我的代碼,爲什麼我會收到不同的結果?

回答

1

代碼中存在多個問題,導致事情行爲異常。

首先,在定義a1:a4和b1:b4時,不會檢查Inf和NaN之類的錯誤。如果您將值傳遞給導致被零除的函數,那麼您將收到Inf或在0/0的情況下,您將收到NaN。

其次,if語句中的邏輯沒有考慮f(i,j)的值是否等於r1,r2,r3L-1的值。

第三,T(i,j)在0 - 255的範圍內沒有標準化。這意味着如果您的值大於255,並且您將T轉換爲uint8,則它將變成255.這可能是您的第一張圖像全是爲什麼白色。 imread將255解釋爲白色,將0解釋爲黑色。

此代碼只適用於黑白圖像。如果你想使用RGB,那麼你將不得不考慮第三個顏色尺寸。