Вот мой фрагмент кода;
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 для целых элементов. Что я могу сделать, чтобы эти заявления работали с разумной точностью? Это касается ограничения типа данных, которые я использовал?
Вы пытаетесь нормализовать числа между 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));
}
}
Я полагаю, что ваша проблема в 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];
ЕСЛИ imageHost[i*nWidth+j]
меньше чем max-min
затем
imageHost[i*nWidth+j]/(max-min)
будет ноль. Так как unsigned char
не может хранить реальные значения между [0.0 .. 1.0]
Для большей точности вы должны использовать арифметику с плавающей точкой.