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

一部の値は、imageHost に割り当てられmax = 202min = 0imageHost から抽出されます。デバッグで修正しましたが、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メモリだと思います。メモリをチェックします(可能であれば前の行を投稿します)。または、これを実行して、最初の行の変数値(2 行目のブレークポイント)のプログラムをデバッグします。

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 に答える