2014-02-10 1 views
0

나는 시간이 2에 가까워지기를 기다리지 않고 지금 당장이 작업을 해왔습니다. 도움을 요청하는 행운이없는 Google을 선택했습니다. 내가 시도하고있는 것은 이미지의 각 라인을 스캔하고 다음 색상이 현재 픽셀과 동일한 경우 인덱스를 진행 한 다음 (1) 행 당 각 해당 색상의 길이를 포함하는 목록을 작성하는 것입니다. (2) x 위치, (3) y 위치. 도움을 주시면 감사하겠습니다.이미지의 각 행에있는 대응 색상의 길이를 얻으십시오.

답변

1

각 픽셀의 RGB 값을 가져 와서 스캔 된 다음 픽셀 값과 비교하십시오. 값을 얻기 위해 다른 경우를 사용 ... 뭔가를이

for (int i = 0; i < image.rows; i++) 
{ 
    for(int j=0; j< image.cols; j++) 
    { 
     int b = image.at<cv::Vec3b>(i,j)[0]; 
     int g = image.at<cv::Vec3b>(i,j)[1]; 
     int r = image.at<cv::Vec3b>(i,j)[2]; 
    } 
// add your comparison here. Dun wanna do your work for u. 
} 

처럼 당신은 또한 빠른 처리를 위해 그레이 스케일 이미지를 변환 할 수 있지만 정보 손실이있을 것이다.

+1

조금 설명해 주시겠습니까? (i, j) [0]; 또한 안전하지 않은 코드를 사용합니다. 행 [(높이 PixelSize *) + 3] // \t \t \t \t \t \t \t \t 행 블루 [(높이 * PixelSize) + 2] // 녹색 \t \t \t \t \t \t \t \t 행 [(높이 * PixelSize) + 1], // 붉은 \t \t \t \t \t \t \t \t 행 [높이 * 내가 어디 승가는 참조로 PixelSize] // 투명성 – user2991535

+0

또한 당신에게 +1 투표 it it it it it it svg fill을 사용하여 파일에 씁니다. 필자는 각 픽셀을 작성하면서 많은 정보를 얻었지만 많은 공간을 필요로합니다. fill 요소의 너비와 updatint의 현재 위치를 업데이트하여 더 좋은 방법을 찾고 있습니다. – user2991535

+0

그래, rgb 값을 얻는 또 다른 방법이고, 다른 방법은 포인터도 사용하는 것입니다. 흠. 나는 당신의 2 번째 질문에서 약간 혼란 스럽다. 당신이 원하는 색상의 길이를 얻고 싶을 때, 제 생각은 다음과 같이됩니다 : 현재 픽셀의 r 값이 이전 픽셀의 r 값과 유사하고 현재 픽셀의 g 값이 이전 g 값과 비슷하고 b가 동일하면 길이가 ++입니다. 당신의 질문에 오해가 있었습니까? 하하. – rockinfresh

1

결국 모든 데이터가 올바르게 수집되었는지 for 루프가 발생할 때까지 데이터를 저장하는 구조를 사용했습니다. 다음은 다른 사람이 동일한 해결책을 찾고있는 경우에 사용되는 코드입니다. 먼저 필요한 데이터를 저장하기 위해 구조를 만듭니다.

internal struct VectorRectangle 
{ 
    public int X,Y,Size; 
    public string HexColor; 
} 

이제 이미지에서 값을 얻을 수있는 구조가되었습니다 (참고 : 너비는 높이가 아직 구현되지 않은 것으로 설정됩니다). 코드를 obtimize 할 수있는 방법이 있다면 그렇게하여 메시지를 보내주십시오. :).

internal static unsafe VectorRectangle[] GetRectangles(Bitmap @this) 
{ 
    const int PixelSize = 4; 
    List<VectorRectangle> vectorRectangles = new List<VectorRectangle>();   
    Point dummyPoint; 
    Rectangle rectangle = new Rectangle(dummyPoint, @this.Size); 
    BitmapData bitmapData = @this.LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 
    for(int height = 0; height < @this.Height; height++) 
    { 
     VectorRectangle rect = new VectorRectangle(); 
     rect.Size = 1; 
     for(int width = 0; width < @this.Width; width++) 
     { 
      byte* row = (byte*)(bitmapData.Scan0 + (height * BitmapData.Stride));     
      rect.X = width; 
      rect.Y = height; 
      rect.HexColor = ColorTranslator.ToHtml(Color.FromArgb(
         row[(width * PixelSize) + 3], // blue 
         row[(width * PixelSize) + 2], // green 
         row[(width * PixelSize) + 1], // red 
         row[width * PixelSize] // transparency 
       )); 
      while(width < @this.Width && ColorTranslator.ToHtml(Color.FromArgb(
         row[((width + 1) * PixelSize) + 3], // blue 
         row[((width + 1) * PixelSize) + 2], // green 
         row[((width + 1) * PixelSize) + 1], // red 
         row[(width + 1) * PixelSize] // transparency 
       )) == rect.HexColor) 
      { 
       rect.Size++; 
       width++;     }          
      vectorRectangles.Add(rect); 
     }    
    } 
    @this.UnlockBits(bitmapData); 
    return vectorRectangles.ToArray(); 
} 
+0

(: – rockinfresh

관련 문제