2011-08-29 7 views
1

붉은 색 영역을 찾기 위해 이미지를 처리하려고합니다. 나는 픽셀을 스캔하고 적색 일 것 같으면 검정색으로 변환하고 그렇지 않으면 흰색으로 변환합니다.이 프로그램을 사용하여 이미지를 그릴 수 없습니까?

프로세스 속도를 높이기 위해 특정 픽셀을 건너 뛰고 그 자리에 검정색 또는 흰색 블록을 그릴 필요가 있습니다. 이 함수를 사용하고 있지만 어딘가에 잘못된 것 같습니다. 마지막에 얻은 이미지는 완전히 비어 있습니다.

public void ProcessFrame(ref Bitmap image) 
    { 
     int skip = 10; 
     Graphics g = Graphics.FromImage(System.Drawing.Image.FromHbitmap(image.GetHbitmap())); 
     SolidBrush black = new SolidBrush(Color.Black); 
     SolidBrush white = new SolidBrush(Color.White); 
     for (int i = 0; i < image.Width; i=i+skip) 
     { 
      for (int j = 0; j < image.Height; j = j + skip) 
      { 

       Color cl = image.GetPixel(i, j); 
       if (cl.R > (cl.G * 2) && cl.R > (cl.B * 2)) 
       { 
        g.FillRectangle(black, new Rectangle(i, j, skip, skip)); 
       } 
       else 
       { 
        g.FillRectangle(white, new Rectangle(i, j, skip, skip)); 
       } 
      } 
     } 
    } 

실수를 지적하거나 다른 목표를 달성 할 수있는 더 좋은 방법이 있습니까?

답변

4

공백으로 하시겠습니까?

귀하의 이미지를 모르지만 if (cl.R > (cl.G * 2) && cl.R > (cl.B * 2))은 발한에 대한 좋은 테스트가 아닙니다. # 010000은 테스트를 통과하지만 기본적으로 검은 색입니다. 그리고 #ffaaaa는 빨간색으로 보이지만 통과하지는 않습니다.

매우 어두운 이미지가있는 경우 많은 픽셀이 빨간색이 아닌 해당 테스트를 통과 할 수 있습니다. 밝은 이미지에서는 많은 빨간색 픽셀이 통과하지 않습니다.

아마도 가장 좋은 방법은 색상을 HSL로 변환 한 다음 빨간색 영역에있는 H (ue) 값을 사용하는 것입니다. 단, S (채도) 및 L (밝기)가 충분히 밝고 비 - 회색 (검정 또는 회색이 아닌 임계 값 이상).

+0

빨간색이 아닌지 확인하는 것은 일시적입니다. 나는 너의 suggetion을 사용할 것이다. 그러나 나는 오히려 그림이 아닌 이미지의 문제에 대한 해답을 찾고있었습니다. 이 알고리즘은 각 픽셀을 스캔하고 교체하면 꽤 잘 작동합니다. 그러나 너무 느립니다. –

+0

저는 Atalasoft에서 일합니다 - 빠른 픽셀 액세스 및 그리기가 가능한 무료 이미징 .NET SDK (http://atalasoft.com/photofree)를 만듭니다. AtalaImage.PixelMemory 및 Atalasoft.Imaging.Drawing.Canvas - 및 http://www.atalasoft.com/docs/dotimage/docs/Getting%20at%20Pixels.html –

2

한번에 사용하기 :

Graphics g = Graphics.FromImage(image); 

그런 다음 색상 테스트를 개선하기 위해 다른 응답을 고려한다.

+0

멋진 아이디어를 참조하십시오. 하지만 여전히 작동하지 않습니다. 나는 그것을 조사하고 알게 될 것이다. –

0

image가 생성된다 당신은 보여주지 못했지만,이 코드는 비트 맵으로 그려 지기도합니다 : 이미지를 사용하기 전에 Graphics.Dispose 전화 (또는 using 사용) 할 필요가

var bmp = new Bitmap(200,200); 
using (g = Graphics.FromImage(bmp)) 
{ 
    g.FillEllipse(Brushes.Red, 10, 10, 50, 50); 
} 

참고.

또한 이미지 처리에 GetPixel을 사용하면 매우 느립니다. 저수준 메모리 액세스 (Bitmap.LockBits)를 사용하거나 .NET 용 이미지 처리 라이브러리 (예 : AForge)를 사용해보십시오.

관련 문제