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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2011, 15:50   #1
Локи
 
Аватар для Локи
 
Регистрация: 08.03.2011
Сообщений: 9
По умолчанию Попиксельный анализ цвета.

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

Код:
procedure TForm1.btn2Click(Sender: TObject);
var
  i,j: Integer;
  c: TColor;
  cb, cg, cr: Byte;
begin
  red:=0;
  yellow:=0;
  green:=0;
  blue:=0;
  purple:=0;
  orange:=0;
  black:=0;
  gray:=0;
  for i:=0 to img1.Picture.Width do
    for j:=0 to img1.Picture.Height do
      begin
        c:= img1.Canvas.Pixels[i, j];
{        cb:= GetBValue(c);
        cg:= GetGValue(c);
        cr:= GetRValue(c);
        //красный
        if ((cb<=10) and (cg<=10) and ((cr>=140) and (cr<=255))) then inc(red);
//        желтый
        if ((cb=0) and ((cg>=185) and (cg<=255)) and ((cr>=0) and (cr<=50))) then inc(yellow);
//        зеленый
        if ((cb<=9) and (cg>=100) and (cr=0)) then inc(green);
//        синий
        if ((cb>=140) and (cg=0) and (cr=0)) then inc(blue);
//        фиолетовый
        if ((cb>=134) and (cg=0) and ((cr>=80) and (cr<=201))) then Inc(purple);
//        оранжевый
        if ((cb<=21) and ((cg>=68) and (cg<=98)) and ((cr>=155) and (cr<=185))) then Inc(orange);
//        черный
        if ((cb<=30) and (cg<=30) and (cr<=30)) then inc(black);
//        серый
        if (((cb<=200) and (cb>=100)) and ((cg<=200) and (cg>=100)) and ((cr<=200) and (cr>=100)) and ((cb=cg) and (cg=cr))) then inc(gray);}
        if (c>=$00000000) and (c<=$007575ff) then Inc(red);
        if (c>=$00000000) and (c<=$00ffffff) then Inc(yellow);
        if (c>=$00000000) and (c<=$0009ff00) then Inc(green);
        if (c>=$008c0000) and (c<=$00fe0000) then Inc(blue);
        if (c>=$00860050) and (c<=$00ff00c9) then Inc(purple);
        if (c>=$0000449b) and (c<=$001562b9) then Inc(orange);
        if (c>=$00000000) and (c<=$001f1f1f) then Inc(black);
        if (c>=$00646464) and (c<=$00bfbfbf) then Inc(gray);
      end;
 ShowMessage(IntToStr(red) + ' ' + IntToStr(yellow) + ' ' + IntToStr(green) + ' ' + IntToStr(blue) + '
 ' + IntToStr(purple) + ' ' + IntToStr(orange) + ' ' + IntToStr(black) + ' ' + IntToStr(gray));
end;
Локи вне форума Ответить с цитированием
Старый 28.03.2011, 16:53   #2
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Как вариант, создать 3(три) массива, длиной 0..255 (256 всего) для каждого цвета, пройтись по изображению и увеличивать каждый цвет при встрече. А потом посчитать процент труда не составит.

//ИМХО

Хотя, что-то мне подсказывает, что бред полный написал.

Последний раз редактировалось psycho-coder; 28.03.2011 в 16:57.
psycho-coder вне форума Ответить с цитированием
Старый 28.03.2011, 20:43   #3
Локи
 
Аватар для Локи
 
Регистрация: 08.03.2011
Сообщений: 9
По умолчанию

Ах, если бы все было так просто. Если бы нужно было только красный, синий и зеленый найти - тогда ок. Но тут-то надо именно цвета такие найти (из короткого варианта психодиагностики по Люшеру), причем учесть возможные оттенки ><
И проблема, как я выше уже писал - не проценте - его-то просто подсчитать будет, а в самом распознавании цветов.
Локи вне форума Ответить с цитированием
Старый 29.03.2011, 10:19   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Ну вот вроде ты вытаскиваешь код цвета
Код:
c:= img1.Canvas.Pixels[i, j];
cb:= GetBValue(c);
cg:= GetGValue(c);
cr:= GetRValue(c);
Теперь его можно занести в массив
Код:
Inc(arr_R[cr]);
Inc(arr_G[cg]);
Inc(arr_B[cb]);
Таким способом можно собрать все цвета. (меня все еще не отпускает чувство, что я не понимаю суть задачи )
psycho-coder вне форума Ответить с цитированием
Старый 29.03.2011, 11:26   #5
Локи
 
Аватар для Локи
 
Регистрация: 08.03.2011
Сообщений: 9
По умолчанию

Видимо-таки да.) Суть задачи я вроде уже объяснял, но попробую яснее расписать.) В общем человек что-то рисует на листке, а психолог на основании рисунка определяет, в каком состоянии находится человек. Там, допустим, черный - угнетенное состояние, зеленый - жизнелюбие, упорство, и так далее.
Программа призвана автоматизировать этот процесс и свести к минимуму количество ошибок. Вся проблема в том, что в отсканированном рисунке не будет точно тех цветов, которые используются в эталонном варианте теста Люшера (я использую его сокращенный вариант, как наиболее удобный), а будут их оттенки.
Соответственно мне нужно заставить программу их распознавать. Задание диапазонов, как выше - дает слишком большой разброс значений. По логическим условиям (которые закомментированы), и к которым, кстати, относится и код cb:= GetBValue(c); cg:= GetGValue(c); cr:= GetRValue(c); - вообще никак не считает.
Ваш вариант подходил бы, если бы необходимо было получить фактическое распределение цвета, а не видимое =)
Вот как-то так.
Локи вне форума Ответить с цитированием
Старый 29.03.2011, 13:14   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Суть задачи более менее понятна. Таким "лобовым" методом Вам её решить не удасться. Для разных рисунков оттенки и яркость будут разными.
Диапазрны сдесь не помогут.
Для решения надо приводить цвета к "стандартному" виду. Для этого необходимо, чтобы красный был красны, а зелёный - зелёным. Т.е. хотя бы одна из трёх составляющих была равна нулю. Яркость всегда 256.
Для этого надо использовать как минимум три метода.
Корреляционный анализ, регрессионный анализ (или аппроксимацию) и возможно спектральный анализ. В общем задачка не так проста, как кажется.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 30.03.2011, 18:36   #7
Локи
 
Аватар для Локи
 
Регистрация: 08.03.2011
Сообщений: 9
По умолчанию

Минуточку. Разве нельзя подобрать диапазоны, внутри которых можно однозначно сказать - вот это оттенок красного, а это - фиолетового?
p.s. кстати, была идея преобразовывать в gif, уменьшая количество цветов и уже в уменьшенной палитре искать - может быть в этом направлении покопать? Ведь стопроцентная точность тут не нужна.
Локи вне форума Ответить с цитированием
Старый 30.03.2011, 18:38   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а зачем тогда в gif?
кто вам мешает самим написать ваши диапазоны?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.03.2011, 19:11   #9
Локи
 
Аватар для Локи
 
Регистрация: 08.03.2011
Сообщений: 9
По умолчанию

Чтобы уменьшить возможные варианты оттенков.
А диапазоны - в них-то и проблема. Как их подобрать?)
Локи вне форума Ответить с цитированием
Старый 30.03.2011, 19:12   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в паинте откройте палитру.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ABC анализ aliya_n_g Microsoft Office Excel 7 14.01.2011 08:48
выпуклый анализ Жанна__90 Помощь студентам 2 12.01.2011 22:59
АВС-анализ. abdumanon Microsoft Office Excel 8 14.09.2010 08:32
Сортировка+Анализ женя2010 Microsoft Office Excel 2 23.04.2010 12:06
Попиксельный доступ к TJPEGImage Serge_Bliznykov Общие вопросы Delphi 4 29.09.2009 22:57