Я реализую двумерный корреляционный код с нуля, и у меня есть простая матрица изображений 3×3 типа unsigned char:
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, но тип все еще остается как беззнаковый символ?
Я знаю, что мой вопрос может быть неуместным, поскольку диапазон беззнаковых символов составляет от 0 до 255, но я хотел убедиться, что я что-то упустил. Мне также известно о том, что отрицательные числа конвертируются в дополнение к 2.
Кстати, это не домашняя работа, я просто работаю над C / C ++ с точки зрения обработки изображений.
Как я могу сохранить результат как -149, но тип все еще остается как беззнаковый символ?
Не делай этого. Используйте целочисленный тип со знаком.
использование int
Если увеличение использования памяти не является проблемой.
В противном случае используйте short
,
При вычислении градиента [-X 0 X] на изображении с диапазоном [0 max] ваши результаты попадают в диапазон [-XМакс, ХМаксимум]. Есть разные способы справиться с этим в соответствии с вашими потребностями и ограничениями:
Теперь, когда я выполняю корреляцию, результат из первой строки математически равен -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]