2016-05-27 9 views
1

Не могли бы вы рассказать мне, как взять ряд изображений? Я хочу сделать гамма-коррекцию «cameraman.tif» для пикселей в диапазоне 0: 120 гамма = 1,8, для пикселей в диапазоне 120: 255 гамма = 0,5Диапазон Matlab - коррекция гаммы

Но все пиксели идут в первом случае, если утверждение так что я не могу для применения второй гаммы.

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) 

ответ

2

Вашего второй 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 

kx и ky были установлены где-то в вашем коде и никогда не меняется, так что это означает, что, если и когда вторая if утверждение не произойдет, установка гаммы происходит только в одном месте определяется только в kx и ky. Мой совет вам должен был написать фактическую функцию , чтобы вы не перекрестно загрязняли переменные в разных рабочих областях. Включив это в функцию, вы сразу сообщите вам, что kx и ky не определены.

BTW, я бы предпочел, чтобы вы делали это более эффективно без петель. Вы можете легко выполнить те же операции, что и векторы. Однако для этого требуется преобразовать изображение в double, поскольку тип по умолчанию - 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 для отображения.

+1

И, поскольку я уверен, что вы редактируете прямо сейчас, лучше сделать векторизованное :-) –

+0

Ха-ха, eccolo qua –

+0

@LuisMendo: D: D: D lol ... ждет, пока другая обувь не упадет, а? – rayryeng

Смежные вопросы