2012-09-17 2 views
1

범위 :C# 비트 맵에서 같은 색의 유사 음을 어떻게 바꾸나요?

안녕 모두, 난 문자가 흰색이다 "블랙 화이트"(진화) 이미지, 전체 나머지 (배경, 라인, 무작위 사진)이 보안 문자를 변환하기 위해 노력하고 있습니다 검은.

captcha에 대한 링크는 here입니다. 상쾌하게 함으로 다른 captcha를 줄 것이다.

이유 :

나는 대부분의 사람들이 알고는 그래서 여기에 내가 나 자신을 방어하고 보안 문자를 엉망으로 잘못 생각합니다. 이것은 지식/자기 도전에만 사용됩니다. 이러한 이미지는 다른 용도로 사용되지 않습니다.

문제 :

잠시 동안 이러한 이미지를 공부하고, 나는 좋은 aproach가 색상 교체하는 것이라고 알아 낸 후 "흰색과 노란색"을 "Color.Black", 그리고 다른 모든 색상을 "Color.White"로 대체해야합니다.

이 후에는 색상을 "뒤집어서"원하는대로 출력 할 수 있습니다.

코드 샘플 :이 코드에서

, 나는 스카이 블루 픽셀마다 이미지의 색상 "블랙"을 대체하려합니다.

 WebRequests wr = new WebRequests(); // My class to handle WebRequests 
     Bitmap bmp; 
     string url = "http://www.fazenda.rj.gov.br/projetoCPS/codigoImagem"; 

     bmp = wr.GetBitmap (url); 

     for (int i = 1; i < bmp.Height ; i++) 
     { 
      for (int j = 1 ; j < bmp.Width ; j++) 
      { 
       if (bmp.GetPixel(j,i).Equals(Color.Black)) 
       { 
        bmp.SetPixel(j,i, Color.SkyBlue); 
       } 
      } 
     } 

이 코드는 전혀 작동하지 않지만 왜 그런지는 모르겠지만이 예제에서는 픽셀이 대체되지 않습니다.

질문 :

어떻게 내가이 일을 할 수 ? 내가 여기서 무엇을 놓치고 있니?

또한 나를위한 이상적인 시나리오는이 이미지의 색상 팔레트를 "기본"색상으로 "축소"하여 내 작업을 훨씬 쉽게 만들어주는 것입니다.

이미 색을 줄이기 위해 사용하고있는 AForge Framework을 시도했지만 전혀 작동하지 않습니다. 예상 한 결과가 아닙니다.

이 이미지를 올바르게 이진화하려면 어떻게해야합니까?

미리 감사드립니다.

Marcello Lins.

+0

나는 노란색 'Q'와 'C'검은 'Q'뿐만 아니라 흰색 'W'흰색 'C'를 포함 볼 수있는 CAPTCHA 귀하를 접근 방식이 검은 색으로 사라질 것입니다. – LSerni

+0

배경이 회색이거나 결코 검은 색이어서 사라지지 않습니다. 모든 문자를 같은 색으로 만들고 싶습니다. 문자 색은 "흰색, 노란색 및 검은 색"이 될 수 있기 때문에 모든 문자를 검정색으로 채우고 나머지 색은 모두 한 색으로 처리하게됩니다. 배경. –

답변

1

알고리즘이 작동하지 않는 이유는 정확도가입니다. 그러나 이미지의 검정색은 JPEG 압축물로 인해 실제로 검정색이 아닙니다. 내가로드 한 세 가지 CAPTCHAS에서는 검정색 (0, 0, 0) 픽셀이 하나도 없었습니다. 가장 가까운 값은 (0, 0, 4) 이었지만 검은 색으로 보이지만 그렇지 않습니다.

근사 방법이 될 것이다 :

  • 모두 제거 회색 회색 220 미만의 평균 채널을 갖는 (각각 5 % 이하 상이한 채널). 이것은 희미한 lightgray 라인뿐만 아니라 회색 배경에 많은 울리는 (JPEG) 인공물을 죽입니다.
  • 빨간색, 녹색 또는 파란색 채널이 255 % 이상인 모든 픽셀을 두 개 모두 회색으로 표시된 다른 두 채널로 바꿉니다. 이것은 빨간색, 녹색 및 파랑뿐만 아니라 그들의 울리는 공예품의 대부분을 담당합니다.
  • 5 개의 회색으로 둘러싸인 모든 농축 픽셀을 제거하고 20 % 내에서 동일한 색상의 다른 픽셀을 제거하지 않으려면 단순 얼룩 제거를 실행하십시오.

이 프로세스가 끝나면 배경은 모두 회색이며 남은 픽셀은 모두 문자입니다.

몇 가지 유용한 기능 :

// Very basic (and CIE-incorrect) check 
public static int isGray(Color c) 
{ 
    if (Math.Abs(c.R - c.G) > 5 * 2.55) return 0; // Not gray. R and G too different 
    if (Math.Abs(c.R - c.B) > 5 * 2.55) return 0; 
    if (Math.Abs(c.G - c.B) > 5 * 2.55) return 0; 
    return 1; 
} 

// the blind man's test for shading :-) 
public static int isShadeOfRed(Color c) 
{ 
    if (4*c.R < 5*c.G) return 0; // Red not strong enough in respect to green 
    if (4*c.R < 5*c.B) return 0; // Red not strong enough in respect to blue 
    return 1; // Red is stronger enough than green and blue to be called "shade of red" 
} 

// (shades of green and blue left as an exercise) 

// Very basic (and CIE-incorrect) check 
public static int areSameColor(Color a, Color b) 
{ 
    if (Math.Abs(a.R - b.R) > 5 * 2.55) return 0; 
    if (Math.Abs(a.G - b.G) > 5 * 2.55) return 0; 
    if (Math.Abs(a.B - b.B) > 5 * 2.55) return 0; 
    return 1; // "more or less" the same color 
} 

// This is more or less pseudo code... 
public static int isNoise(int x, int y) 
{ 
    if ((x < 1) || (y < 1)) return 0; // or maybe "return 1" 
    if ((x+1 >= bmp.Width)||(y+1 >= bmp.Height)) return 0; 
    pix = bmp.GetPixel(x,y); 
    for (i = -1; i <= 1; i++) 
     for (j = -1; j <= 1; j++) 
     { 
      if ((i == 0) && (j == 0)) continue; 
      test = bmp.GetPixel(x+i, y+j); 
      if (isGray(test)) grays++; 
      if (isSameColor(pix, test)) same++; 
     } 
    // Pixel surrounded by grays, and has no neighbours of the same colour 
    // (who knows, maybe we could skip gray calculation and check altogether?) 
    // is noise. 
    if ((grays == 5) && (same == 0)) 
     return 1; 
    return 0; 
} 

// NOTE: do not immediately set to gray pixels found to be noise, for their neighbours 
// will be calculated using the new gray pixel. Damage to image might result. 
// Use a copy of bmp instead. 
+0

그냥 두 번 눌러 테스트 해 보셨습니까? –

+0

몇 개의 보안 문자로 예. 그러나 "220"과 같은 임계 값으로 실험하고 싶을 수도 있습니다. 나는 그것이 더 제기 될 수도 있다고 생각한다. 또한, 나중에 사용되는 OCR에 따라 달라집니다. 그렇지 않으면 캐릭터 그레이스를 잘라내 기 때문에 5 개의 회색으로 얼룩 제거를 중지했습니다. 4 개 또는 6 개가 더 나은 최종 결과를 제공 할 수 있습니다. – LSerni

+0

@Iserni 감사합니다. 곧 시도해 보겠습니다.) –

관련 문제