簡體   English   中英

MATLAB分段線性變換函數

[英]MATLAB Piecewise Linear Transformation Function

我已經生成了將分段線性變換應用於圖像的函數。 基於此功能,我不確定它是否正常運行。 有時,整個圖像顯示為白色,所有像素顯示為255。其他時間,雖然顯示輸出圖像,但結果有所不同。 由於結果各異,我認為我的功能存在問題。 該函數的代碼在這里:

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)

以下是一些測試的結果:

在此處輸入圖片說明

在此處輸入圖片說明

在此處輸入圖片說明

在此處輸入圖片說明

在此處輸入圖片說明

在此處輸入圖片說明

根據我的代碼,為什么我收到不同的結果?

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

首先,在定義a1:a4和b1:b4時,不會檢查Inf和NaN之類的錯誤。 如果將值傳遞給導致零除的函數,則將收到Inf;如果是0/0,則將收到NaN。

其次,當f(i,j)值等於r1,r2,r3L-1的值時, if語句中的邏輯不考慮在內。

第三,沒有在0-255范圍內對T(i,j)進行歸一化。這意味着,如果您的值大於255,並且將T強制轉換為uint8,則它將變為255。這很可能是您的第一張圖片是全白。 imread將255解釋為白色,將0解釋為黑色。

同樣,此代碼僅適用於黑白圖像。 如果要使用RGB,則必須考慮第3種顏色尺寸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM