我已经生成了一个将分段线性变换应用于图像的函数。基于此功能,我不确定它是否正确执行。有时整个图像显示为白色,所有像素显示为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)
以下是我的一些测试结果:
根据我的代码,为什么我会收到不同的结果?
答案 0 :(得分:2)
代码中存在多个问题,导致行为异常。
首先,在定义a1:a4和b1:b4时,没有错误检查诸如Inf和NaN之类的东西。如果将值传递给导致除以零的函数,那么您将收到Inf,或者在0/0的情况下,您将收到NaN。
其次,当if
的值等于f(i,j)
或r1,r2,r3
的值时,L-1
语句中的逻辑不会考虑。
第三,在0到255的范围内没有T(i,j)
的规范化。这意味着如果你的值大于255并且你将T转换为uint8它将变为255.这可能是你的第一个原因图像全是白色的。 imread
将255解释为白色,将0解释为黑色。
此代码也只适用于黑白图像。如果您希望使用RGB,则必须考虑第3种颜色尺寸。