2013-09-13 8 views
1

Когда я реализую следующий код, я получаю проблему в значении M. Он дает 1 для всех значений M (i, j). Как я могу решить эту проблему ???Получение ошибки в следующем коде

img = rgb2gray(imread('Einstein.bmp')); 
img1 = double(img); 
M = double(zeros(size(img,1),size(img,2))); 
for i=1:size(img,1) 
    for j=1:size(img,2) 
     M(i,j)=1+(double(exp(-img1(i,j)))); 
    end 
end 

Проблема заключается в том, когда я пишу М (I, J) = (двойной (ехр (-img1 (I, J))));, тогда я получаю значения с плавающей запятой в M, но когда я пишу M (i, j) = 1 + (double (exp (-img1 (i, j))));, тогда я получаю все значения матрицы M как 1.

Пожалуйста, помогите мне.

+5

Вы проверили значения в 'img1'? В стороне, в MATLAB, вам не нужны петли для такого рода расчетов. 'M = 1 + exp (-img1)' приведет к идентичному результату. – sebastian

+0

вы можете даже записать его в одной строке: 'M = 1 + exp (-1 * double (rgb2gray (imread ('E.bmp'))));' – bla

ответ

0

Это в основном происходит из-за пределов количества значащих цифр double. Я попытался простой кусок кода:

for(i=0:255) 
    if(exp(-i)+1==1) 
     i 
     break 
    end 
end 

Это дает 37 на моем компьютере, который в основном говорит, что любое значение в img1, которое больше или равно 37 будет отображать 1 на с экспоненциальной, так как 1+exp(-img1) превышает число значащих цифр double позволяет (мы настаиваем на том, что место установки является значащей цифрой). Очевидно, это не проблема, когда вы просто принимаете exp(-img1), так как там просто показатель, который нужно изменить, а не количество значащих цифр.

В зависимости от того, почему вы хотите принять 1+exp(-img1), я предлагаю попытаться нормализовать значения на изображении, чтобы он находился в пределах [0,30], или с использованием целочисленных значений от [0 ... 255] от img1 сам.

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