C беззнаковая арифметическая операция не работает должным образом

Вот мой фрагмент кода;

Npp8u * imageHost;
typedef unsigned char Npp8u;
...
for (int i=0;i<nHeight;++i)
{
for (int j=0;j<nWidth;++j)
{
printf("number_befre : %u\n",imageHost[i*nWidth+j] );
imageHost[i*nWidth+j] = imageHost[i*nWidth+j]-Npp8u(min);
imageHost[i*nWidth+j] = imageHost[i*nWidth+j]/(max-min);
printf("number : %u\n",imageHost[i*nWidth+j] );
}
}
...

Некоторые значения присваиваются max = 202 а также min = 0 и извлечено из imageHost. Я исправил это с помощью отладки, но содержание imageHost 0 для целых элементов. Что я могу сделать, чтобы эти заявления работали с разумной точностью? Это касается ограничения типа данных, которые я использовал?

-2

Решение

Вы пытаетесь нормализовать числа между 0,0 и 1,0. Но тип данных, который вы выбрали, не подходит для этого, поскольку он может обрабатывать только целые числа. Вам нужен код что-то вроде этого

typedef unsigned char Npp8u;
Npp8u * imageHost = ...;
vector<float> normalizedImageHost(nHeight*nWidth)
...
for (int i=0;i<nHeight;++i)
{
for (int j=0;j<nWidth;++j)
{
normalizedImageHost[i*nWidth+j] = (float)(imageHost[i*nWidth+j] - min)/
(max - min);
}
}

Другим вариантом было бы сохранить Npp8u но используйте коэффициент масштабирования. Например, мы могли бы умножить все значение на максимальное значение Npp8u, которое составляет 255.

typedef unsigned char Npp8u;
Npp8u * imageHost = ...;
...
for (int i=0;i<nHeight;++i)
{
for (int j=0;j<nWidth;++j)
{
imageHost[i*nWidth+j] = (Npp8u)((255.0*(imageHost[i*nWidth+j] - min))/
(max - min));
}
}
2

Другие решения

Я полагаю, что ваша проблема в imageHost памяти. проверьте его память. (если возможно, опубликуйте предыдущие строки)
или сделайте это и отладьте программу для значения переменной первой строки (точка останова во второй строке):

Npp8u  x=Npp8u(min);
imageHost[i*nWidth+j] = imageHost[i*nWidth+j]-x;

Вы получаете память для imageHost (сделайте это):

Npp8u ** imageHost=new *Npp8u*[nHeight];
for(int i=0;i<nHeight;i++)
imageHost[i]=new Npp8u[nWidth];
0

ЕСЛИ imageHost[i*nWidth+j] меньше чем max-min затем

imageHost[i*nWidth+j]/(max-min)

будет ноль. Так как unsigned char не может хранить реальные значения между [0.0 .. 1.0]

Для большей точности вы должны использовать арифметику с плавающей точкой.

0