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 и двойните изображения се различават по и двата типа данни и обхвата на данните.

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() за извършване на преобразуването; двойките могат да представляват цели числа до 2^53-1, което е много по-високо от 255. Така че, ако просто правите прости операции за сумиране на пиксели или подобни неща, няма да загубите никаква точност в изчисленията. Разбира се, ако трябва да го върнете обратно в изображение, тогава всичко около 255 ще се насити. Така че може да има повече смисъл в зависимост от това какво правите да премащабирате нещата, за да бъдат между 0 и 1; в такъв случай, както предложи Mingjing, най-добре е да използвате im2double.

person CKT    schedule 08.09.2016