Преобразование и сравнение цвета в RGB ( VBA )

  • Автор темы Автор темы DukereD
  • Дата начала Дата начала

DukereD

макрософил
Топикстартер
Сообщения
521
Реакции
134
Всем привет.
Пишу тут я макрос один для корела, но не суть важно.
А дело такое.
Есть квадратик какого-то цвета. Есть палитра цветов. Как корректней будет вычислить в какой цвет перекрасить пиксель. т.е .какой наиболее близкий цвет из таблицы выбрать.

Сравнивать по минимальной дельте суммы R + G + B или какой алгоритм?

Спасибо.
 
Если речь только про цвет, то я бы сравнивал про Hue.
 
Ага, значит речь не только про цвет. Тогда гуглите формулу дельта Е.
понял. спасибо за полезную подсказку.
суть задания такая. есть пиксель на картинке. и есть гамма ниток.
мне нужно преобразовать цвета в соответвии с имеющимися цветами ниток.
ну и следовательно сгенерировать схему вышивки для данного набора.
 
а нельзя сделать палитру этих цветов, и в нее переводить, типа как перевод в indexed в фотошопе или recolor в иллюстраторе? чтоб программа сама занималась подбором ближайшего
 
а нельзя сделать палитру этих цветов, и в нее переводить, типа как перевод в indexed в фотошопе или recolor в иллюстраторе? чтоб программа сама занималась подбором ближайшего
нельзя к сожалению.
суть макроса такая, что пользователь взял картинку, вставил в корел и нажал кнопку - и получил результат.
 
Для

вполне сгодится простая сумма квадратов разниц по l, a & b.
Понял попробую оба варианта с hsb и lab
Спасибо. А то ж я не силён в колористике сижу мучаю РГБ ))
 
ваш вариант второй.
1606854673608.png
 
Последнее редактирование:
  • Спасибо
Реакции: colorprint, WSkin и ~RA~
Стоит дать возможность юзеру задавать количество ниток (цветов).
да. это конечно будет.
И ограничение просто по кол-ву и ограничение по конкретным цветам которые есть у пользователя
 
Последнее редактирование:
  • Спасибо
Реакции: ~RA~ и DukereD
Обратите внимание на макрос LimitColors Macro Module и на метод Color.GetColorDistanceFrom в объектной модели корела
посмотрел. отличный макрос.

В общем решение проблемы такое.
Как и подсказал RA сравниваем цвета по LAB
Но так же можно сделать и по Hue (принцип такой же)
Вот кусок кода из макроса

Код:
    pi# = Atn(1) * 4
    nc.ConvertToHSB
    h& = nc.HSBHue
    s& = nc.HSBSaturation
    b& = nc.HSBBrightness
    Index& = 1
    ha# = h * pi / 180
    z1# = 255 - b
    r# = b * s / 255
    x1# = r * Sin(ha)
    y1# = r * Cos(ha)
    rm# = 200000 ' ~ 3*(256^2)
    i = 0
    For Each cr In Pal
        r = (x1 - cr.x) * (x1 - cr.x) + (y1 - cr.y) * (y1 - cr.y) + (z1 - cr.z) * (z1 - cr.z)
        i = i + 1
        If r < rm Then
            rm = r
            Index = i
        End If
    Next cr

По Lab у меня сравнение чуть проще, но смысл такой же да.

Код:
                        c.ConvertToLab
                        L = c.LabLuminance
                        A = c.LabComponentA
                        B = c.LabComponentB
                       
                        de = 999999
                        mind = 0
                        For i = 1 To 455
                            cur = Sqr((Pallets(i)(13) - L) ^ 2 + (Pallets(i)(14) - A) ^ 2 + (Pallets(i)(15) - B) ^ 2)
                            If cur < de Then
                                de = cur
                                mind = i
                            End If
                        Next i

По поводу уменьшения количества цветов, то тут тоже логика простая оказалась.
Считаем количество каждого цвета (в макросе площадь считают)
и уменьшаем до нужного N каждый раз применяя палитру с удалением цвета.
 
Последнее редактирование:
Sqr можно убрать (как на первом примере), для операции сравнения неважно корень или квадрат, зато чуть быстрее. А если очень надо, то корень можно от финального результата взять.
455 - волшебное число? Имхо лучше Ubound или Count взять, универсальнее будет.
Ну и сам макрос писался, до появления в модели GetColorDistanceFrom, стоит попробовать метод и сравнить.
 
Последнее редактирование: