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

DukereD

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

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

Спасибо.
 

DukereD

макрософил
Топикстартер
Сообщения
462
Реакции
114

~RA~

Одарённая.
12 лет на форуме
Сообщения
11 891
Реакции
3 458
Если речь только про цвет, то я бы сравнивал про Hue.
 

DukereD

макрософил
Топикстартер
Сообщения
462
Реакции
114

DukereD

макрософил
Топикстартер
Сообщения
462
Реакции
114
Ага, значит речь не только про цвет. Тогда гуглите формулу дельта Е.
понял. спасибо за полезную подсказку.
суть задания такая. есть пиксель на картинке. и есть гамма ниток.
мне нужно преобразовать цвета в соответвии с имеющимися цветами ниток.
ну и следовательно сгенерировать схему вышивки для данного набора.
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
а нельзя сделать палитру этих цветов, и в нее переводить, типа как перевод в indexed в фотошопе или recolor в иллюстраторе? чтоб программа сама занималась подбором ближайшего
 

DukereD

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

DukereD

макрософил
Топикстартер
Сообщения
462
Реакции
114
Для

вполне сгодится простая сумма квадратов разниц по l, a & b.
Понял попробую оба варианта с hsb и lab
Спасибо. А то ж я не силён в колористике сижу мучаю РГБ ))
 

~RA~

Одарённая.
12 лет на форуме
Сообщения
11 891
Реакции
3 458
ваш вариант второй.
1606854673608.png
 
Последнее редактирование:

DukereD

макрософил
Топикстартер
Сообщения
462
Реакции
114
  • Спасибо
Реакции: colorprint, WSkin и ~RA~

DukereD

макрософил
Топикстартер
Сообщения
462
Реакции
114
Стоит дать возможность юзеру задавать количество ниток (цветов).
да. это конечно будет.
И ограничение просто по кол-ву и ограничение по конкретным цветам которые есть у пользователя
 

lev

Модератор
20 лет на форуме
Сообщения
2 146
Реакции
2 071
Последнее редактирование:
  • Спасибо
Реакции: ~RA~ и DukereD

DukereD

макрософил
Топикстартер
Сообщения
462
Реакции
114

DukereD

макрософил
Топикстартер
Сообщения
462
Реакции
114
Обратите внимание на макрос 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 каждый раз применяя палитру с удалением цвета.
 
Последнее редактирование:

lev

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