2015-09-02 1 views
0

Я хочу преобразовать матричный тип 256 * 256 uint8 в 256 * 256 матрицу типа double, но когда я использую im2double(), она дает мне 1 * 1 матрица типа double.im2double дает матрицу 1 * 1 при применении к матрице 256 * 256 в matlab R2014a

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

код выглядит следующим образом:

b=imread('cameraman.tif'); 
 
[m,n] = size(b); 
 
c=input('enter value of c'); 
 
gamma=input('enter value of gamma'); 
 
I2 = im2double(b); 
 

 
for i=1:m 
 
    for j=1:n 
 
     
 
     I2=c*power(I2(i,j),gamma); 
 
       
 
     
 
    end 
 
end 
 
    
 
    imshow(I2,[]);

ответ

0

не используйте im2double, ваша матрица b - это только что, матрица [256 x 256]. Просто используйте double(b), или, как один лайнер: b=double(imread('cameraman.tif'));

Вы можете наиболее вероятно улучшить на петле for, а также (путем полного удаления его в пользу vectorising вашего уравнения), используйте bsxfun:

I2 = c*bsxfun(@power, b, gamma); 

Точно так же, как запоздалая мысль:

I2 = c*b.^gamma; 

может работать, но я не тестировал это.

+0

im2double все еще дает мне матрицу 1 * 1, и когда я использую функцию bsxfun, она дает эту ошибку: «Целые числа могут быть подняты только до положительных целых полномочий». после того, как я конвертирую, используя double, как и предложил в первой строке. Но ваше второе решение работает хорошо. Я не могу использовать функцию im2double, но в документации и других примерах в Интернете работает нормально. Любой намек на это. Спасибо за ан, хотя код начал работать. –

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