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

kruglov

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

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

FractalizeR

Новичок
Да, решение с преобразованием в 256-цветное отлично показывает себя с точки зрения быстродействия.

Надо "кропнуть", оставив только объект.
Кропнуть по квадрату? Или по контуру, образовав альфа-канал?
 

kruglov

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

Вы там уже код пишете что ли? Вы мысли сначала пишите.
 

FractalizeR

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

-~{}~ 30.01.08 20:18:

Первое, что приходит в голову - сканировать попиксельно изображение в поисках минимальной и максимальной абсциссы и ординаты небелой точки.
 

Ralph

Дикий столяр
О блин,аж самому интересно... Может,цикл #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) подключать
 

kruglov

Новичок
Мысли:
1. Картинке можно изменять размеры через [m]imagecopyresampled[/m]
2. [m]imagefilter[/m]
 

Ralph

Дикий столяр
Имеете в виду:уменьшить картинку до 1*(размер по y),найти мин/макс и то же для x ?
 

Ralph

Дикий столяр
Про IMAGEFILTER только сегодня от Вас узнал (с изображениями мало работал да и пишу под PHP4) (вы IMG_FILTER_EDGEDETECT имели в виду ?).А вот насчет resize -стормозил,ишак... Блин,придумал :
1.Определить массив с мин.x для каждой строки
2.Вычислить среднюю разницу между мин.x соседних строк
3.Вырезать значения с сильным отклонением от среднего для сглаживания резких перепадов
4.Найти мин.x

А то,что resize даст мне то самое сглаживание-не подумал
 

FractalizeR

Новичок
EDGEDETECT похоже, не подходит :)
http://www.phpied.com/category/php/

хотя нет,одна случайная линия может конкретно увеличить размер обрезаемого изображения... Надо,наверное,как то еще средний минимальный x(y) подключать
Я думаю, что если через весь рисунок идет случайная линия, то она относится к изображению и нужно, чтобы она осталась.
 

Ralph

Дикий столяр
А я-нет.Однопиксельная одиночная строка в ФОТОГРАФИИ даст пользователю минимум зрительной информации и ею можно пренебречь.Кстати,не забываем про случайную ТОЧКУ,могущую также поломать алгоритм.Поэтому я считаю,уменьшив изображение раза в 4 по верт/гор,можно избавиться от фактора случайности
 

HraKK

Мудак
Команда форума
Ralph
ага рисую я график и тут оказывается что осями моими пренебрегли :(
 

Ralph

Дикий столяр
Вы думаете,я зря в своем ответе слово ФОТОГРАФИИ выделил заглавными буквами ? Ведь в исходных условиях задачи были именно они.Искусственно нарисованные изображения-это немного другое.При сильно тщательном подходе никакого искусственного интеллекта не хватит для решения подобных задач.Тем более на php,здесь уж придется чем то пожертвовать

-~{}~ 30.01.08 22:38:

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

-~{}~ 30.01.08 22:41:

Вот kruglov террорист-подкинул головняк и скрылся,а у меня аж голова разболелась :)
 

kruglov

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

Ну и также можно попробовать фильтрами перевести ситуацию "темный объект на белом фоне" в более общую "неравномерность на равномерном фоне"
 

ksnk

прохожий
FractalizeR
А сепия - это часом не "пропорциональное" изменение всех RGB параметров цвета? найти какое-нибудь средне-пропорциональное... Для ЧБ варианта будет, кстати 1/1/1 для каждой точки. Для сепии - тоже какая-нибудь нормализованная константа :)
 

FractalizeR

Новичок
Не совсем. Сепия немного сложнее. Чтобы 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);
 
Сверху