2017-05-11 4 views
0

数字のいずれかがkの場合、の値をa[][]の値に置き換えます。したがって、numのすべての値は、kの各場所に対応しています。例えばkが20に達した場合、2dの配列に20があれば、私はnum[19]にあるものをすべて20に置き換えたいと思いますが、試してみるとそれらはすべて歪んだ数字になり、その理由を見つけることができません。私のforループが間違って設定されているのでしょうか、それ以外に問題がありますか?1d配列を使用して2d配列の値を変更するにはどうすればよいですか?

#include<iostream> 

int main(){ 
//other code that uses a file to make 2d array 
int width, height, maxval; 
fin >> P2 >> width >> height >> maxval; 
int **a = new int *[height]; 
for (int i = 0; i < height; i++) 
    a[i] = new int[width]; 
for (int i = 0; i < height; i++) 
{ 
    for (int j = 0; j < width; j++) 
    { 
     fin >> a[i][j]; 
    } 
} 

} 


void eq(int **a, int h, int w) { 

    int num[255]; 
double num1[255]; 
double prob[255], cumul[255]{ 0 }; 
double x, y, z=0; 
for (int k = 1; k <= 255; k++) 
{ 
    int temp = 0; 
    for (int i = 0; i < height; i++) { 
     for (int j = 0; j < width; j++) {//counts the repeated pixel values 
      if (pix[i][j] == k) 
      { 
       temp += 1; 
      } 
     } 
    } 
    num1[k - 1] = temp; 
} 

for (int i = 0; i < 255; i++) { 

    prob[i] = (num1[i]/(height*width));//show the decimal number of how many pixel values are in the image over the total 
    cout << prob[i] << endl; 
} 

for (int i = 0; i < 255; i++) { 
    y = prob[i]; 
    x = y + z; 
    z = x;// adds all the probabilities to make the sum 
    cumul[i] =x;  
    cout << cumul[i] << endl; 
} 

for (int i = 0; i < 255; i++) { 

    num[i] =floor(cumul[i]*255);// converts the cumulative number to the new pixel value and sets it in a array 

} 

    for (int k = 1; k <= 255; k++) {//loop that is not coming out right 
     for (int i = 0; i < h; i++) { 
      for (int j = 0; j < w; j++) { 

       if (a[i][j] == k) 
       { 
        a[i][j] =num[k-1]; 
       } 
      } 
     } 
    } 
} 

基本的に私は、PGM画像をより明確にするためにヒストグラム均等化を扱う機能を作っています。 main関数では、pgmファイルを呼び出して、すべてのピクセル値を2次元配列に設定しています。だからnum[]は私が新しいピクセル値を作る部分ですが、何かの理由で私が例えばa[0][0]と呼んだときには、それらの値が両方とも対応する強度を持っていないことを意味するので、私がそれを呼び出すたびに、私は255か他の乱数を得る。

+0

私はA [] [をasume ]とnum []はあなたがこれを作るときにいっぱいですか? –

+0

Yea a [] []はメイン関数を埋めるポインタであり、num []はvoidで作成されています。 – Johnny

+0

私に喜ばれますか?(1)[] []がどのように宣言され、どのスコープと(2 )あなたが得ている出力。 –

答えて

0

私はあなたが何をしたいのか理解していれば、この行:

a[i][j] =num[i]; 

は次のようになります。

a[i][j] =num[k-1]; 

あなたがしたいので:

if(a[i][j] = k = 20){ 
    a[i][j] = num[k-1 = 19] 
} 
+0

申し訳ありませんが、私の部品に誤植がありましたが、まだ試していません。しかし、ありがとう。 – Johnny

関連する問題