Image Matlab距离-伽马校正

Image Matlab距离-伽马校正,image,matlab,image-processing,range,gamma,Image,Matlab,Image Processing,Range,Gamma,你能告诉我如何拍摄一幅图像吗?我想对0:120 gamma=1.8范围内的像素和120:255 gamma=0.5范围内的像素进行“cameran.tif”的gamma校正 但所有像素都转到第一个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 te

你能告诉我如何拍摄一幅图像吗?我想对0:120 gamma=1.8范围内的像素和120:255 gamma=0.5范围内的像素进行“cameran.tif”的gamma校正

但所有像素都转到第一个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)
a=imread('cameran.tif');
gamma1=2;
gamma2=0.5;
N=尺寸(a);
out=零(N);
对于i=1:N
对于j=1:N
温度=a(i,j);

如果temp>0&temp120&temp您的第二个
if
语句使用访问变量
kx
ky
。。。。我假设您想使用
I
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

第一行和第二行代码当然很熟悉。第三行代码找到一个
逻辑
掩码,我们在其中搜索0到120之间的强度。找到这些值后,我们使用相同的逻辑掩码索引原始图像,只访问这些值,将每个值平方,并将它们设置在输出的相同空间位置。对于最后一行代码也可以这样说,在120到255之间搜索,但取而代之的是平方根。我们最终转换到
uint8
进行显示。

而且,我相信您现在正在编辑,最好是矢量化:-)@LuisMendo:D。。。是的,等待另一只鞋掉下来意味着发生了某些事件或某些事实已经向你解释过,但没有完全解释清楚。。。。一旦你发现结尾给了你什么,那就是在等待另一只鞋掉下来。@Knight你必须将你的图像转换为
双精度
。“我要改变我的答案。”奈特明白了。现在试试看。当
im2double
将图像转换为
[0,1]
时,我忘记您在
uint8
中指定了搜索范围。我只是用手工铸造来代替。@Knight:D一点问题都没有。顺便说一句,我更正了你的原始代码,这样你就可以看到哪里出了问题。。。但是完全矢量化了。你不会后悔的!
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);