2014-01-29 4 views
0

Я извлекаю примитивы из графических линейных диаграмм и желаю выбирать по цвету. Таким образом, в следующембинаризация цветов в изображениях

enter image description here

Я хочу, чтобы извлечь «синий», «зеленый» и «черных» примитивы. (Я готов попытаться восстановить примитивы, которые были разделены примитивами другого цвета).

Тем не менее, «блюз» имеет различное количество белого (похожее на шкалу серого для черного). Таким образом, самые обычные цвета (округленные до 12-бит для простоты) с их подсчетов может быть

000 881 // black 
88f 1089 // white-blue 
fff 70475 // white 

, но есть и другие степени белизны при более низкой частоте

// other white-blue 
99f 207 

// other grey 
ddd 196 

Я считаю, что авторы использовали только очень ограниченное количество чистых цветов (например, 3-6) во многих диаграммах и что различные инструменты рендеринга добавят белый. IOW цвет может быть выражена (0 =< x =< 1)

000 + x(FFF) 
00F + x(FF0) // blue 
0F0 + x(F0F) // green 

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

Как я могу восстановить (маленький) набор разных цветов? Если это возможно, я могу затем выбрать эти регионы, преобразовать в серый и обычным образом преобразовать в двоичный код.

Я бы предпочел источник на Java, но я подозреваю, что любой код будет достаточным;

Я прочитал две полезные SO вопросы

"Rounding" colour values to the nearest of a small set of colours

HCL color to RGB and backward

, которые используют H-C-L и может быть путь вперед, хотя они непосредственно не отвечают моим требованиям.

ответ

1

Вы можете использовать region growing. Я думаю, что это должно соответствовать вашим потребностям. Просто измените пороговое значение, когда это тот же цвет. Я думаю, что это должно сработать здесь, потому что, кажется, существует большая разница между любыми двумя цветами, которые связаны как объекты.

+0

Это может быть полезно (и я уже развиваю регионы). Но есть много изменений в количестве белого в синем - мне бы очень хотелось бинарировать синий цвет как отдельную операцию. –

+0

Можете ли вы выйти из порога? все пиксели, которые вам определенно не нужны (например, все полностью белые пиксели)? Вы можете попробовать что-то вроде динамической кластеризации на всех небелых пикселях по всему изображению. Это сгруппировало бы все одинаковые цвета вместе и должно работать автоматически, без необходимости принимать решение о пороге. – wbest

+0

мы не можем полагаться на цвета, находящиеся в блоках. Он может быть намного более мелкозернистым. сглаженные символы –

0

Если ваша интуиция верна (все пиксели представляют собой линейную смесь цветного и чистого белого цвета), в кубе RGB все цвета будут выровнены по линейным сегментам, исходящим из белого угла.

Если вы выбрали один представительский пиксель на разный цвет (насколько это возможно, белый, для лучшей точности), вы можете определить цвет любого другого пикселя, найдя наилучшее выравнивание, образованное этим пикселем, белым и представитель пикселей.

Выравнивание проверяется путем вычисления косинуса сформированного угла (используйте трехмерные векторы, косинус - это точечный продукт над продуктом норм, сбрасываем знак). Теоретически косинус должен быть ровно 1, но из-за числовых ошибок он может быть меньше, поэтому просто рассмотрим репрезентативный цвет, который максимизирует косинус.

Особое внимание уделяйте белым пикселам (небольшое расстояние до белого угла), в противном случае они будут случайным образом назначены для определенного репрезентативного цвета.

+0

Thx. Я понял, что без знания алгоритма сглаживания, вероятно, нет точного ответа. Я думаю, что белый добавляется к базовому цвету, но H и S могут варьироваться –

0

В зависимости от количества цветов и их сходства простой порог значений R, G и B быстро сводит все к одному из 8 цветов (черный, красный, зеленый, синий, голубой, пурпурный, желтый , или белый).

Смежные вопросы