Подтвердить что ты не робот

Как определить, является ли изображение фотографией, рисунком или чертежом?

Каков наилучший способ определения типа изображения? rwong ответ на этот вопрос предполагает, что Google сегментирует изображения в следующие группы:

  • Фото - непрерывный тон
  • Клипарт - плавное затенение
  • Линейный чертеж - битонный

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

Спасибо!


Обновление:

Я попробовал уникальный метод подсчета цветов, который tyjkenn упоминается в комментарии, и, похоже, он работает примерно в 90% случаев, которые я пробовал. В частности, черно-белые фотографии трудно определить, используя уникальный цвет.

Получение гистограммы изображения и подсчет очков в одиночку не похоже, что это будет жизнеспособным вариантом. Например, это изображение имеет только два пика:
bRhX9m.jpg

Вот еще два изображения, которые я проверил:
3SWkmm.png
8erc8m.png

4b9b3361

Ответ 1

Эта проблема может быть решена с помощью классификации изображений и, возможно, решения Google для этой проблемы. В основном, вам нужно (i) получить набор изображений, помеченных в 3 категории: фото, клип и рисунок линии; (ii) извлечение признаков из этих изображений; (iii) использовать функции изображения и ярлык для обучения классификатора.

Вывод функции:

На этом этапе вам нужно извлечь визуальную информацию, которая может быть полезна для классификатора, чтобы различать 3 категории изображений:

  • Очень простая, но полезная визуальная функция - это гистограмма изображения и ее варианты. Например, гистограмма уровня серого фотографии, вероятно, более гладкая, чем гистограмма клипа, где у вас есть регионы, которые могут быть все одинаковыми значение цвета.
  • Другая функция, которую можно использовать, - преобразовать изображение в частотную область (например, используя FFT или DCT) и измерить энергию высокочастотных компонентов. Поскольку линейные чертежи, вероятно, будут иметь резкие переходы цветов, его высокочастотные компоненты будут иметь тенденцию накапливать больше энергии.

Также существует ряд других алгоритмов извлечения объектов.

Обучение классификатору:

После фазы извлечения признаков мы будем иметь для каждого изображения вектор числовых значений (пусть называют его вектором свойств изображения) и его кортежем. Это подходящий ввод для обучения классификатора. Что касается классификатора, можно рассмотреть Neural Networks, SVM и другие.

Классификация:

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

Ответ 2

Гистограммы будут первым способом сделать это.
Преобразуйте цветное изображение в оттенки серого и вычислите гистограмму. Очень бимодальная гистограмма с двумя резкими пиками черного (или темного) и белого (или правого), вероятно, с гораздо большим количеством белого цвета, является хорошим показателем для рисования линии.
Если у вас есть еще несколько пиков, то это, скорее всего, изображение типа клипа.
В противном случае это фотография.

Ответ 3

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

1) Тип или расширение Mime

PNG обычно представляют собой рисунки или рисунки, а JPEG - в основном фотографии.

2) Прозрачность

Если изображение имеет альфа-канал, это скорее всего рисунок. Если существует альфа-канал, вы можете дополнительно перебрать все пиксели, чтобы проверить, действительно ли прозрачность используется. Вот пример кода на Python:

from PIL import Image
img = Image.open('test.png')
transparency = False
if img.mode in ('RGBA', 'RGBa', 'LA') or (img.mode == 'P' and 'transparency' in img.info):
    if img.mode != 'RGBA': img = img.convert('RGBA')
    transparency = any(px for px in img.getdata() if px[3] < 220)

print 'Transparency:', transparency

3) Распределение цветов

Клипы часто имеют области с одинаковыми цветами. Если несколько цветов составляют значительную часть изображения, это скорее рисунок, чем фотография. Этот код выводит процент области изображения, который сделан из десяти наиболее используемых цветов (пример Python):

from PIL import Image
img = Image.open('test.jpg')
img.thumbnail((200, 200), Image.ANTIALIAS)
w, h = img.size
print sum(x[0] for x in sorted(img.convert('RGB').getcolors(w*h), key=lambda x: x[0], reverse=True)[:10])/float((w*h))

Вам нужно адаптировать и оптимизировать эти значения. Для ваших данных достаточно десяти цветов? Какой процент работает лучше всего для вас. Узнайте об этом, проверив большее количество образцов изображений. 30% и более обычно являются клипами. Впрочем, не для фотографий в небе и для подобных. Поэтому нам нужен другой метод - следующий.

4) Обнаружение резкого края с помощью FFT

Резкие края приводят к высоким частотам в спектре Фурье. И обычно такие функции чаще всего встречаются на рисунках (еще один фрагмент Python):

from PIL import Image
import numpy as np
img = Image.open('test.jpg').convert('L')
values = abs(numpy.fft.fft2(numpy.asarray(img.convert('L')))).flatten().tolist()
high_values = [x for x in values if x > 10000]
high_values_ratio = 100*(float(len(high_values))/len(values))
print high_values_ratio

Этот код дает вам количество частот, превышающих один миллион на область. Опять же: оптимизируйте такие числа в соответствии с вашими образцами изображений.

Объедините и оптимизируйте эти методы для вашего набора изображений. Дайте мне знать, можете ли вы улучшить это - или просто отредактируйте этот ответ, пожалуйста. Я хотел бы улучшить его сам: -)

Ответ 4

В дополнение к цветным гистограммам также учитывайте информацию о краю и согласованность ширины линий по всему изображению.

Фото - естественные ребра будут иметь множество преимуществ по краю, и менее вероятно, что будет много параллельных ребер.

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

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