2016-04-28 3 views
5

Я использую Images.jl в Julia. Я пытаюсь преобразовать изображение в структуру данных графа, как (V, W, в), гдеПреобразование RGBA {U8} (0,384,0,0,0,0,1,0) в Integer

  • v является узлом

  • ш является соседом и

  • с является функция стоимости

Я хочу дать дорогие расходы тем соседи, у которых нет одинакового цвета. Однако, когда я загружаю изображение, каждый пиксель имеет следующий тип RGBA{U8}(1.0,1.0,1.0,1.0), есть ли способ его преобразования в число, подобное Int64 или Float?

+1

Как насчет использования 'colordiff()' в Colors.jl для сравнения цвета с, скажем, «черным»? – daycaster

+0

'colordiff' принимает два цвета в качестве аргументов. Чтобы использовать его, вы должны извлечь цветную часть пикселя с помощью 'color', то есть' colordiff (color (v), color (w)) 'где' v' будет 'RGBA {U8} (0,384,0,0,0,0 , 1,0) '. –

+0

Работала отлично. Спасибо. –

ответ

3

Следующее предложение @ daycaster, colordiff от Colors.jl может использоваться.

colordiff принимает два цвета в качестве аргументов. Чтобы использовать его, вы должны извлечь цветную часть пикселя с color, то есть colordiff(color(v),color(w)), где v будет RGBA{U8(0.384,0.0,0.0,1.0).

4

Если вы хотите сделать это, это оштрафовать смежные пары, которые имеют разные значения цвета (независимо от того, насколько мала разница), я думаю, что img[i,j] != img[i+1,j] должно быть достаточным и бесконечно более эффективным, чем вызов colordiff.

Images.jl также содержит методы, raw и separate, которые позволят вам «преобразовать» это изображение в массив более высокого уровня от UInt8. Однако для вашего видимого приложения это, скорее всего, будет больнее, потому что вам придется выбирать между использованием синтаксиса, например, A[:, i, j] != A[:, i+1, j] (который будет выделять память и иметь намного худшую производительность) или выписывать циклы и проверять каждый цветной канал вручную. Тогда всегда есть небольшое раздражение, связанное с тем, что вам нужен специальный код для оттенков серого и цвета, задаваясь вопросом, что действительно означает 3D-массив (это 3D-серого или 2d с цветовым каналом?) И задается вопросом, сохраняется ли цветовой канал в качестве первого или последнего измерения.

Ни одна из этих неприятностей не возникает, если вы просто работаете с данными непосредственно в формате RGBA. Для получения дополнительной информации они являются примерами «неизменяемых» объектов Юлии, которые имеют как минимум два преимущества. Во-первых, они позволяют четко указывать «значение» определенного набора чисел (в этом случае эти 4 числа представляют цвет в определенном цветовом пространстве, а не, скажем, показания давления от датчика) --- это означает, что вы можете написать код, который не принуждает делать предположения, которые он не может обеспечить. Во-вторых, как только вы узнаете, как их использовать, они делают ваш код намного красивее, обеспечивая при этом фантастическую производительность.

Типы цветов документированы here.

+0

Спасибо, что ответили. Я пытаюсь построить график таким образом, когда я запускаю алгоритм кратчайшего пути, я могу получить контур фигуры. Я думаю о том, чтобы оштрафовать разницу, но, похоже, мне нужно будет учитывать и градиент. Есть ли в Images.jl способ рассчитать это? –

+0

Имеется удобная справочная функция по адресу http://timholy.github.io/Images.jl/stable/function_reference/. Или обратитесь за помощью к «imgradients». – tholy

4

Могу ли я рекомендовать преобразование каждого пикселя в оттенки серого, если все, что вам нужно, это разность величин.

Смотрите этот ответ для как к:

Converting RGB to grayscale/intensity

Это даст вам одно значение для интенсивности, которые затем можно использовать для сравнения.

+1

В julia вы можете просто сказать 'convert (Gray, rgb)'. – tholy

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