2016-02-23 4 views
3

Я реализую 2D код корреляции с нуля и у меня есть простая матрица 3x3 изображений типа неподписанного символа:Отрицательных числа типа неподписанного символа

unsigned char Image = [184 0 35 
         48 107 193 
         29 166 32] 

Моего корреляционного ядро ​​

   Kernel = [-1 0 1] 

Теперь, когда Я выполняю корреляцию, результат из первой строки равен -149 математически, но напечатанный результат равен 107 (дополнение 2).

unsigned char res = -1.F *(Kernel[i-1]) + (Kernel[i+1]); 

Не правда ли, что это ошибка? Как сохранить результат как -149, но тип по-прежнему остается неизменным? Я знаю, что мой вопрос может быть нецелесообразным, так как диапазон unsigned char равен 0 - 255, но я хотел убедиться, что у меня что-то не хватает. Я также знаю, что отрицательные числа преобразуются в дополнение к 2.
BTW, это не домашнее задание, я просто работаю над C/C++ с точки зрения обработки изображений.

+1

-149 не может быть представлен на 'char'. 'char' ограничен диапазоном -128 .. + 127. Используйте 'int' вместо' unsigned char'. –

+0

184 - это int (подпись), -1 - int, умножение - int, затем преобразование и понижение до уровня, равного 107 –

+0

. Я не понимаю ваш вопрос. Если вам нужно отрицательное значение, то, очевидно, вы не можете сохранить его в неподписанном типе. Использовать подписанный тип (например, 'int', поскольку' char' также не будет достаточно большим). – interjay

ответ

2

Как сохранить результат как -149, но тип по-прежнему остается неизменным?

Не делайте этого. Используйте подписанный интегральный тип.

Используйте int, если увеличение использования памяти не является проблемой.
Неисправность это, использование short.

+0

Эффективность памяти также является моей проблемой. Может быть, я должен изменить тип изображения результата на «короткий int». – Tanya

+0

@ Таня, я бы настоятельно советовал это. –

+0

@R Sahu Ok. Но в большинстве учебных пособий изображения представлены как 'unsigned char'. Поэтому я пытаюсь закодировать этот путь. – Tanya

0

Теперь, когда я выполняю корреляцию, результат первой строки равен -149 математически, но напечатанный результат равен 107 (дополнение 2). Разве это не ошибка?

unsigned char res = -1.F *(Kernel[i-1]) + (Kernel[i+1]); 

Сохранение отрицательного значения в переменной без знака, как res, не изменяет тип res. Это навсегда unsigned char. Отрицательное значение преобразуется путем многократного добавления/(или вычитания) UCHAR_MAX + 1 (256) и до тех пор, пока оно не находится в диапазоне unsigned char или в этом случае: 107.

Чтобы сохранить отрицательное значение и иметь отрицательное значение, удерживаемое в res, использовать подписанный тип, который отвечает требованиям диапазон:

Type   Range of Type 
signed char at least [-127 to 127]  Varies by platform 
signed short at least [-32767 to 32767] Varies by platform 
int8_t  exactly [-128 to 127] 
int16_t  exactly [-32768 to 32767] 
1

При вычислении градиента [-X 0 X] на изображении диапазона [0 max], ваши результаты попадают в диапазон [-X max, X max]. Существуют различные способы обращения с ним в соответствии с вашими потребностями и ограничениями:

  1. Если у вас нет проблем с памятью, вы увеличиваете кодировку (байт -> короткий, короткий -> int).
  2. Если вы заинтересованы, но интенсивность градиента, а не его знак, вы сначала применяете абсолютное значение, чтобы получить новый результирующий диапазон [0, X * max], и вы идете применить третье решение.
  3. Вы растягиваете свои в результате вы примените растягивание гистограммы (линейная функция): [-X max, X max] -> [0 max]. К сожалению, это решение теряет большую точность.Например, это решение теряет половину точности (от [-255, 255]] до [0, 255]), за исключением случаев, когда вы применяете точку 2 до этого.