Как определить цвет фотографии?

  • Автор темы Автор темы Talker
  • Дата начала Дата начала
FractalizeR
Не, я к тому, что если пользоваться агрегирующими функциями, встроенными в PHP, как у SiMM, например, то и расширения не надо будет устанавливать, и быстродействие хорошо чувствовать себя будет.

Подкину еще задачку для подумать - пользователь аплоадит фотки, которые могут содержать много белого пространства вокруг темного объекта. Надо "кропнуть", оставив только объект.
 
Да, решение с преобразованием в 256-цветное отлично показывает себя с точки зрения быстродействия.

Надо "кропнуть", оставив только объект.
Кропнуть по квадрату? Или по контуру, образовав альфа-канал?
 
FractalizeR
Ну, пускай да, (хотя можно затребовать, чтоб отрезался фон, присутствующий во всех углах, если он одинаковый, но это, я думаю, реже потребуется гораздо, все-таки фотки как-то принято на белом фоне делать).

Вы там уже код пишете что ли? Вы мысли сначала пишите.
 
Нет, я пока другими делами занимаюсь :)
Просто размышляю по ходу дела.

-~{}~ 30.01.08 20:18:

Первое, что приходит в голову - сканировать попиксельно изображение в поисках минимальной и максимальной абсциссы и ординаты небелой точки.
 
О блин,аж самому интересно... Может,цикл #1:(мин.x изображения=размер по x,цикл #2(сканировать цвет точки с y=0 до конца строки,если нашли точку с rgb<240 и её x<мин.x,то мин.x=x точки и выход из цикла #2,иначе продолжаем,конец цикла #2) прибавляем к y+2,конец цикла #1) и так для остальных трех сторон ? Вот только интересно будет проверить время выполнения для фотки где-то 1300*2000 :-)

-~{}~ 30.01.08 20:27:

хотя нет,одна случайная линия может конкретно увеличить размер обрезаемого изображения... Надо,наверное,как то еще средний минимальный x(y) подключать
 
Мысли:
1. Картинке можно изменять размеры через [m]imagecopyresampled[/m]
2. [m]imagefilter[/m]
 
Имеете в виду:уменьшить картинку до 1*(размер по y),найти мин/макс и то же для x ?
 
Про IMAGEFILTER только сегодня от Вас узнал (с изображениями мало работал да и пишу под PHP4) (вы IMG_FILTER_EDGEDETECT имели в виду ?).А вот насчет resize -стормозил,ишак... Блин,придумал :
1.Определить массив с мин.x для каждой строки
2.Вычислить среднюю разницу между мин.x соседних строк
3.Вырезать значения с сильным отклонением от среднего для сглаживания резких перепадов
4.Найти мин.x

А то,что resize даст мне то самое сглаживание-не подумал
 
EDGEDETECT похоже, не подходит :)
http://www.phpied.com/category/php/

хотя нет,одна случайная линия может конкретно увеличить размер обрезаемого изображения... Надо,наверное,как то еще средний минимальный x(y) подключать
Я думаю, что если через весь рисунок идет случайная линия, то она относится к изображению и нужно, чтобы она осталась.
 
А я-нет.Однопиксельная одиночная строка в ФОТОГРАФИИ даст пользователю минимум зрительной информации и ею можно пренебречь.Кстати,не забываем про случайную ТОЧКУ,могущую также поломать алгоритм.Поэтому я считаю,уменьшив изображение раза в 4 по верт/гор,можно избавиться от фактора случайности
 
Ralph
ага рисую я график и тут оказывается что осями моими пренебрегли :(
 
Вы думаете,я зря в своем ответе слово ФОТОГРАФИИ выделил заглавными буквами ? Ведь в исходных условиях задачи были именно они.Искусственно нарисованные изображения-это немного другое.При сильно тщательном подходе никакого искусственного интеллекта не хватит для решения подобных задач.Тем более на php,здесь уж придется чем то пожертвовать

-~{}~ 30.01.08 22:38:

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

-~{}~ 30.01.08 22:41:

Вот kruglov террорист-подкинул головняк и скрылся,а у меня аж голова разболелась :-)
 
В принципе, все логично, а фильтрами я бы предложил из белых пикселей сделать белые, а из остальных - черные, чтоб разные "полупрозрачные" хвостики не поотрезались, т.к. цвет (яркость) у нас все-таки 8-битный, точности может и не хватить...

Ну и также можно попробовать фильтрами перевести ситуацию "темный объект на белом фоне" в более общую "неравномерность на равномерном фоне"
 
FractalizeR
А сепия - это часом не "пропорциональное" изменение всех RGB параметров цвета? найти какое-нибудь средне-пропорциональное... Для ЧБ варианта будет, кстати 1/1/1 для каждой точки. Для сепии - тоже какая-нибудь нормализованная константа :-)
 
Не совсем. Сепия немного сложнее. Чтобы RGB картинку преобразовать в сепию нужно сделать:
R' = (R &#215; 0.393 + G &#215; 0.769 + B &#215; 0.189);
G' = (R &#215; 0.349 + G &#215; 0.686 + B &#215; 0.168);
B' = (R &#215; 0.272 + G &#215; 0.534 + B &#215; 0.131);
 
Сверху