|
|
|
| Как сделать анализ изображения?
Скажем, есть у меня картинка, на которой есть некая прямоугольная область. Необходимо выяснить, её "средний цвет".
Я полагаю, что надо разложить эту область на RGB, сложить каждую составляющую, и сумму поделить на кол-во пикселей. В итоге мы должны получить один RBG, который будет как раз "средней температурой по больнице" для данной прямоугольной области. так?
Если с теорией более менее всё понятно, то как быть с практикой? Как на php рализовать задуманное? | |
|
|
|
|
|
|
|
для: Zilog
(23.08.2008 в 17:10)
| | Что значит "средний цвет"?
imagecolorat - получает индекс цвета пиксела
imagecolorclosest - получает индекс цвета, ближайшего к специфицированному
imagecolorsforindex - получает цвет для индекса
imagecolorstotal - находит количество цветов палитры изображения | |
|
|
|
|
|
|
|
для: sim5
(23.08.2008 в 17:47)
| | >Что значит "средний цвет"?
это цвет, к которому больше всего ближе картинка, или её часть.
Посмотри, в Яндексе есть возможность поиска по картинкам с цветными фильтрами. Вот у них что то подобное реализовано, как я думаю. | |
|
|
|
|
|
|
|
для: Zilog
(25.08.2008 в 01:09)
| | И вы думаете поиск идет по "среднему цвету"? Нет такого понятия "средний цвет". Вы представьте себе, что у вас область на которой глаз, и какие цвета могут быть - от цвета кожи до цвета зрачка, какой в этом случае по вашему "средний цвет"? | |
|
|
|
|
|
|
|
для: sim5
(25.08.2008 в 07:27)
| | >И вы думаете поиск идет по "среднему цвету"? Нет такого понятия "средний цвет". Вы представьте себе, что у вас область на которой глаз, и какие цвета могут быть - от цвета кожи до цвета зрачка, какой в этом случае по вашему "средний цвет"?
Да, официально такого понятия, наверное, нет. Однако, есть же "средняя температура по больнице" :) У меня тот же случай, тольков в роли больных - выступают пикселы.
Если это будет глаз, то, по моим предположениям, средний цвет будет колебаться от светло-бежевого до тёмно-коричневого, возможно с оттенками жёлтого. В зависимости от освещения, степени раскрытости глаза и расы человека, которго мы анализируем.
Вот в фотошопе или по ТВ встречал фильтры, которые обычно используются для маскировки лица - всё в квадратиках. Каждый из них имеет один цвет, которые является средним по сумме тех пикселей, которые он закрывает. | |
|
|
|
|
|
|
|
для: Zilog
(23.08.2008 в 17:10)
| | Не исключено, что придется перед осреднением перейти из метрики RGB в метрику Hue, Saturation, Intensity (оттенок, цветонасыщенность, яркость) . В ней выполнить расчет (c учетом весов каждой из составляющих), затем вернуться в исходное пространство.
Задача, мягко говоря, не для php. | |
|
|
|
|
|
|
|
для: Trianon
(23.08.2008 в 18:41)
| | Будь оно не для веба - проблем и вопросов было бы меньше.
Нет, в другую метрику переходить ненадо - зачем? На выходе у меня RGB по картинке, какой бы она не была по своему содержанию. Мне этого пока достаточно.
ВОт как это для веба сделать....? | |
|
|
|
|
|
|
|
для: Zilog
(23.08.2008 в 17:10)
| | Если Вы будете вычислять "средний цвет" для изображения хотя-бы в 100 пикселов (а это всего-то 10х10) - слишком велика вероятность того, что Вы ошибетесь. Они будут варьироваться от 0 до 255, и "средниц цвет" вероятно будет даже визуально несхожим с тем, что глаз определяет в целом..
Сталкиваясь с подобной задачей, я делал примерно так -
-преобразовывал изображение в 32-цветное
-получал индексы цветов в массив
-по значениям R,G,B вычислял индекс цвета, который встретился чаще всего
Полученый цвет очень грубо был "основным" в изображении.. Но то была распознавалка картинки.. У Вас задачи видимо другая | |
|
|
|
|
|
|
|
для: Le bien
(25.08.2008 в 15:09)
| | Спасибо за ответ. А можно поподробнее про реализацию?
В плане подхода и выбора средств.
Готов рассмотреть заплатить за скрипт(?) выполняющий данную работу. ТЗ я напишу. | |
|
|
|
|
|
|
|
для: Zilog
(25.08.2008 в 16:07)
| | Мм.. Примерно как то так:
<?php
// Функция преобразовывает изображение в 16-цветное (для 32 аналогично)
function pixel16color ( $color )
{
switch ( $color )
{
case $color >= 0 && $color < 16:
RETURN 0;
break;
case $color >= 16 && $color < 32:
RETURN 16;
break;
case $color >= 32 && $color < 48:
RETURN 32;
break;
case $color >= 48 && $color < 64:
RETURN 48;
break;
case $color >= 64 && $color < 80:
RETURN 64;
break;
case $color >= 80 && $color < 96:
RETURN 80;
break;
case $color >= 96 && $color < 112:
RETURN 96;
break;
case $color >= 112 && $color < 128:
RETURN 112;
break;
case $color >= 128 && $color < 144:
RETURN 128;
break;
case $color >= 144 && $color < 160:
RETURN 144;
break;
case $color >= 160 && $color < 176:
RETURN 160;
break;
case $color >= 176 && $color < 192:
RETURN 176;
break;
case $color >= 192 && $color < 208:
RETURN 192;
break;
case $color >= 208 && $color < 224:
RETURN 208;
break;
case $color >= 224 && $color < 240:
RETURN 224;
break;
case $color >= 240 && $color <= 256:
RETURN 256;
break;
}
}
// создаем изображение
$image = imagecreatetruecolor ( 'file.jpeg' );
// в цикле сохраним цвета координат
$add = array ();
for ( $i = 0; $i <= imagesx ( $image ); $i++ )
{
for ( $j = 0; $j <= imagesy ( $image ); $j ++ )
{
$pixel = imagecolorsforindex ( $image, imagecolorat ( $image, $value['x'], $value['y'] ) );
$add['red'][] = $pixel['red'];
$add['green'][] = $pixel['green'];
$add['blue'][] = $pixel['blue'];
}
}
// Дальше думаю проблем не должно возникать, в массиве у Вас все цвета, оставьте уникальные и посчитайте какого из них больше всего.. Суть примерна такая
?>
|
| |
|
|
|
|
|
|
|
для: Le bien
(25.08.2008 в 16:20)
| | А разве проще нельзя поступить при преобразовании?:
<?
$im = imagecreatefromjpeg("pic.jpg");
imagetruecolortopalette($im, true, 32);
imagegif($im);
?>
|
| |
|
|
|
|
|
|
|
для: sim5
(25.08.2008 в 17:29)
| | Действительно.
Можно ли поступить таким образом?
Если мы условно делим изображние 10 на 10 клеток, то мы можем просто сделать временную копию рисунка с такими размерами, и каждый пиксел у нас будет того самого "среднего цвета". Так ведь?
Так же мы можем получить средний цвет, например, для всего изображения, уменьшив его до размера 1х1 пикселей. Верно?
Остаётся один вопрос: как, уменьшив рисунок, получиьт доступ к цветам пикселей, что бы занести данные в БД.?
Не это ли ответ на вопрос:
$pixel = imagecolorsforindex ( $image, imagecolorat ( $image, $value['x'], $value['y'] ) );
$add['red'][] = $pixel['red'];
$add['green'][] = $pixel['green'];
$add['blue'][] = $pixel['blue'];
|
| |
|
|
|
|
|
|
|
для: sim5
(25.08.2008 в 17:29)
| | Конечно можно, но в моем случае был важен еще и возвращаемые значения, "сканировать" их из этой функции было сложнее, чем набросать свое =) | |
|
|
|
|
|
|
|
для: Le bien
(25.08.2008 в 19:02)
| | А какая разница, если вам все равно придется обращаться за индексом цвета в изображении? Да и вообще, вся эта затея пустое дело, и не даст положительного результата. | |
|
|
|
|
|
|
|
для: sim5
(25.08.2008 в 19:06)
| | Разница в том, что для меня значения этих цветов были важны вдальнейшем, и нужно было точно знать все возможные варианты, а я их вручную и прописал =)
Если Вы по поводу моего скрипта распознавания - затея не была пустой и работает по сей день =) | |
|
|
|
|
|
|
|
для: Le bien
(25.08.2008 в 19:08)
| | Ну, если вы хотите меня уверовать в том, что ваш "простецкий" код находит идентичные изображения, то зря, не поверю. Во-первых потому, что два одинаковых изображения, могут иметь разный размер, во-вторых они могут иметь разную ориентацию, и так далее... Не таким простым подходом все это достигается. | |
|
|
|
|
|
|
|
для: sim5
(25.08.2008 в 19:13)
| | sim5, не имею привычки сочинять то, чего на самом деле не делал =)
вот вам пример картинки:
http://fank.ru/club/register/
распознается на 99%, если Вы все же еще столь недоверчивы - могу пример показать.. | |
|
|
|
|
|
|
|
для: Le bien
(25.08.2008 в 19:27)
| | Два изображения могут быть одинаковы, но одно сжато на 20%, а второе на 75%, одно просто изображение, а ко второму применили фильтр, ну и еще масса всяких "если"... Более всего передо мной стоит задачи поиска дубликатов (не в смысле один ко одному, а одинаковые по содержанию изображения) на компьютере, а не в сети. И я испробовал много программ для решения этой проблемы, и не всегда все получается гладко. Если смотрите ТВ, то видимо видели рекламу ноутбука с новой технологией распознавания. Тенологии, а не три строчки кода! Если бы она строилась на тех же принципах, которыми вы решаете вопросы поиска дубликатов, то давно уже было бы возможным разбивать любой визуальный объект на самые мелкие осмысленные составляющие одним лишь желанием. Увы. | |
|
|
|
|
|
|
|
для: sim5
(25.08.2008 в 19:42)
| | Помоему вопрос мы решаем в рамках PHP, "обычного" скриптового языка, который вряд ли позволит создавать ТЕХНОЛОГИИ, мы можем лишь то, что нам сделали возможным в этих рамках =))
Можно бесконечно спорить, пожалуй, об этих технологиях. Жаль нет возможность протестировать, но думаю "потрепав волосы, прикрыв глаза, сменив улыбку на хмурый взгляд" любой сможет обмануть эту "технологию" | |
|
|
|
|
|
|
|
для: Le bien
(25.08.2008 в 19:50)
| | Даже в рамках РНР тремя строчками кода не решить этой задачи. Изображения один в один, можно не брать в расчет, тут простого сравнения хватит. | |
|
|
|
|
|
|
|
для: sim5
(25.08.2008 в 20:06)
| | Помоему флудим мы только (=
Уважаемый, ни я, никто другой помоему не заявлял о "трех строчках" | |
|
|
|
|
|
|
|
для: Le bien
(25.08.2008 в 16:20)
| | вопрос исчерпан. | |
|
|
|