Поиск ближайшего цвета
От: Reunion  
Дата: 24.01.05 06:34
Оценка:
Всем привет!

Есть картинка — из нее берется пиксель (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 — цвет из таблицы цветов. НО это бред! Мы ведь не интенсивность должны сравнивать. Точнее, наверное будет сказать, не только интенсивность!
Народ, подскажите как быть в данной ситуации.

Заранее спасибо.
Re: Поиск ближайшего цвета
От: minorlogic Украина  
Дата: 24.01.05 07:40
Оценка:
Странно , оказыывается бред ....а я всю жизнь интенсивноси использую ..
ну я и ламер ...

Просвяти плиз !
Ищу работу, 3D, SLAM, computer graphics/vision.
Re: Поиск ближайшего цвета
От: lazyden  
Дата: 24.01.05 08:27
Оценка:
Здравствуйте, Reunion, Вы писали:

R>В интернете я нашел следующую функцию оценки похожести цветов: f = 30 * (rp — ri) * (rp — ri) + 59 * (gp — gi) * (gp — gi) * 11 * (bp — bi) * (bp — bi), где rp, gp и bp — цвет пикселя, ri, gi и bi — цвет из таблицы цветов. НО это бред! Мы ведь не интенсивность должны сравнивать. Точнее, наверное будет сказать, не только интенсивность!


Наверное опечатка (умножение вместо сложения перед последним квадратом):
f = 30 * (rp - ri) * (rp - ri) + 59 * (gp - gi) * (gp - gi) + 11 * (bp - bi) * (bp - bi)
Так функция работает или нет? Тут вроде нет ничего странного: цвет — точка в трехмерном пространстве RGB. Критерий похожести — расстояние (или квадрат растояния, не важно) между двумя точками. Коэффициенты при квадратах оценивают чувствительность глаза к восприятию чистого цвета.
Re: Поиск ближайшего цвета
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 24.01.05 10:01
Оценка:
Здравствуйте, 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>Заранее спасибо.


Конечно бред. Минимизируя данный функционал мы найдем наиболее подходяций по воспринимаемой яркости.
Для цвета из табице будет иметь такой вид:

f = sqrt ((rp — ri) * (rp — ri) + (gp — gi) * (gp — gi) + (bp — bi) * (bp — bi))

Можно не брать корень.... если нужно быстро.
Re[2]: Поиск ближайшего цвета
От: Reunion  
Дата: 24.01.05 12:19
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Странно , оказыывается бред ....а я всю жизнь интенсивноси использую ..

M> ну я и ламер ...

M> Просвяти плиз !



Ну может и не совсем бред , но смотри: есть голубой цвет. И есть серый цвет. Допустим, что интенсивность голубого = интенсивности серого. И есть еще кроме серого другой голубой цвет, интенсивность которого не равна интенсивности серого. Так вот и получается что первый голубой меняется на серый, а не на второй голубой. По крайней мере в моем случае это неправильно...
Re[2]: Поиск ближайшего цвета
От: Reunion  
Дата: 24.01.05 12:21
Оценка:
Здравствуйте, 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>Наверное опечатка (умножение вместо сложения перед последним квадратом):
L>f = 30 * (rp - ri) * (rp - ri) + 59 * (gp - gi) * (gp - gi) + 11 * (bp - bi) * (bp - bi)
L>
Так функция работает или нет? Тут вроде нет ничего странного: цвет — точка в трехмерном пространстве RGB. Критерий похожести — расстояние (или квадрат растояния, не важно) между двумя точками. Коэффициенты при квадратах оценивают чувствительность глаза к восприятию чистого цвета.


Да, то опечатка. И данная функция работает криво. Смотри ответ minorlogic'у
Re[2]: Поиск ближайшего цвета
От: Reunion  
Дата: 24.01.05 12:23
Оценка:
Здравствуйте, 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'у
Re[3]: Поиск ближайшего цвета
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 24.01.05 12:47
Оценка:
Здравствуйте, 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'у


И что я там должен посмотреть...?

Бред он и есть бред.... С какой стати для нахождения ближайжего цвета, я должен пользоваться весами для яркочти.

Например если мы ищем для некого зеленого цвета, похожий:

Ясно, что если в палитре есть Красный по яркости не отличающийся от него и зеленый отличающийся на чудь-чудь, твой способ найдет именно красный — что является бредом. Попробуй со своим методом хороший дехеринг написать. Я например написал, и не один, и точно могу сказать, что метрика с весами по яркости хорошо будет работать только для полутоновых изображений.
Re[4]: Поиск ближайшего цвета
От: Reunion  
Дата: 24.01.05 13:16
Оценка:
Здравствуйте, 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). И оба неправильные. Я хочу нормальный способ. Если есть работающий пример, делающий все классно, поделись — посмотрю что там...
Re[5]: Поиск ближайшего цвета
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 24.01.05 13:52
Оценка:
Здравствуйте, 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 или без него, правильная.
Опишпте проблему поподробней... Что вы делаете, скриншот...., что должно получиться
Re[5]: Поиск ближайшего цвета
От: ansi  
Дата: 24.01.05 14:15
Оценка:
Задача действительно не так проста как кажется

пусть 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. Иначе белый цвет может запросто стать черным...
Каюсь, грешен, не помню формулы расстояния от точки до прямой в пространстве, так что сам покопайся...
Удачи.
Re: Поиск ближайшего цвета
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.01.05 14:34
Оценка:
Здравствуйте, 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>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Поиск ближайшего цвета
От: minorlogic Украина  
Дата: 24.01.05 14:35
Оценка:
Вот тут у тебя какая то нестыковка , особенно если ты в RGB пространстве , ( а по коду ты вроде как в нем) .
Поэксперементируй.

Возмем ошибку без взвешивания :

цвет голубой R255 G128 B128
серый R128 G128 B128
другой голубой R250 G120 B120

ошибка серого = (255 — 128)*(255 — 128) + (128 — 128) *(128 — 128) + (128 — 128)*(128 — 128) = 128*128 = 16384

ошибка другого голубого = (255 — 250)*(255 — 250) + (128 — 120) *(128 — 120) + (128 — 120)*(128 — 120) = 5*5 + 8*8 + 8*8 = 153

итого у дргого голубого ОШИБКА на порядок меньше.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[3]: Поиск ближайшего цвета
От: minorlogic Украина  
Дата: 24.01.05 14:42
Оценка:
Это и есть сркднеквадратичная ошибка , если надо то поменяй цветовое пространство с RGB на другое LAB например.

Но чем именно может не устроить среднеквадратичная ошибка не знаю .
Может ты джумаешь что формуола возвращает меру похожести ? Нет она ошибку возвращает ..
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[4]: Поиск ближайшего цвета
От: Reunion  
Дата: 24.01.05 15:42
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Вот тут у тебя какая то нестыковка , особенно если ты в RGB пространстве , ( а по коду ты вроде как в нем) .

M>Поэксперементируй.

M>Возмем ошибку без взвешивания :


M>цвет голубой R255 G128 B128

M>серый R128 G128 B128
M>другой голубой R250 G120 B120

M>ошибка серого = (255 — 128)*(255 — 128) + (128 — 128) *(128 — 128) + (128 — 128)*(128 — 128) = 128*128 = 16384


M>ошибка другого голубого = (255 — 250)*(255 — 250) + (128 — 120) *(128 — 120) + (128 — 120)*(128 — 120) = 5*5 + 8*8 + 8*8 = 153


M>итого у дргого голубого ОШИБКА на порядок меньше.


Есть голубой1 (170, 196, 200). В палитре есть серый (200, 200, 200) и голубой2 (197, 255, 249).

(170-197)*(170-197)+(196-255)*(196-255)+(200-249)*(200-249) = 6611
(170-200)*(170-200)+(196-200)*(196-200)+(200-200)*(200-200) = 916

голубой1 меняется на серый, а не на голубой2. А мне надо наоборот...
Re[6]: Поиск ближайшего цвета
От: Reunion  
Дата: 24.01.05 15:43
Оценка:
Здравствуйте, 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).

(170-197)*(170-197)+(196-255)*(196-255)+(200-249)*(200-249) = 6611
(170-200)*(170-200)+(196-200)*(196-200)+(200-200)*(200-200) = 916

голубой1 меняется на серый, а не на голубой2. А мне надо наоборот...
Re[6]: Поиск ближайшего цвета
От: Reunion  
Дата: 24.01.05 15:44
Оценка:
Здравствуйте, 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).
Re[5]: Поиск ближайшего цвета
От: minorlogic Украина  
Дата: 24.01.05 16:10
Оценка:
Значит переводи компоненты в другео цветовое пространство, как я говорил LAB например , и ВЗВЕШИВАЙ бОльшим коофициентом ошибку компонент отвечающих за цветность , а меньшим за яркость.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[7]: Поиск ближайшего цвета
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 24.01.05 16:13
Оценка:
Здравствуйте, 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, возможно что вы и получите то что вам нужно.
Re[5]: Поиск ближайшего цвета
От: WolfHound  
Дата: 24.01.05 16:16
Оценка:
Здравствуйте, 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) А. Эйнштейн