1

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

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

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)
4

1 回答 1

2

您的第二个if语句使用访问变量kxand ky.... 我假设您想使用iand 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

kxky在您的代码中的其他位置设置并且永远不会更改,因此这意味着如果并且当第二if条语句确实发生时,伽玛的设置仅发生在仅定义在的一个位置kxand 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用于显示。

于 2016-05-27T23:24:32.100 回答