У меня бывают идеи, на реализацию которых я не нахожу времени или не хватает нужных навыков чтобы сделать быстро и эффективно. А не хочется, чтобы идея сгинула. Предлагаю такую форму найма: я публикую здесь описание идеи, вы предлагаете реализацию, а я оплачиваю то, что мне покажется годным. Результат будет open source, но права будут мои, потому что я вас нанимаю. Ссылку на автора я сохраню в коде и readme. Цена объявляется в долларах США, оплата по договорённости на карточку, телефон или PayPal в эквиваленте. №1. Вычислить доминирующие цвета изображения На входе нужное число цветов N, от 1 до 10 и картинка. Формат JPEG, PNG, GIF без анимации. На выходе цвета RGB и их процентное соотношение так, чтобы в сумме вышло 100%. Понятно, что на картинке может быть очень много вариантов цвета, но меня интересуют только N доминирующих цветов. Подасказка: результат должен быть применим для такого поиска картинок по цвету: https://labs.tineye.com/multicolr/#colors=53609a,29a5b4,f1d41c,952b29;weights=19,14,20,47; Цена: $20
о, кажется я нашел годный компонент https://github.com/thephpleague/color-extractor Extract colors from an image like a human would do.
@artoodetoo то есть надо разделить картинку на каждый пиксель и сравнивать цвета? А потом убрать из массива дублирующие цвета, если в этом массиве, есть все цвета, которые были даны, значит совпадение на 100%
наверное есть эффективные методы, трюки и т.д. если решать в лоб, то трудоёмкость кажется пропорциональна квадрату от числа пикселей.
@Dimon2x, ну конечно не всё так просто. Решения в лоб здесь не работают. Первые же свои два я откинул сразу, поскольку одно сожрало бы всю память, другое ишачилось тысячу лет (конечно, если не скармливать картинку 100 на 100 пикселей) --- Добавлено --- @artoodetoo, но их скрипт же тоже сдохнет, если ему большую картинку скормить. Они же таки перебирают каждый пиксель и записывают счётчик в обычный массив. Я думал, ты хотел что-то, чему можно реальную фотку скормить, и оно не сдохнет
однозначно надо реальную. пусть даже это предъявит повышенные требования к ресурсам, главное чтобы результат был верным и получен меньше чем за час ) чем быстрее тем лучше.
я нашел функцию, которой только png можно получить из файла, на сколько я понял. а с другими типами как быть? переводить или есть другие функции, которых я не нашел) --- Добавлено --- и, думаю, решение по ссылке предполагает какой-то разброс по совпадению цвета.
реши для png, это непринципиально. я предполагаю, что поиск оперирует приближенными значениями. в фотошопе есть операция desaturate posterize которая уменьшает число используемых цветов до указанной величины. зачастую ухудшение качества картинки при этом на глаз не заметно. я думаю (это только домыслы), что tineye использует ограниченную производную палитру для индексации картинок. но для нашей задачи неважно какие алгоритмы использует tineye. дайте мне мои цвета из картинки и их доли.
@keren, ну почему, можно и на php решить, всё есть у php для этого. --- Добавлено --- @artoodetoo, думаю найти время, попробовать, есть пара идей. В каком виде показывать, на гитхабе?
уменьшить картинки о размера 100 на 100 вычислить цвета попиксельно вот и будет процент.. можно еще погрешность задать цвет пикселя определяется.. что бы оттенки сошли за один цвет..
Как? Давайте подумаем. Если тупо < и >, то очень яркий 0x0000FF более близок к черному, чем 0x000100 (зрительно - черный).
я уже всё придумал. Время надо найти и код дописать. Смысл в том, что надо разделить все цвета на диапазоны (отдельно от картинки). В моей задумке ширину этих диапазонов можно будет регулировать передаваемым в функцию параметром. Чем шире диапазоны, тем их меньше, и меньше ресурсов и хуже точность определения цвета. Потом за один прогон проходишь по картинке и собираешь массив, в какие диапазоны входит каждый пиксель. Сортируешь полученный массив по убыванию и вуаля. --- Добавлено --- точнее, в массиве диапазонов (в подмассивах) будет значение, изначально равное нулю и растущее по мере нахождения пикселей, входящих в этот диапазон. И по итогу, сортируем массив по этому значению (по убыванию)...
@TeslaFeo я тоже сразу про диапазоны подумал. При чем в моей идее, ширина вычисляется автоматически так, чтобы не было промежутков. Потому что в итоге только вот как обозначить диапазон? Если целочисленно, 255 - это абсолютный красный, а 256 - это зеленый такой темный, что неотличим от черного?
поправочка, 255 это 100% синий. Перепутал порядок бит )) --- Добавлено --- то есть отдельно сравнивать 3 канала? --- Добавлено --- то есть отдельно сравнивать 3 канала?
да. похожий цвет тот у которого ни и один из каналов не выходит за пределы некой дельты --- Добавлено --- PHP: if ($R1 > $R2-$Delta && $R1 < $R2+$Delta && $G1 > $G2-$Delta && $G1 < $G2+$Delta && $B1 > $B2-$Delta && $B1 < $B2+$Delta) { echo 'Ok'; }