Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2013, 23:18   #1
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию Определение количества основных цветов на изображении (Delphi)

Доброго времени суток.
Встала передо мной задача, которую не получается решить, а именно:

есть изображение в формате PNG (цвета без искажений)
на изображении может быть текст одного цвета или нескольких цветов

нужно определить количество различных цветов на изображении (задача для меня сложна тем, что вокруг символов может быть ореол, и точным сравнением воспользоваться не получится)

Пробовал сделать подобным образом (на контрасте сыграть) но не выходит:
Код:
procedure CheckForeground(const APixel:TRGBTriple; var AFG:array of TRGBTriple);
const Theresold=50;
var Contrast:real;
    i:integer;
begin

  for I := Low(AFG) to High(AFG) do begin
    Contrast:=Abs(AFG[i].rgbtBlue-APixel.rgbtBlue)+
              Abs(AFG[i].rgbtRed-APixel.rgbtRed)+
              Abs(AFG[i].rgbtGreen-APixel.rgbtGreen);
    Contrast:=100*Contrast/(255*3);
    if Contrast>Theresold then begin
      SetLength(AFG,Length(AFG)+1);
      AFG[Length(AFG)-1]:=APixel;
      break;
    end;
  end;

  if Length(AFG)=0 then begin
    SetLength(AFG,Length(AFG)+1);
    AFG[Length(AFG)-1]:=APixel;
  end;
end;
AFG - массив основных цветов, APixel - один пиксель изображения (обрабатываются все пиксели в цикле)

Есть мысль, что можно воспользоваться подсчетом количества пикселей различных цветов и искать локальные максимумы, но слабо получается представить, как это грамотно сделать

Буду рад любой помощи, заранее спасибо)
благодарность - сюда (не забываем писать от кого)
Zer0 вне форума Ответить с цитированием
Старый 02.06.2013, 12:23   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Основных цветов, вообще-то три.
Раз Вы используете этот термин не в его стандартном смысле, приведите определение, что Вы подразумеваете под этим понятием.
s-andriano вне форума Ответить с цитированием
Старый 02.06.2013, 14:15   #3
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

Извиняюсь, конечно же.
Имелось ввиду выделить цвета шрифтов (точнее количество разных таких цветов)



Здесь по итогу должно быть выделено 3 цвета:
#2634FF , #2634FF , #3873FF
благодарность - сюда (не забываем писать от кого)

Последний раз редактировалось Zer0; 02.06.2013 в 14:26.
Zer0 вне форума Ответить с цитированием
Старый 02.06.2013, 15:28   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

На том рисунке, что Вы привели, вероятно, можно выделить 4 цвета.
Но только вероятно, т.к. там получится масса переходных оттенков и уверенно различить их вряд ли получится.
В общем, задача в общем виде не решается, чтобы ее хоть как-то решить, нужны дополнительные ограничения. Например, чтобы ширина штриха шрифта превосходила 3 пикселя.

PS. Вдогонку: обратил внимание, что в Вашем коде SetLength находится внутри цикла. Крайне рекомендую избегать таких ситуаций.

PPS: Написал слово "Пример" черным по белому и сохранил в труколоре. Статистика такова (печатается интенсивность RGB, сколько точек соответствующего цвета - подсчет по R, G, B произведено независимо).
Код:
  0   588   588   588
 77    30    30    30
104    10    10    10
124    15    15    15
140    11    11    11
154    10    10    10
167    16    16    16
178     6     6     6
189     8     8     8
199    13    13    13
208    18    18    18
217    16    16    16
225     5     5     5
233    14    14    14
240    12    12    12
255  5628  5628  5628
Как видим, используемое количество градаций серого весьма ограничено (зафиксировано только 15 из 255), поэтому повторяемость точек с этими цветами довольно высока.

Последний раз редактировалось s-andriano; 02.06.2013 в 16:16.
s-andriano вне форума Ответить с цитированием
Старый 02.06.2013, 16:19   #5
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

Код черновой, потому и местами несуразица)

В целом задачу для себя уже решил, но может есть более красивые варианты)

сейчас реализовал грубый алгоритм - подсчет количества пикселей с одинаковыми цветами и выделение таких цветов, количество пикселей с которыми превышает среднюю величину (за вычетом фона).
Во время тестов отработало идеально)
благодарность - сюда (не забываем писать от кого)
Zer0 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уменьшение количества цветов в изображении Notik Помощь студентам 2 19.05.2015 23:40
Есть n цветов разных видов. Составьте все возможные сочетания букетов из всех этих цветов. Количество цветов и их названия вводит lesha18 Паскаль, Turbo Pascal, PascalABC.NET 1 26.02.2013 16:54
Определение геометрических парметров объекта на изображении thunderstormuk Мультимедиа в Delphi 3 06.02.2011 13:36
Определение количества информации Kulechov Помощь студентам 1 26.01.2011 07:29
Определение границ области в изображении Manul_87 Помощь студентам 0 17.11.2009 17:38