2013-01-15 2 views
1

침식 및 확장 알고리즘을 구현하려는 이미지 처리 지정을 수행하고 있습니다. 모든 방향 (이 경우에는 위, 아래, 왼쪽 및 오른쪽)에서 각 픽셀을 찾아야하므로 구조화 요소를 더 많이 사용합니다. 여기에 내 문제가있다 : 루프를 중첩시켜 4 개를 얻었으므로이 작업이 매우 느려진다. 안전하지 않은 방법을 사용하지 않고 침식 과정을 더 빠르게 만드는 방법을 알려줄 사람이 있습니까?이미지 처리 작업 : 침식 C#

 colorlistErosion = new List<Color>(); 
     int colorValueR, colorValueG, colorValueB; 
     int tel = 0; 

     for (int y = 0; y < bitmap.Height; y++) 
     { 
      for (int x = 0; x < bitmap.Width; x++) 
      { 
       Color col = bitmap.GetPixel(x, y); 
       colorValueR = col.R; colorValueG = col.G; colorValueB = col.B; 
       //Erosion 
       for (int a = -1; a < 2; a++) 
       { 
        for (int b = -1; b < 2; b++) 
        { 
         try 
         { 
          Color col2 = bitmap.GetPixel(x + a, y + b); 
          colorValueR = Math.Min(colorValueR, col2.R); 
          colorValueG = Math.Min(colorValueG, col2.G); 
          colorValueB = Math.Min(colorValueB, col2.B); 
         } 
         catch 
         { 
         } 
        } 
       } 
       colorlistErosion.Add(Color.FromArgb(0 + colorValueR, 0+colorValueG, 0+colorValueB)); 
      } 
     } 
     for (int een = 0; een < bitmap.Height; een++) 
      for (int twee = 0; twee < bitmap.Width; twee++) 
      { 
       bitmap.SetPixel(twee, een, colorlistErosion[tel]); 
       tel++; 
      } 
+0

동일한 숙제 : http://stackoverflow.com/questions/14325778/erosion-and-dilation-operation –

+0

[LockBits] (http://msdn.microsoft.com/en-us/library/5ey6h79d. aspx) –

+0

이 기능에 대해 여러 단계의 벤치 마크를 시도해보십시오. 무엇이 가장 느려지는 작업인지보십시오. 어쨌든 나는 포인터 나 네이티브 메소드 또는 lockbits를 사용하지 않고보다 빠른 방법으로이를 달성 할 수 있을지 의심 스럽다 ... x ++ 대신에 ++ x를 변경하여 루프 밀리 세컨드를 변경하여 불필요한 처리를 피할 수있다. (colorValueR 대신 of 0Array + colorValueR fromArgb), try/catch 문 제거, 목록 대신 Array를 사용하여 ... –

답변

0

방법 안전하지 않은 방법을 사용하지 않고 빨리 침식 과정을 만들기 위해 : 여기 내가 가진 무엇인가?

내부 루프를 Parallel.For()으로 바꿀 수 있습니다.

GetPixel() 및 특히 SetPixel()이 스레드로부터 안전한지 100 % 확신 할 수는 없습니다. 그것은 거래 차단기입니다.

+0

예, 먼저 LockBits가 필요 하겠지만 사용하려면 '안전하지 않습니다'라고 생각합니다. –

0

네 개의 네 스티드 루프 때문에 알고리즘이 본질적으로 느립니다. 가장 느린 방법 인 bitmap.GetPixel을 사용하여 비트 맵을 처리 중입니다.

SharpGL을 살펴보십시오. 필터가 없다면 소스 코드를 다운로드하고 자신 만의 방법을 찾아 낼 수 있습니다.