这是我的代码片段;
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 :(得分: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));
}
}
答案 1 :(得分:0)
IF imageHost[i*nWidth+j]
小于max-min
imageHost[i*nWidth+j]/(max-min)
将为零。因为unsigned char
无法在[0.0 .. 1.0]
为了更好的准确性,您应该使用浮点运算。
答案 2 :(得分:0)
我猜你的问题是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];