Matlab范围 - 伽玛校正

时间:2016-05-27 23:20:42

标签: image matlab image-processing range gamma

你能告诉我如何拍摄一系列图像吗?我想对" cameraman.tif"进行伽玛校正。对于范围0:120伽马= 1.8的像素,对于范围120:255伽马= 0.5

的像素

但是所有像素都会转到第一个if语句,所以我无法应用第二个gamma。

a = imread('cameraman.tif');
gamma1 = 2;
gamma2 = 0.5;
N =size(a);
out = zeros(N);
for i=1:N
  for j=1:N
    temp=a(i,j);
    if temp>0&temp<120
       out(i,j)=temp.^2;
    end
    if temp>120&temp<=255
       out(kx,ky)=temp.^0.5;
    end
 end
end
imshow(out)

1 个答案:

答案 0 :(得分:2)

您的第二个if语句使用访问变量kxky ....我假设您要使用ij:< / p>

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

kxky已设置在代码中的其他位置并且永远不会更改,因此这意味着如果第二个if语句确实发生,则仅设置gamma发生在仅在kxky定义的一个位置。我给你的建议是编写一个实际的函数,这样你就不会在不同的工作空间中交叉污染变量。在函数中包含此函数会立即向您发出错误,告诉您kxky未定义。

顺便说一下,我宁愿你在没有循环的情况下更有效地做到这一点。您可以非常轻松地执行矢量化的相同操作。但是,这需要您将图像转换为double,因为Cameraman图像的默认类型为uint8。因此,使用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进行展示。