Matlab преобразование значений пикселей в двойную точность

Я новичок в Matlab, поэтому это должен быть простой вопрос. У меня есть изображение с несколькими определенными пикселями, из которых мне нужно получить красные компоненты RGB, суммировать их и сохранить результат в переменной. По умолчанию эти значения имеют тип uint8, поэтому сумма не может превышать 255. Я пытался использовать каждую комбинацию double() для преобразования значения R в двойное, но ничего не работает. Вот что именно происходит, скопировано из терминала: (Все пиксели имеют значения R выше 200)

img = imread('img.png');
r = img(64,64,1)
r =
    224
r = r + double(img(64,65,1))
r =
    255
r = r + double(img(64,66,1))
r =
    255

Что я делаю неправильно? Я не могу преобразовать эти значения в двойные?


person user1804208    schedule 07.09.2016    source источник
comment
как насчет r = double(img(64,64,1))?   -  person beaker    schedule 08.09.2016
comment
в данном конкретном случае, вероятно, было бы проще сделать sum(img(64,64:66,1))   -  person beaker    schedule 08.09.2016
comment
Я заметил, что вы не приняли ответы ни на один из ваших вопросов. Прочтите stackoverflow.com/help/someone-answers.   -  person beaker    schedule 09.09.2016


Ответы (2)


Для обработки изображений в большинстве случаев рекомендуется использовать функцию im2double для преобразования прочитанного изображения в двойной массив между 0-1 как таковой:

img = im2double(imread('img.png'));

Тогда вам больше не нужно беспокоиться о типе данных в той же программе.

Преобразование типа данных только с double() почти никогда не делает того, что вы хотели для изображений, поскольку изображения uint8 и double различаются как типом данных, так и диапазоном данных.

person Mingjing Zhang    schedule 08.09.2016

Что происходит в строке r = r + double(img(64,65,1)), так это то, что значение img(64,65,1) преобразуется в double, но затем немедленно преобразуется обратно в class(r), потому что r является целочисленным классом и имеет приоритет в операциях. Обратите внимание, что class(int64(10)+10) возвращает int64. Ключевым моментом здесь является, как прокомментировал стакан, сначала преобразовать r в double.

Возможно, вам не придется беспокоиться об использовании double() для преобразования; double могут представлять целые числа до 2^53-1, что намного выше 255. Поэтому, если вы просто выполняете простые операции суммирования пикселей или что-то в этом роде, вы не потеряете точность в вычислениях. Конечно, если вам нужно поместить его обратно в изображение, то насытится что-нибудь около 255. Таким образом, может иметь больше смысла в зависимости от того, что вы делаете, чтобы изменить масштаб между 0 и 1; в этом случае, как предложил Минцзин, лучше всего использовать im2double.

person CKT    schedule 08.09.2016