2013-04-20 67 views
-2

这是我的代码片段;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 = 202min = 0和从imageHost萃取。我通过调试纠正了它,但整个元素的内容为imageHost。我能做些什么来使这些陈述以合理的精度工作?这是关于我使用的数据类型的限制吗?

+0

'Nppu(min)'无效C.您是否将其编译为C++? – 2013-04-20 13:09:32

+0

抱歉的代码是缺乏,我编辑 – erogol 2013-04-20 13:09:44

+0

这实际上是cuda代码,但主机端 – erogol 2013-04-20 13:12:06

回答

0

IFimageHost[i*nWidth+j]然后小于max-min

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

将为零。因为unsigned char不能[0.0 .. 1.0]

之间真正的值存储具有更高的精度,你应该使用浮点运算。

+0

imageHost属于同一类型,并从中提取最大值和最小值。 – erogol 2013-04-20 13:17:25

+0

由于我所执行的计算的性质,所有值都不可能代数为0,但由于我使用的数据类型可能为0,因此我期望听到的解决方案不是问题。无论如何谢谢 – erogol 2013-04-20 13:22:29

+0

我不明白downvote的原因?! – deepmax 2013-04-20 13:25:03

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]; 
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)); 
    } 
}