2008. 10. 3. 21:47

외곽 추출을 위한 그레이화 수정2



IplImage* changecolor(IplImage* img2)
{
 
  unsigned char r, g, b, gray ;

  for(int i=0; i<img2->height-1; i++){
  for(int j=0; j<img2->width-1; j++){
   
       Map2[i][j].r = img2->imageData[i*img2->widthStep + j*img2->nChannels + 2];
       Map2[i][j].g = img2->imageData[i*img2->widthStep + j*img2->nChannels + 1];
       Map2[i][j].b = img2->imageData[i*img2->widthStep + j*img2->nChannels + 0];

                gray=255;
    r = Map2[i][j].r;
       g = Map2[i][j].g;
          b = Map2[i][j].b;

     //    if(r>80 && g<r && b<r){        // 빨강
    if(r>=100 && g<=140 && b<=140 || r>=100 && b>=100 && g<=130 || r<=240 && g<=150 && b<=90 && (b+60)<=g || r>=51 && g<=20 && b>=51){
     gray=155;
        img2->imageData[i*img2->widthStep + j*img2->nChannels + 0] = (char)gray; // Blue
        img2->imageData[i*img2->widthStep + j*img2->nChannels + 1] = (char)gray; // Green
        img2->imageData[i*img2->widthStep + j*img2->nChannels + 2] = (char)gray; // Red
                 }

                if(r>=50 && g>=50 && b>=50){
                    gray=155;
        img2->imageData[i*img2->widthStep + j*img2->nChannels + 0] = (char)gray; // Blue
        img2->imageData[i*img2->widthStep + j*img2->nChannels + 1] = (char)gray; // Green
        img2->imageData[i*img2->widthStep + j*img2->nChannels + 2] = (char)gray; // Red

    }
    if(gray==255){
     if(r<=50 && g>=51 && b>=51 || r>=51 && g>=51 && b<=50 || r<=50 && g>=51 && b<=50){
        gray=155;
        img2->imageData[i*img2->widthStep + j*img2->nChannels + 0] = (char)gray; // Blue
        img2->imageData[i*img2->widthStep + j*img2->nChannels + 1] = (char)gray; // Green
        img2->imageData[i*img2->widthStep + j*img2->nChannels + 2] = (char)gray; // Red   

     }else if(gray==255){
      CString qwq;
      qwq.Format("%d %d %d",r,g,b);
    //  AfxMessageBox(qwq);
     }
    
    }
   }
  }
 return img2;
}

 

 

 

거의 대부분의 노이즈가 제거 되었다..

2008. 10. 3. 21:45

외곽 추출을 위한 그레이화 수정



 

 

 

 

IplImage* changecolor(IplImage* img2)
{
 
  unsigned char r, g, b, gray ;

  for(int i=0; i<img2->height-1; i++){
  for(int j=0; j<img2->width-1; j++){
   
       Map2[i][j].r = img2->imageData[i*img2->widthStep + j*img2->nChannels + 2];
       Map2[i][j].g = img2->imageData[i*img2->widthStep + j*img2->nChannels + 1];
       Map2[i][j].b = img2->imageData[i*img2->widthStep + j*img2->nChannels + 0];


       gray=255;
       r = Map2[i][j].r;
       g = Map2[i][j].g;
       b = Map2[i][j].b;

    

// 빨강


    if(r>=100 && g<=140 && b<=140 || r>=100 && b>=100 && g<=130

       || r<=240 && g<=150 && b<=90 && (b+60)<=g || r>=51 && g<=20 && b>=51){
        gray=155;
        img2->imageData[i*img2->widthStep + j*img2->nChannels + 0] = (char)gray; // Blue
        img2->imageData[i*img2->widthStep + j*img2->nChannels + 1] = (char)gray; // Green
        img2->imageData[i*img2->widthStep + j*img2->nChannels + 2] = (char)gray; // Red
    }

    if(r>=50 && g>=50 && b>=50){
        gray=155;
        img2->imageData[i*img2->widthStep + j*img2->nChannels + 0] = (char)gray; // Blue
        img2->imageData[i*img2->widthStep + j*img2->nChannels + 1] = (char)gray; // Green
        img2->imageData[i*img2->widthStep + j*img2->nChannels + 2] = (char)gray; // Red

    }


     if(gray==255){
      CString qwq;
      qwq.Format("%d %d %d",r,g,b);
      AfxMessageBox(qwq);
     }
     
   }
  }
 return img2;
}

 

그냥 rgb값이 50이 넘는 것은 무조건 그레이 시킴...

ps. 미완성임 - 별로 참고 할건 못됨

2008. 10. 3. 21:44

컬러코드 샘플