-2

这是我的代码片段;

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

一些值被分配给imageHostmax = 202min = 0从中提取。我通过调试对其进行了纠正,但imageHost整个元素的内容为 0。我还能做些什么来使这些陈述以合理的精度发挥作用?这是关于我使用的数据类型的限制吗?

4

3 回答 3

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));
    }
}
于 2013-04-20T13:26:17.770 回答
0

IF imageHost[i*nWidth+j]小于max-min那时

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

将为零。因为unsigned char不能存储真实值之间[0.0 .. 1.0]

为了获得更好的准确性,您应该使用浮点运算。

于 2013-04-20T13:15:15.370 回答
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];
于 2013-04-20T13:15:46.177 回答