Проверка того, находится ли цвет в определенном диапазоне цветов

Как бы вы проверили, находится ли значение rgb или hex в определенном диапазоне цветов? Желательно с рубином.

Я использую ruby ​​и rmagick для извлечения цветов (квантизация и color_histogram) из изображений, а затем сохраняю эти цвета в базе данных. Если кто-то искал похожий цвет (шестнадцатеричный или RGB), я хочу иметь возможность вернуть этот цвет.

например Если кто-то искал #f4f4f4, я хотел бы вернуть #f5f5f5, #f3f3f3 и все другие близкие шестнадцатеричные значения.


person colourandcode    schedule 17.03.2011    source источник


Ответы (1)


Если вы рассматриваете RGB как трехмерное пространство с осями R, G и B, вы можете определить «близкие цвета» как куб или сферу вокруг цвета и вернуть все цвета внутри него (или проверить заданный цвет если это достаточно близко). Формулы для этого довольно просты:

Original color R, G, B
Cube with side length L around it:
  All colors between (R - L/2, G - L/2, B - L/2) and (R + L/2, G + L/2, B + L/2)
Sphere with radius R around it:
  New color R_new, G_new, B_new is inside if
    delta_r * delta_r + delta_g * delta_g + delta_b * delta_b < R * R
      where
        delta_r = abs(R - R_new)
        delta_g = abs(G - G_new)
        delta_b = abs(B - B_new)

Использование сферы вместо куба является «правильным» способом, но это не будет иметь большого значения для маленьких, а цвета внутри куба немного легче вычислить.

person schnaader    schedule 17.03.2011