Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как сделать цветовой анализ изображения?
 
 автор: Zilog   (23.08.2008 в 17:10)   письмо автору
 
 

Как сделать анализ изображения?
Скажем, есть у меня картинка, на которой есть некая прямоугольная область. Необходимо выяснить, её "средний цвет".

Я полагаю, что надо разложить эту область на RGB, сложить каждую составляющую, и сумму поделить на кол-во пикселей. В итоге мы должны получить один RBG, который будет как раз "средней температурой по больнице" для данной прямоугольной области. так?

Если с теорией более менее всё понятно, то как быть с практикой? Как на php рализовать задуманное?

  Ответить  
 
 автор: sim5   (23.08.2008 в 17:47)   письмо автору
 
   для: Zilog   (23.08.2008 в 17:10)
 

Что значит "средний цвет"?
imagecolorat - получает индекс цвета пиксела
imagecolorclosest - получает индекс цвета, ближайшего к специфицированному
imagecolorsforindex - получает цвет для индекса
imagecolorstotal - находит количество цветов палитры изображения

  Ответить  
 
 автор: Zilog   (25.08.2008 в 01:09)   письмо автору
 
   для: sim5   (23.08.2008 в 17:47)
 

>Что значит "средний цвет"?
это цвет, к которому больше всего ближе картинка, или её часть.
Посмотри, в Яндексе есть возможность поиска по картинкам с цветными фильтрами. Вот у них что то подобное реализовано, как я думаю.

  Ответить  
 
 автор: sim5   (25.08.2008 в 07:27)   письмо автору
 
   для: Zilog   (25.08.2008 в 01:09)
 

И вы думаете поиск идет по "среднему цвету"? Нет такого понятия "средний цвет". Вы представьте себе, что у вас область на которой глаз, и какие цвета могут быть - от цвета кожи до цвета зрачка, какой в этом случае по вашему "средний цвет"?

  Ответить  
 
 автор: Zilog   (25.08.2008 в 16:13)   письмо автору
 
   для: sim5   (25.08.2008 в 07:27)
 

>И вы думаете поиск идет по "среднему цвету"? Нет такого понятия "средний цвет". Вы представьте себе, что у вас область на которой глаз, и какие цвета могут быть - от цвета кожи до цвета зрачка, какой в этом случае по вашему "средний цвет"?

Да, официально такого понятия, наверное, нет. Однако, есть же "средняя температура по больнице" :) У меня тот же случай, тольков в роли больных - выступают пикселы.

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

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

  Ответить  
 
 автор: Trianon   (23.08.2008 в 18:41)   письмо автору
 
   для: Zilog   (23.08.2008 в 17:10)
 

Не исключено, что придется перед осреднением перейти из метрики RGB в метрику Hue, Saturation, Intensity (оттенок, цветонасыщенность, яркость) . В ней выполнить расчет (c учетом весов каждой из составляющих), затем вернуться в исходное пространство.
Задача, мягко говоря, не для php.

  Ответить  
 
 автор: Zilog   (25.08.2008 в 01:12)   письмо автору
 
   для: Trianon   (23.08.2008 в 18:41)
 

Будь оно не для веба - проблем и вопросов было бы меньше.
Нет, в другую метрику переходить ненадо - зачем? На выходе у меня RGB по картинке, какой бы она не была по своему содержанию. Мне этого пока достаточно.

ВОт как это для веба сделать....?

  Ответить  
 
 автор: Le bien   (25.08.2008 в 15:09)   письмо автору
 
   для: Zilog   (23.08.2008 в 17:10)
 

Если Вы будете вычислять "средний цвет" для изображения хотя-бы в 100 пикселов (а это всего-то 10х10) - слишком велика вероятность того, что Вы ошибетесь. Они будут варьироваться от 0 до 255, и "средниц цвет" вероятно будет даже визуально несхожим с тем, что глаз определяет в целом..
Сталкиваясь с подобной задачей, я делал примерно так -
-преобразовывал изображение в 32-цветное
-получал индексы цветов в массив
-по значениям R,G,B вычислял индекс цвета, который встретился чаще всего
Полученый цвет очень грубо был "основным" в изображении.. Но то была распознавалка картинки.. У Вас задачи видимо другая

  Ответить  
 
 автор: Zilog   (25.08.2008 в 16:07)   письмо автору
 
   для: Le bien   (25.08.2008 в 15:09)
 

Спасибо за ответ. А можно поподробнее про реализацию?
В плане подхода и выбора средств.

Готов рассмотреть заплатить за скрипт(?) выполняющий данную работу. ТЗ я напишу.

  Ответить  
 
 автор: Le bien   (25.08.2008 в 16:20)   письмо автору
 
   для: Zilog   (25.08.2008 в 16:07)
 

Мм.. Примерно как то так:


<?php

// Функция преобразовывает изображение в 16-цветное (для 32 аналогично)

function pixel16color $color )
{
    switch ( 
$color )
    {
        case 
$color >= && $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 $imageimagecolorat $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 в 16:20)
 

А разве проще нельзя поступить при преобразовании?:
<?
$im 
imagecreatefromjpeg("pic.jpg");
imagetruecolortopalette($imtrue32);
imagegif($im);
?>

  Ответить  
 
 автор: Zilog   (25.08.2008 в 19:02)   письмо автору
 
   для: 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']; 

  Ответить  
 
 автор: Le bien   (25.08.2008 в 19:02)   письмо автору
 
   для: sim5   (25.08.2008 в 17:29)
 

Конечно можно, но в моем случае был важен еще и возвращаемые значения, "сканировать" их из этой функции было сложнее, чем набросать свое =)

  Ответить  
 
 автор: sim5   (25.08.2008 в 19:06)   письмо автору
 
   для: Le bien   (25.08.2008 в 19:02)
 

А какая разница, если вам все равно придется обращаться за индексом цвета в изображении? Да и вообще, вся эта затея пустое дело, и не даст положительного результата.

  Ответить  
 
 автор: Le bien   (25.08.2008 в 19:08)   письмо автору
 
   для: sim5   (25.08.2008 в 19:06)
 

Разница в том, что для меня значения этих цветов были важны вдальнейшем, и нужно было точно знать все возможные варианты, а я их вручную и прописал =)
Если Вы по поводу моего скрипта распознавания - затея не была пустой и работает по сей день =)

  Ответить  
 
 автор: sim5   (25.08.2008 в 19:13)   письмо автору
 
   для: Le bien   (25.08.2008 в 19:08)
 

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

  Ответить  
 
 автор: Le bien   (25.08.2008 в 19:27)   письмо автору
 
   для: sim5   (25.08.2008 в 19:13)
 

sim5, не имею привычки сочинять то, чего на самом деле не делал =)
вот вам пример картинки:

http://fank.ru/club/register/

распознается на 99%, если Вы все же еще столь недоверчивы - могу пример показать..

  Ответить  
 
 автор: sim5   (25.08.2008 в 19:42)   письмо автору
 
   для: Le bien   (25.08.2008 в 19:27)
 

Два изображения могут быть одинаковы, но одно сжато на 20%, а второе на 75%, одно просто изображение, а ко второму применили фильтр, ну и еще масса всяких "если"... Более всего передо мной стоит задачи поиска дубликатов (не в смысле один ко одному, а одинаковые по содержанию изображения) на компьютере, а не в сети. И я испробовал много программ для решения этой проблемы, и не всегда все получается гладко. Если смотрите ТВ, то видимо видели рекламу ноутбука с новой технологией распознавания. Тенологии, а не три строчки кода! Если бы она строилась на тех же принципах, которыми вы решаете вопросы поиска дубликатов, то давно уже было бы возможным разбивать любой визуальный объект на самые мелкие осмысленные составляющие одним лишь желанием. Увы.

  Ответить  
 
 автор: Le bien   (25.08.2008 в 19:50)   письмо автору
 
   для: sim5   (25.08.2008 в 19:42)
 

Помоему вопрос мы решаем в рамках PHP, "обычного" скриптового языка, который вряд ли позволит создавать ТЕХНОЛОГИИ, мы можем лишь то, что нам сделали возможным в этих рамках =))
Можно бесконечно спорить, пожалуй, об этих технологиях. Жаль нет возможность протестировать, но думаю "потрепав волосы, прикрыв глаза, сменив улыбку на хмурый взгляд" любой сможет обмануть эту "технологию"

  Ответить  
 
 автор: sim5   (25.08.2008 в 20:06)   письмо автору
 
   для: Le bien   (25.08.2008 в 19:50)
 

Даже в рамках РНР тремя строчками кода не решить этой задачи. Изображения один в один, можно не брать в расчет, тут простого сравнения хватит.

  Ответить  
 
 автор: Le bien   (25.08.2008 в 20:31)   письмо автору
 
   для: sim5   (25.08.2008 в 20:06)
 

Помоему флудим мы только (=
Уважаемый, ни я, никто другой помоему не заявлял о "трех строчках"

  Ответить  
 
 автор: Zilog   (25.08.2008 в 23:46)   письмо автору
 
   для: Le bien   (25.08.2008 в 16:20)
 

вопрос исчерпан.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования