найти обратное логарифмическое преобразование изображения в Matlab

Я искал это почти весь день. Общая форма логарифмического преобразования:

s = clog(1+r) 

куда

c = 0.1 

Противоположным является обратное логарифмическое преобразование (книга). Каким будет обратное логарифмическое преобразование? Это

s = exp(r)?

Не удалось получить правильный вывод.


person user461127    schedule 15.10.2011    source источник


Ответы (4)


Exp() будет обратным Log() только в том случае, если Log() является натуральным логарифмом. Если ваш Log() использует другое основание (основание 2, основание 10, любое другое произвольное основание), вам нужно будет использовать другое основание вместо e в Exp().

Обновить

Попробуйте 10^(x/0.1)-1. x/0.1 отменяет операцию 0.1 *, 10^ отменяет log(), а -1 отменяет +1.

person sarnold    schedule 15.10.2011
comment
используя базу по умолчанию 10. - person user461127; 16.10.2011
comment
+1 Думаю, будет удобнее читать, если использовать 0.1 вместо .1 - person Amro; 16.10.2011
comment
log в MATLAB — натуральный логарифм. 10^ неверно, используйте вместо него exp. - person Cris Luengo; 10.12.2018

Я думаю, вы определили c для нормализации результирующего изображения до допустимого (видимого) диапазона. Тогда рациональное значение для c может быть:

c = (L - 1)/log(L) 

где L — количество уровней серого. Итак, s будет:

s = log(r+1) .* ((L – 1)/log(L)) 

or

s = log(r+1) .* c

Тогда обратное преобразование будет:

s2 = (exp(r) .^ (log(L) / (L-1))) – 1

or

s2 = (exp(r) .^ (1/c)) – 1

Это результат преобразования для L=256:

введите здесь описание изображения

Чтобы применить это преобразование к изображению, нам нужно выполнить приведение типов:

figure;
L = 256;
I = imread('cameraman.tif');
log_I = uint8(log(double(I)+1) .* ((L - 1)/log(L)));
exp_I = uint8((exp(double(I)) .^ (log(L) / (L-1))) - 1);
subplot(2, 2, [1 2]); imshow(I); title('Input');
subplot(2, 2, 3); imshow(log_I); title('\itlog(I)');
subplot(2, 2, 4); imshow(exp_I); title('\itexp(I)');

введите здесь описание изображения

person saastn    schedule 14.02.2016

Вы можете использовать степенное преобразование, чтобы сделать это, так как в степенном преобразовании вы можете сдвинуть кривую, чтобы выполнить логарифмическое преобразование или выполнить обратное логарифмическое преобразование, которое влияет на пиксели высокого уровня, но не на пиксели низкого уровня. Вы можете использовать это

a=imread('Figure-3.tif');
a=im2double(a);
[r,c]=size(a);
gamma=0.6;
C=1;
for i=1:r
for j=1:c
   s(i,j)=C*(a(i,j)^gamma);
end
end
imshow(s);
person Wajahat    schedule 13.04.2013
comment
повторный откат моих правок ваших саморекламных, нераскрытых, несвязанных ссылок приведет к тому, что ваши сообщения будут рассматриваться как спам. Просто дружеское уведомление. - person Andrew Barber; 26.04.2013

Это работает для обратного логарифмического преобразования

clc;
clear all;
close all;
a=imread('imagename.jpg');
ad=im2double(a);
x=ad;
[r,c]=size(ad);
factor=1;
for i=1:r
    for j = 1:c
  x(i,j)= exp(ad(i,j)^factor)-1;
    end
end
subplot(1,2,1);imshow(ad);title('before');
subplot(1,2,2);imshow(x);title('after');
person Aksa    schedule 09.12.2018