![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
	 | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Приветствую, необходима помощь в перечислении уникальных цветов в изображении, подсчет количества пикселей определенных цветов и выражение в % соотношении 15 превалирующих... С подсчетом вроде как проблем нет, но решил объединить с подсчетом пикселей, в итоге получилось следующее, но выкидывает ошибку, сильно не вдавался, но, видимо сказывается мое полное нубство в массивах, и вообще по работе с пикселами: 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	procedure TForm1.Button9Click(Sender: TObject);
type
  TColorInfo = record
    Color: TColor;
    count: integer;
  end;
var
  i: integer;
  col: TColor;
  //
  multiArray: Array [0 .. 1000000] of TColorInfo;
  procedure AddValue(aCol: TColor);
  var
    i: integer;
    curr: TColorInfo;
  begin
    for i := Low(multiArray) to High(multiArray) do
    begin
      curr := multiArray[i];
      if curr.Color = aCol then
      begin
        inc(curr.count);
        BREAK;
      end;
      Application.ProcessMessages;
    end;
    //
    multiArray[i + 1].Color := aCol;
    multiArray[i + 1].count := 1;
  end;
begin
  for i := 0 to Image1.Height - 1 do
  begin
    for j := 0 to Image1.Width - 1 do
    begin
      col := Image1.Canvas.Pixels[j, i];
      AddValue(col);
      Application.ProcessMessages;
    end;
    Application.ProcessMessages;
  end;
  //
end;До кучи чужой оптимизированный алго подсчета уникальных цветов: Код: 
	procedure TForm1.Button1Click(Sender: TObject);
const
  len = 2097152; // 2^24 div 8
var
  x, y, adr, abyte, count: integer;
  cbyte, bit: byte;
  scan: pByteArray;
  cnt: array of byte;
begin
  SetLength(cnt, len);
  count := 0;
  FillChar(cnt[0], len, #0);
  with TBitmap.Create do
  begin
    Assign(Image1.Picture.Graphic);
    PixelFormat := pf24bit;
    for y := 0 to Height - 1 do
    begin
      scan := ScanLine[y];
      for x := 0 to Width - 1 do
      begin
        adr := scan[x * 3 + 0] shl 16 + scan[x * 3 + 1] shl 8 + scan[x * 3 + 2];
        abyte := adr div 8;
        bit := 1 shl (adr mod 8);
        cbyte := cnt[abyte];
        if cbyte and bit = 0 then
        begin
          cnt[abyte] := cbyte or bit;
          inc(count);
        end;
      end;
    end;
    Free;
  end;
  Label1.caption := 'Количество цветов: ' + IntToStr(count);
end; | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Я бы так сделал: 
		
	
		
		
		
		
			
		
		
		
		
		
			Код: 
	var
  colorCount: array[TColor] of integer;
...
  for x...
    for y...
      inc(colorCount[bitmap.canvas.pixels[x, y]]);Правда едрить сколько памяти оно сожрет. Последний раз редактировалось M.A.D.M.A.N., 02.05.2013 в 08:23.  | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
 Памяти у меня много)) так что пока без оптимизации можно обойтись, главное, чтобы работало. А вообще, итоговый результат состоит в том, чтобы получить соотношение "цвета" кожи человека на изображении к другим цветам или количество пикселей "коричневого цвета" (с цветом кожи - это диапозон оттенков) к остальной сумме пикселей, вроде как то так ![]()  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Есть другой подход (реализация, правда, на MatLab'е): 
		
	
		
		
		
		
		
		
			what-color-is-green two-dimensional-histograms freehand-segmentation-in-the-a-b-plane more-on-segmenting-in-a-b-space Сначала пространство RGB перевести в Lab. Яркость L не нужна. По ab строим двумерные гистограммы. Автор (Steve Eddins) приводит алгоритмы ручного и автоматического распознавания зелёных шариков. Последний раз редактировалось AlexSku, 06.05.2013 в 11:45.  | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Спасибо конечно, но реализаций на Матлабе и ПХП полно, а вот на Дельфине нет( 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Я же разбил задачу на кусочки. Вы хотите сказать, что на Delphi нельзя перевести RGB в Lab? Гистограмма это вообще элементарно, Ватсон: количество элементов в каждом интервале. и т.д. 
		
	
		
		
		
		
		
	
		
		
	
	
	 |