您的第二个if
语句使用访问变量kx
and ky
.... 我假设您想使用i
and j
:
out(i,j)=temp.^0.5;
您还必须确保强度是双精度才能使平方根起作用。因此,请确保将每个位置读取的强度转换为,然后在完成double
后转换回。uint8
实际上,在扫描整个图像后进行转换。
for i=1:N
for j=1:N
temp=double(a(i,j)); % Change
if temp>0&temp<120
out(i,j)=temp.^2;
end
if temp>120&temp<=255
out(i,j)=temp.^0.5; % Change
end
end
end
out = uint8(out); % Change
kx
并ky
在您的代码中的其他位置设置并且永远不会更改,因此这意味着如果并且当第二if
条语句确实发生时,伽玛的设置仅发生在仅定义在的一个位置kx
and ky
。我对您的建议是编写一个实际的函数,这样您就不会在不同的工作空间中交叉污染变量。在函数中包含它会立即给您一个错误,告诉您kx
并且ky
没有定义。
顺便说一句,我宁愿你在没有循环的情况下更有效地做到这一点。您可以非常轻松地执行矢量化的相同操作。但是,这要求您将图像转换double
为默认类型uint8
,即 Cameraman 图像。因此,使用double
将图像转换为double
,进行伽玛校正,然后使用 转换回来uint8
:
a = double(imread('cameraman.tif'));
out = zeros(size(a));
out(a > 0 & a < 120) = a(a > 0 & a < 120).^2;
out(a >= 120 & a <= 255) = a((a >= 120 & a <= 255).^0.5;
out = uint8(out);
第一行和第二行代码当然很熟悉。第三行代码找到一个logical
掩码,我们在其中搜索 0 到 120 之间的强度。一旦我们找到这些值,我们使用相同的逻辑掩码来索引原始图像,并且只访问这些值,对每个值求平方并将它们设置在输出的相同空间位置。对于您在 120 到 255 之间搜索的最后一行代码也是如此,但您取而代之的是平方根。我们最终转换为uint8
用于显示。