2011-12-31 35 views
0

私は色の行列を持っています(各ピクセルは0から9までの値を持つことができます)。私がしたいのはノイズを減らすことです。同じ色を持つ5つ以上の隣接ピクセルがその色に変更されます。私は、隣接ピクセル数を保持する配列[0-9]を定義します。たとえば、6ピクセルの値が8で、2の値が5の場合、配列はこのようになります[0,0,0,0,0、 2,0,6,0,0]しかし、私は配列の最初の要素(配列[0])の値が間違っている、それは8で始まり、8回パルスごとに!ここにコードがあります。 私に助けてもらえますか?OpenCVで奇妙な配列エラー

::Error image link::

void Noise_Reduction(CvMat* Color_mat,boolean showresult){ 
int tv[__COLORNUM]={0,0,0,0,0,0,0,0,0}; 
int counter; 

for(int y=1;y<Color_mat->height-1;y++) 
{ 
    for(int x=1;x<Color_mat->width-1;x++) 
    { 
     for(int i=0;i<9;i++,tv[i]=0);   
     tv[CV_MAT_ELEM(*Color_mat,uchar,y-1,x-1)]++; 
     tv[CV_MAT_ELEM(*Color_mat,uchar,y-1,x )]++; 
     tv[CV_MAT_ELEM(*Color_mat,uchar,y-1,x+1)]++; 
     tv[CV_MAT_ELEM(*Color_mat,uchar,y ,x-1)]++; 
     tv[CV_MAT_ELEM(*Color_mat,uchar,y ,x+1)]++; 
     tv[CV_MAT_ELEM(*Color_mat,uchar,y+1,x-1)]++; 
     tv[CV_MAT_ELEM(*Color_mat,uchar,y+1,x )]++; 
     tv[CV_MAT_ELEM(*Color_mat,uchar,y+1,x+1)]++; 
     for(int i=0;i<9;i++){ 
     std::cout<<tv[i]<<",";} 
     std::cout<<endl; 
     int max=0; 
     int indx=0; 
     max= tv[0]; 
     for(int i = 1; i<__COLORNUM; i++) 
     { 
      if(tv[i] > max){ 
        max = tv[i]; 
        indx=i; 
      } 

     } 

     if(max>=5) 
     { 
      counter++; 
      *((uchar*)CV_MAT_ELEM_PTR(*Color_mat, y, x))=(uchar)indx; 
      //std::cout<<"times:"<<counter <<endl; 

     } 

    } 
} 
std::cout<<"times:"<<counter <<endl;  

if(showresult){ 
    IplImage* Noise_result = cvCreateImage(cvSize(Color_mat->width,Color_mat->height),IPL_DEPTH_8U,3); 
    for(int y=0; y<Noise_result->height; y++) { 
     uchar* ptr = (uchar*)(Color_mat->data.ptr + y * Color_mat->step); 
     for(int x=0; x<Noise_result->width; x++) { 
      switch (*ptr) { 

          case 1 : 
           cvSet2D(Noise_result,y,x,oo); 
           break; 

          case 2 : 
           cvSet2D(Noise_result,y,x,bb); 
           break; 

          case 3 : 
           cvSet2D(Noise_result,y,x,yy); 
           break; 

          case 4 : 
           cvSet2D(Noise_result,y,x,gg); 
           break; 

          case 5 : 
           cvSet2D(Noise_result,y,x,ww); 
           break; 

          default : 
           cvSet2D(Noise_result,y,x,uk); 
           break; 
      } 
      ptr++; 
     } 
    } 

    if(showresult) 
{ 
    cvNamedWindow("Noiseresult", CV_WINDOW_FREERATIO); 
    cvShowImage("Noise_result", Noise_result); 
    cvWaitKey(0); 

} 



} 

}

答えて

3
for(int i=0;i<9;i++,tv[i]=0); 

は、その行が(それは[0]を0にテレビを設定することはありません)生臭いに見える、あなたの代わりにこのことを意味するものではありません。

for(int i=0;i<9;tv[i]=0,i++); 

(またはそれ以上:memset(tv、0、sizeof(tv));)

+0

memsetが最適です。ループを維持したい場合は、 "for(int i = 0; i <9; i ++)tv [i] = 0;"という方が良いでしょう。通常、forの括弧内にループコントロールを置き、実際の作業は外側に置くのが最善です。 – ugoren

+0

ありがとうございました。 – Amir