【问题标题】:MATLAB Piecewise Linear Transformation FunctionMATLAB 分段线性变换函数
【发布时间】:2017-10-19 09:58:32
【问题描述】:

我已经生成了一个对图像应用分段线性变换的函数。基于此功能,我不确定它是否正确执行。有时整个图像显示为白色,并且所有像素都列为 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)

以下是我的一些测试结果:

根据我的代码,为什么我会收到不同的结果?

【问题讨论】:

    标签: matlab image-processing


    【解决方案1】:

    代码中有多个问题导致行为异常。

    首先,在定义 a1:a4 和 b1:b4 时,不会检查 Inf 和 NaN 之类的错误。如果您将值传递给导致除以零的函数,那么您将收到 Inf,或者在 0/0 的情况下,您将收到 NaN。

    其次,当f(i,j) 的值等于r1,r2,r3L-1 的值时,if 语句中的逻辑不考虑。

    第三,T(i,j) 在 0 - 255 的范围内没有标准化。这意味着如果您的值大于 255,并且您将 T 转换为 uint8,它将变为 255。这可能是您的第一张图片的原因全白。 imread 将 255 解释为白色,将 0 解释为黑色。

    此外,此代码仅适用于黑白图像。如果您希望使用 RGB,则必须考虑第三个颜色维度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多