LINUX.ORG.RU

Оцените задумку: Сортировка изображений по «унылости»


0

1

Серые, однотонные изображения отсеиваются от цветастых - http://php.kirovnet.ru/acolors.html

Программа проходит по каталогу, формирует миниатюры, и автоматически генерирует index.html, где они упорядочены по «унылости».

Мне это нужно для сортировки фотографий перед выкладыванием на Яндекс.Фотки. Обычно людям нравятся контрастные изображения.

Собственно, кусок кода, вычисляющий коэффициент «унылости»:

  for (y1 = 0; y1 < h; y1++) {
  for (x1 = 0; x1 < w; x1++) {
  U08 r1,g1,b1;
  r1 = pImage0->SR(x1,y1);
  g1 = pImage0->SG(x1,y1);
  b1 = pImage0->SB(x1,y1);
  igray += max(max(abs(r1-g1),abs(r1-b1)),abs(g1-b1));
  }
  }
  printf ("%6.4f\n",
    igray/(double)(w*h)
  );

★★★★★

Последнее исправление: pacify (всего исправлений: 1)

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

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

AIv ★★★★★
()

Предлагаю идею развить. Пусть компьютер сам генерит фотки с максимальным коэффициентом «унылости».

dave ★★★★★
()
Ответ на: комментарий от AIv

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

точек (типа градиент)


Да, похоже надо брать градиент.

Но я пробовал - просуммировать разницы в цвете, делённые на расстояние между точками (для каждой пары точек).
Сложность перебора - O(n^2) = O(w*h*w*h).
Получилось что-то не очень хорошее.
Типа такого: http://php.kirovnet.ru/images/acolors-first-diagramm.jpg

pacify ★★★★★
() автор топика

Ну тогда возьми хотя-бы RMS (google).

inline unsigned q(int a, int b) {
    int d = a - b;
    return d * d;
}

factor += sqrt(q(r,g) + q(r,b)) + q(g,b));

ly
()

Ага, согласен с предыдущим оратором. Например такая ситуация: половина фотки - засвеченное небо, а вторая серое пятно. Мне кажется, что в алгоритме надо оперировать не сразу точками, а усреднёнными значениями твоей оценки за разные участки изображения. Можно ещё поправить функцию, чтобы оттенки серого не так влияли на оценку, или чтобы оценивалось количество чистых(всмысле как мы его видим) цветов из палитры художника.

anonymous
()
Ответ на: комментарий от dave

> с минимальным [коэффициентом унылости], конечно

Думаю, для аватарок будет полезно.
Вот здесь такое используется: http://stackoverflow.com/questions/1901487/youtube-data-api-comment-paging (последний аватар - автоматически сгенерен)

pacify ★★★★★
() автор топика
Ответ на: комментарий от anonymous

> чтобы оттенки серого не так влияли на оценку,

Правда, есть очень качественные фотографии, обработанные фильтром «Sepia» (на моем Canon A590IS), которые не хотелось бы потерять из-за «ложной унылости».

Попарное сравнение точек (без учета контекста) не подошло.
Это можно объяснить тем, что случайно перемешанные пикселы на картине квадрата Малевича дадут собвершенно иное изображение - типа «телевизионный сигнал».

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

Не, N^2 это тухло, и главное не нужно. На самом деле целевая ф-я должна быть настраиваемой по неск критериям. Каждый критерий учитывается со своим весом (в прстйешем случае, в бол сложном могут быть степени от критериев и проч). Что б по дцать раз не пересчитывать - считать значения неск критериев независимо, а потом подбирать их комбинацию так, что бы получался приемлемый рез-тат. С практикой что нить разумное выпляшется...

МОжно строить модуль градиента (это будет двумерное поле), и там уже брать макс, или какие то интегральные оценки (средний градиент или че нить еще). МОжно оценивать близость соседних точек по цвету так что б не вызывало диссонанса. Да много чего можно...

AIv ★★★★★
()
Ответ на: комментарий от AIv

> считать значения неск критериев независимо, а потом подбирать их

комбинацию так, что бы получался приемлемый рез-тат


В теории распознавания образов это называется - построение пространства признаков (признакового пространства). Обычно эта задача решается на этапе предпроектного исследования - своеобразная исследовательская работа перед разработкой алгоритмов.

или какие то интегральные оценки (средний градиент или че нить еще)


Я думаю, для начала построить палитру изображения - чем больше будет контрастных разностей, тем «веселее» изображение.

К тому же, учитывать «художественную ценность» разностей.
Например, надо учитывать, что «красно-зеленое» изображение - это плохо.
А «черно-желтое» в полосочку - это уже весело.

pacify ★★★★★
() автор топика
Ответ на: комментарий от AIv

> Можно оценивать близость соседних точек по цвету так что б не

вызывало диссонанса.


К сожалению, суммирование dcolor/distance - не дает желаемого эффекта.
Также, как и суммирование разностей в определенной окрестности.
Дельта между различными изображениями получается небольшой.

pacify ★★★★★
() автор топика

Задайте еще хотя бы параметр детализованности/контрастности (получая его, например, из HL- и LH-компонент одноуровневого вейвлет-преобразования изображения; или же можно использовать фильтр лапласиана гауссианы).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

> Задайте еще хотя бы параметр детализованности/контрастности ...

Для этого я просто суммировал значение фильтра Собеля для компонентов изображения.
Получилось очень быстро - однопроходный алгоритм, O(N).

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

Ну так а чего Вы - лучше меня все знаете;-)

AIv ★★★★★
()
Ответ на: комментарий от pacify

Со всеми этими алгоритмами я понял, что быстрой и надежной оценки качества изображения получить невозможно. Вот, где-то с полгода-год назад я занимался быстрым автофокусированием - фигвам. При помощи вейвлет-преобразований можно определить, что изображение дефокусировано, и даже примерно прикинуть, насколько оно дефокусировано. Но определить, в какую сторону «двигать фокус», невозможно...

Вот так и в вашем случае: на 10 изображений, удовлетворяющих эксперименту, найдется 100, не удовлетворяющих ему.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

> Но определить, в какую сторону «двигать фокус», невозможно...

Я так понимаю, можно действовать по-аналогии с бинарным поиском.
Если при изменении фокуса изображение «фокусируется» - двигать его в ту же сторону.
Ну, или поиск с золотым сечением - в некоторых случаях он быстрее.

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

Если при изменении фокуса изображение «фокусируется» - двигать его в ту же сторону.

Этот алгоритм и используется в фотоаппаратах. Непригодность его в том, что он очень медленный. Вы не сможете за пару кадров полностью сфокусироваться. А хотелось бы.

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.