Есть картинка — из нее берется пиксель (x, y). Есть набор цветов. Надо для пикселя (x, y) найти наиболее похожий для глаза цвет из данного набора.
В интернете я нашел следующую функцию оценки похожести цветов: f = 30 * (rp — ri) * (rp — ri) + 59 * (gp — gi) * (gp — gi) * 11 * (bp — bi) * (bp — bi), где rp, gp и bp — цвет пикселя, ri, gi и bi — цвет из таблицы цветов. НО это бред! Мы ведь не интенсивность должны сравнивать. Точнее, наверное будет сказать, не только интенсивность!
Народ, подскажите как быть в данной ситуации.
Здравствуйте, Reunion, Вы писали:
R>В интернете я нашел следующую функцию оценки похожести цветов: f = 30 * (rp — ri) * (rp — ri) + 59 * (gp — gi) * (gp — gi) * 11 * (bp — bi) * (bp — bi), где rp, gp и bp — цвет пикселя, ri, gi и bi — цвет из таблицы цветов. НО это бред! Мы ведь не интенсивность должны сравнивать. Точнее, наверное будет сказать, не только интенсивность!
Наверное опечатка (умножение вместо сложения перед последним квадратом):
Так функция работает или нет? Тут вроде нет ничего странного: цвет — точка в трехмерном пространстве RGB. Критерий похожести — расстояние (или квадрат растояния, не важно) между двумя точками. Коэффициенты при квадратах оценивают чувствительность глаза к восприятию чистого цвета.
Здравствуйте, Reunion, Вы писали:
R>Всем привет!
R>Есть картинка — из нее берется пиксель (x, y). Есть набор цветов. Надо для пикселя (x, y) найти наиболее похожий для глаза цвет из данного набора. R>В интернете я нашел следующую функцию оценки похожести цветов: f = 30 * (rp — ri) * (rp — ri) + 59 * (gp — gi) * (gp — gi) * 11 * (bp — bi) * (bp — bi), где rp, gp и bp — цвет пикселя, ri, gi и bi — цвет из таблицы цветов. НО это бред! Мы ведь не интенсивность должны сравнивать. Точнее, наверное будет сказать, не только интенсивность! R>Народ, подскажите как быть в данной ситуации.
R>Заранее спасибо.
Конечно бред. Минимизируя данный функционал мы найдем наиболее подходяций по воспринимаемой яркости.
Для цвета из табице будет иметь такой вид:
Здравствуйте, minorlogic, Вы писали:
M>Странно , оказыывается бред ....а я всю жизнь интенсивноси использую .. M> ну я и ламер ...
M> Просвяти плиз !
Ну может и не совсем бред , но смотри: есть голубой цвет. И есть серый цвет. Допустим, что интенсивность голубого = интенсивности серого. И есть еще кроме серого другой голубой цвет, интенсивность которого не равна интенсивности серого. Так вот и получается что первый голубой меняется на серый, а не на второй голубой. По крайней мере в моем случае это неправильно...
Здравствуйте, lazyden, Вы писали:
L>Здравствуйте, Reunion, Вы писали:
R>>В интернете я нашел следующую функцию оценки похожести цветов: f = 30 * (rp — ri) * (rp — ri) + 59 * (gp — gi) * (gp — gi) * 11 * (bp — bi) * (bp — bi), где rp, gp и bp — цвет пикселя, ri, gi и bi — цвет из таблицы цветов. НО это бред! Мы ведь не интенсивность должны сравнивать. Точнее, наверное будет сказать, не только интенсивность!
L>Наверное опечатка (умножение вместо сложения перед последним квадратом):
Так функция работает или нет? Тут вроде нет ничего странного: цвет — точка в трехмерном пространстве RGB. Критерий похожести — расстояние (или квадрат растояния, не важно) между двумя точками. Коэффициенты при квадратах оценивают чувствительность глаза к восприятию чистого цвета.
Да, то опечатка. И данная функция работает криво. Смотри ответ minorlogic'у
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>Здравствуйте, Reunion, Вы писали:
R>>Всем привет!
R>>Есть картинка — из нее берется пиксель (x, y). Есть набор цветов. Надо для пикселя (x, y) найти наиболее похожий для глаза цвет из данного набора. R>>В интернете я нашел следующую функцию оценки похожести цветов: f = 30 * (rp — ri) * (rp — ri) + 59 * (gp — gi) * (gp — gi) * 11 * (bp — bi) * (bp — bi), где rp, gp и bp — цвет пикселя, ri, gi и bi — цвет из таблицы цветов. НО это бред! Мы ведь не интенсивность должны сравнивать. Точнее, наверное будет сказать, не только интенсивность! R>>Народ, подскажите как быть в данной ситуации.
R>>Заранее спасибо.
ATP>Конечно бред. Минимизируя данный функционал мы найдем наиболее подходяций по воспринимаемой яркости. ATP>Для цвета из табице будет иметь такой вид:
ATP>f = sqrt ((rp — ri) * (rp — ri) + (gp — gi) * (gp — gi) + (bp — bi) * (bp — bi))
ATP>Можно не брать корень.... если нужно быстро.
Можно так, но результат все равно тот же. Смотри мой ответ minorlogic'у
Здравствуйте, Reunion, Вы писали:
R>Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>>Здравствуйте, Reunion, Вы писали:
R>>>Всем привет!
R>>>Есть картинка — из нее берется пиксель (x, y). Есть набор цветов. Надо для пикселя (x, y) найти наиболее похожий для глаза цвет из данного набора. R>>>В интернете я нашел следующую функцию оценки похожести цветов: f = 30 * (rp — ri) * (rp — ri) + 59 * (gp — gi) * (gp — gi) * 11 * (bp — bi) * (bp — bi), где rp, gp и bp — цвет пикселя, ri, gi и bi — цвет из таблицы цветов. НО это бред! Мы ведь не интенсивность должны сравнивать. Точнее, наверное будет сказать, не только интенсивность! R>>>Народ, подскажите как быть в данной ситуации.
R>>>Заранее спасибо.
ATP>>Конечно бред. Минимизируя данный функционал мы найдем наиболее подходяций по воспринимаемой яркости. ATP>>Для цвета из табице будет иметь такой вид:
ATP>>f = sqrt ((rp — ri) * (rp — ri) + (gp — gi) * (gp — gi) + (bp — bi) * (bp — bi))
ATP>>Можно не брать корень.... если нужно быстро.
R>Можно так, но результат все равно тот же. Смотри мой ответ minorlogic'у
И что я там должен посмотреть...?
Бред он и есть бред.... С какой стати для нахождения ближайжего цвета, я должен пользоваться весами для яркочти.
Например если мы ищем для некого зеленого цвета, похожий:
Ясно, что если в палитре есть Красный по яркости не отличающийся от него и зеленый отличающийся на чудь-чудь, твой способ найдет именно красный — что является бредом. Попробуй со своим методом хороший дехеринг написать. Я например написал, и не один, и точно могу сказать, что метрика с весами по яркости хорошо будет работать только для полутоновых изображений.
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>И что я там должен посмотреть...?
ATP>Бред он и есть бред.... С какой стати для нахождения ближайжего цвета, я должен пользоваться весами для яркочти.
ATP>Например если мы ищем для некого зеленого цвета, похожий:
ATP>Ясно, что если в палитре есть Красный по яркости не отличающийся от него и зеленый отличающийся на чудь-чудь, твой способ найдет именно красный — что является бредом. Попробуй со своим методом хороший дехеринг написать. Я например написал, и не один, и точно могу сказать, что метрика с весами по яркости хорошо будет работать только для полутоновых изображений.
Я не говорил, что там все правильно. Я говорю, что результат одинаковый и при f = sqrt ((rp — ri) * (rp — ri) + (gp — gi) * (gp — gi) + (bp — bi) * (bp — bi)) и при f = 30 * (rp — ri) * (rp — ri) + 59 * (gp — gi) * (gp — gi) * 11 * (bp — bi) * (bp — bi). И оба неправильные. Я хочу нормальный способ. Если есть работающий пример, делающий все классно, поделись — посмотрю что там...
Здравствуйте, Reunion, Вы писали:
R>Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>>И что я там должен посмотреть...?
ATP>>Бред он и есть бред.... С какой стати для нахождения ближайжего цвета, я должен пользоваться весами для яркочти.
ATP>>Например если мы ищем для некого зеленого цвета, похожий:
ATP>>Ясно, что если в палитре есть Красный по яркости не отличающийся от него и зеленый отличающийся на чудь-чудь, твой способ найдет именно красный — что является бредом. Попробуй со своим методом хороший дехеринг написать. Я например написал, и не один, и точно могу сказать, что метрика с весами по яркости хорошо будет работать только для полутоновых изображений.
R>Я не говорил, что там все правильно. Я говорю, что результат одинаковый и при f = sqrt ((rp — ri) * (rp — ri) + (gp — gi) * (gp — gi) + (bp — bi) * (bp — bi)) и при f = 30 * (rp — ri) * (rp — ri) + 59 * (gp — gi) * (gp — gi) * 11 * (bp — bi) * (bp — bi). И оба неправильные. Я хочу нормальный способ. Если есть работающий пример, делающий все классно, поделись — посмотрю что там...
Ну вы же не написали что хотите сделать. Как я могу догадаться... Что значит неправильный результат??????
Формула с SQRT или без него, правильная.
Опишпте проблему поподробней... Что вы делаете, скриншот...., что должно получиться
пусть k — интенсивность, которой ты готов пожертвовать (а чем-то жертвовать в любом случае придется).
(r, g, b) — изначальный цвет.
S — шар радиуса k с центром в точке (r, g, b).
Сейчас ты в шаре S ищешь точку (r1, g1, b1), расстояние от которой до точки (r, g, b) минимально.
А надо искать такую точку (r1, g1, b1), расстояние от которой до прямой, проходящей через точки (0, 0, 0) и (r, g, b), минимально. Таким образом, близость цветов ставится выше близости интенсивностей, но в разумных пределах k. Иначе белый цвет может запросто стать черным...
Каюсь, грешен, не помню формулы расстояния от точки до прямой в пространстве, так что сам покопайся...
Удачи.
Здравствуйте, Reunion, Вы писали:
R>Всем привет!
R>Есть картинка — из нее берется пиксель (x, y). Есть набор цветов. Надо для пикселя (x, y) найти наиболее похожий для глаза цвет из данного набора. R>В интернете я нашел следующую функцию оценки похожести цветов: f = 30 * (rp — ri) * (rp — ri) + 59 * (gp — gi) * (gp — gi) * 11 * (bp — bi) * (bp — bi), где rp, gp и bp — цвет пикселя, ri, gi и bi — цвет из таблицы цветов. НО это бред! Мы ведь не интенсивность должны сравнивать. Точнее, наверное будет сказать, не только интенсивность! R>Народ, подскажите как быть в данной ситуации.
R>Заранее спасибо.
Попробуй квадратичную метрику в пространстве HSL.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Это и есть сркднеквадратичная ошибка , если надо то поменяй цветовое пространство с RGB на другое LAB например.
Но чем именно может не устроить среднеквадратичная ошибка не знаю .
Может ты джумаешь что формуола возвращает меру похожести ? Нет она ошибку возвращает ..
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>Здравствуйте, Reunion, Вы писали:
R>>Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>>>И что я там должен посмотреть...?
ATP>>>Бред он и есть бред.... С какой стати для нахождения ближайжего цвета, я должен пользоваться весами для яркочти.
ATP>>>Например если мы ищем для некого зеленого цвета, похожий:
ATP>>>Ясно, что если в палитре есть Красный по яркости не отличающийся от него и зеленый отличающийся на чудь-чудь, твой способ найдет именно красный — что является бредом. Попробуй со своим методом хороший дехеринг написать. Я например написал, и не один, и точно могу сказать, что метрика с весами по яркости хорошо будет работать только для полутоновых изображений.
R>>Я не говорил, что там все правильно. Я говорю, что результат одинаковый и при f = sqrt ((rp — ri) * (rp — ri) + (gp — gi) * (gp — gi) + (bp — bi) * (bp — bi)) и при f = 30 * (rp — ri) * (rp — ri) + 59 * (gp — gi) * (gp — gi) * 11 * (bp — bi) * (bp — bi). И оба неправильные. Я хочу нормальный способ. Если есть работающий пример, делающий все классно, поделись — посмотрю что там...
ATP> Ну вы же не написали что хотите сделать. Как я могу догадаться... Что значит неправильный результат?????? ATP>Формула с SQRT или без него, правильная. ATP>Опишпте проблему поподробней... Что вы делаете, скриншот...., что должно получиться
Описываю. Есть картинка из которой надо сделать витраж. Картинка бъется на области и считается средний цвет внутри каждой области. Но стекла не бывают любых цветов (по крайней мере в моем случае, у меня их число ограничено) — т.е. есть набор цветов стекол. Надо подобрать стекло для каждой области исходя из среднего цвета.
Есть голубой1 (170, 196, 200). В палитре есть серый (200, 200, 200) и голубой2 (197, 255, 249).
Здравствуйте, ansi, Вы писали:
A>Задача действительно не так проста как кажется
A>пусть k — интенсивность, которой ты готов пожертвовать (а чем-то жертвовать в любом случае придется). A>(r, g, b) — изначальный цвет. A>S — шар радиуса k с центром в точке (r, g, b).
A>Сейчас ты в шаре S ищешь точку (r1, g1, b1), расстояние от которой до точки (r, g, b) минимально.
A>А надо искать такую точку (r1, g1, b1), расстояние от которой до прямой, проходящей через точки (0, 0, 0) и (r, g, b), минимально. Таким образом, близость цветов ставится выше близости интенсивностей, но в разумных пределах k. Иначе белый цвет может запросто стать черным... A>Каюсь, грешен, не помню формулы расстояния от точки до прямой в пространстве, так что сам покопайся... A>Удачи.
Опишите алгоритм подробнее. Пусть есть функция f, считающая расстояние от точки(x1, y1, z1) до прямой, заданной точками (x2, y2, z2) и (x3, y3, z3).
Значит переводи компоненты в другео цветовое пространство, как я говорил LAB например , и ВЗВЕШИВАЙ бОльшим коофициентом ошибку компонент отвечающих за цветность , а меньшим за яркость.
Здравствуйте, Reunion, Вы писали:
R>Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>>Здравствуйте, Reunion, Вы писали:
R>>>Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>>>>И что я там должен посмотреть...?
ATP>>>>Бред он и есть бред.... С какой стати для нахождения ближайжего цвета, я должен пользоваться весами для яркочти.
ATP>>>>Например если мы ищем для некого зеленого цвета, похожий:
ATP>>>>Ясно, что если в палитре есть Красный по яркости не отличающийся от него и зеленый отличающийся на чудь-чудь, твой способ найдет именно красный — что является бредом. Попробуй со своим методом хороший дехеринг написать. Я например написал, и не один, и точно могу сказать, что метрика с весами по яркости хорошо будет работать только для полутоновых изображений.
R>>>Я не говорил, что там все правильно. Я говорю, что результат одинаковый и при f = sqrt ((rp — ri) * (rp — ri) + (gp — gi) * (gp — gi) + (bp — bi) * (bp — bi)) и при f = 30 * (rp — ri) * (rp — ri) + 59 * (gp — gi) * (gp — gi) * 11 * (bp — bi) * (bp — bi). И оба неправильные. Я хочу нормальный способ. Если есть работающий пример, делающий все классно, поделись — посмотрю что там...
ATP>> Ну вы же не написали что хотите сделать. Как я могу догадаться... Что значит неправильный результат?????? ATP>>Формула с SQRT или без него, правильная. ATP>>Опишпте проблему поподробней... Что вы делаете, скриншот...., что должно получиться
R>Описываю. Есть картинка из которой надо сделать витраж. Картинка бъется на области и считается средний цвет внутри каждой области. Но стекла не бывают любых цветов (по крайней мере в моем случае, у меня их число ограничено) — т.е. есть набор цветов стекол. Надо подобрать стекло для каждой области исходя из среднего цвета.
R>Есть голубой1 (170, 196, 200). В палитре есть серый (200, 200, 200) и голубой2 (197, 255, 249).
R>(170-197)*(170-197)+(196-255)*(196-255)+(200-249)*(200-249) = 6611 R>(170-200)*(170-200)+(196-200)*(196-200)+(200-200)*(200-200) = 916
R>голубой1 меняется на серый, а не на голубой2. А мне надо наоборот...
Из вашего примера видно, что серый (200, 200, 200) больше подходит чем второй грязно голубой — почти серый. Но это как я понимаю не стыкуется с тем что вам нужно... поэтому попробуйте более близкую к восприятию человеком цвета модель HLS:
Получится, что по яркости больше подходит серый, а вот по цвету и по насыщенности, больше будет подходить второй голубой (у серого она равна 0).
Попробуйте HLS, возможно что вы и получите то что вам нужно.
Здравствуйте, Reunion, Вы писали:
R>Есть голубой1 (170, 196, 200). В палитре есть серый (200, 200, 200) и голубой2 (197, 255, 249).
R>(170-197)*(170-197)+(196-255)*(196-255)+(200-249)*(200-249) = 6611 R>(170-200)*(170-200)+(196-200)*(196-200)+(200-200)*(200-200) = 916
R>голубой1 меняется на серый, а не на голубой2. А мне надо наоборот...
Ну знаешь на мой субъективный взгляд голубой1 гораздо ближе к серому чем к голуботму2
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн