Довольно простые, но эффективные подходы для разграничения рисунков и фотографий.Используйте их в комбинации для достижения максимальной точности:
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
Этот код дает вам количество частот, превышающее один миллион на область.Опять же: оптимизируйте такие числа в соответствии с вашими образцами изображений.
Объедините и оптимизируйте эти методы для вашего набора изображений.Дайте мне знать, если вы можете улучшить это - или просто отредактируйте этот ответ, пожалуйста.Я бы хотел улучшить это сам: -)