2011-07-03 10 views
0

RGB 이미지를 그레이 스케일 이미지로 변환하려고합니다. RGB 이미지는 160 * 120 * 4이고 회색조는 160 * 120 * 1입니다. 그러나, 그것은 나에게 나에게 wan 그러나 단지 보통의 검정을 준다. 그리고 그것은 매우 긴 시간이 걸린다. 이건 내가 쓰는 와트 야. 조언 해줘. 감사합니다그레이 스케일 이미지 변환 터보 C++

int i, j, sum; 
Image = new unsigned char [ 160 * 120 * 1 ]; 
for(int j = 0; j < 120; j++) { 

    for(int i = 0; i < 160; i++) { 
    sum=0; 
     sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
     sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
     sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
     sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
     *Image = sum/4; 

     PaintBox2->Canvas->Pixels[ i ][ j ] = *Image; 
     Image++; 
    } 
} 
+1

터보 C++은 더 이상 존재하지 않습니다. Visual Studio 2005/2008/2010으로 이동하여 무료 * Express * 에디션을 제공하십시오. 그런 다음 심각한 작업을하기 위해 OpenCV (이미지 처리를위한 크로스 플랫폼 라이브러리)를 사용하십시오. – karlphillip

+0

나는 무엇보다도 당신이 말한 것에 동의합니다. 그러나 플랫폼을 변경하는 것은 내가 결정할 수있는 것이 아닙니다. – Chang

답변

1

코드에 몇 가지 문제점이 있습니다. 가장 눈에 띄는 루프 안쪽 내에서 제공 :

sum=0; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
*Image = sum/4; 

를 여기, 당신은 단순히 이상 sum 4 배 같은 값을 추가 한 다음 네 가지로 구분했다. 이 6 줄은

*Image = PaintBox1->Canvas->Pixels[ i ][ j ]; 

과 동일하게 만듭니다. 분명히 실제로 각 채널의 평균을 원했습니다. 당신의 RGB 이미지는 세 가지 차원 배열로 구현 된 경우이 아마 같이 보일 것이다 : 당신의 RGB 이미지가 실제의 2 차원 배열로 구현처럼

sum = 0; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 0 ]; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 1 ]; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 2 ]; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 3 ]; 
*Image = sum/4; 

그러나, 당신의 코드 예제에서, 그것은 본다 (un) signed integer. 이 경우, 다음 코드 (제공 정수 시스템에 4 바이트이다) 충분해야합니다

sum = 0; 
unsigned int pixel = PaintBox1->Canvas->Pixels[ i ][ j ]; 
for(int k = 0; k < 4; ++k) 
{ 
    sum += pixel & 0xFF; 
    pixel >>= 1; 
} 
*Image = sum/4; 

내가 볼 다른 주요 문제는 당신이 당신의 그레이 스케일 배열의 시작 부분에 대한 포인터를 유지하지 않는다는 것입니다.

Image = new unsigned char[ 160 * 120 * 1 ]; 

으로 초기화합니다.

// before the for loops 
Image = new unsigned char[ 160 * 120 * 1 ]; 
unsigned char * temp = Image; 

// at the end of the inner for loop: 
temp++; 
:하지만 그때마다 루프를 통해, 당신은 당신이 배열의 시작 부분에 대한 포인터를 유지하고, 반복자 역할을 임시 포인터가 있어야

Image++; 

오히려 작성했습니다

따라서 포인터 만 이동하고 Image은 고정 된 상태로 유지됩니다.

+0

오 포인터 부분을 얻습니다. 그러나 평균 부분은 내가 그것을 얻습니다, 왜냐하면 나는 RGB 값을 가지고 있기 때문에, 각 픽셀은 4 개의 값, 빨간색 x AMT, 파란색 x AMT, 그리고 마지막으로 NULL을 보유하고 있습니다. – Chang

+0

각 픽셀마다 4 개의 값이 있다고 가정합니다. 그들은 단일 서명되지 않은 int 또는 무언가 안에 저장되어 있습니까? 이미지가 정확히 어떻게 구현됩니까? –

+0

대상 그레이 스케일 이미지에서 소스 RGB 이미지의 밝기를 일치시킬 수 있습니다. 다음 표준 공식을 사용하십시오. Y = 0.299 * R + 0.587 * G + 0.114 * B –

관련 문제