Правильно ли я понял что:
1) мы идём «в обратную сторону», то есть пляшем от спектрумовской атрибутной сетки.
2) выбираем стартовое знакоместо и подгоняем, двигая (всю?) картинку под него на +-2 пикселя (что даёт нам 5 вариантов по горизонтали и 5 по вертикали, итого: 25 вариантов).
3) переходим к следующему соседнему знакоместу и также подгоняем двигая всю картинку (25 вариантов).
5) перебираем так всю атрибутную сетку: для каждого знакоместа у нас есть массив лучших вариантов, отсортированных по убыванию.
6) самый главный этап: пытаемся для каждого знакоместа выбрать лучший вариант с учётом лучших вариантов для соседних знакомест (тут количество переборов растёт по экспоненте).
То есть интерактивный инструмент может быть таким:
Неограниченное количество слоёв со спектрум-палитрой в режиме «цвет на точку».
Каждый слой может независимо от остальных смещаться, двигаться и т.п. — редактироваться.
У каждого слоя есть «вес» при слиянии и рендеринге в спектрум режим: область просмотра которого всегда видна и доступна, любые изменения в любом из слоёв сразу отражаются там.
Да, одно из направлений развития, это (полу)автоматическое или ручное выделение объектов в слои, которые можно подгонять раздельно, задав лишь условие неперекрываемости.
Вообще, это можно сделать уже сейчас, разделив исходник на объекты и просто обработав последовательность картинок.
Все эти идеи обсуждались в процессе мозгоштурма нового идеального графического редактора: оказалось что простой интнрактивной многослойности со слоями «цвет на точку» при моментальном перерендеринге в спекрум-атрибуты при любом изменении — достаточно для значительного упрощения рисования и снятия рутины.
Маска полной значимости или полной незначимости, на практике получается бесполезна: проще удалить незначащие пиксели непосредственно на исходнике.
А вот битовая (монохромная) маска повышенной значимости — поможет штрафовать сильнее за утерю пикселей повышенной значимости. Ну то есть если обмазать такой маской рот или глаза — штраф за их утерю будет выше. =)
В случае с маской добавляется дополнительный фильтр: сначала смотрим, есть ли в текущем знакоместе маски 2 разных цвета (ч/б), или всё белое: если да — то знакоместо значащее и его оценка сохраняется. А если в знакоместе маски только чёрный цвет — то знакоместо незначащее и оценка у него 0.
Что ещё можно сказать: так как первая задача решается с помощью командной строки: работа её происходит медленнее, если бы эти же самые преобразования происходили с помощью библиотеки и прямо в памяти и не было бы открытия исходника каждый раз заново — всё работало бы быстрее. После преобразования картинки можно было бы сразу выполнить оценку — и не сохранять целиком всё изображение, а только параметры преобразования и оценку.
Вся оценка умещается в следующую функцию:
на вход которой поступает img — картинка, px и py — координаты знакоместа (в пикселях):
def eval_cell(img,px,py) cell = img.get_pixels(px,py,8,8)# получаем массив пикселей 8x8 (64) по коодинатам px и py
rcell = cell.reduce(Hash.new(0)) {|a,b| a[b] += 1;a}#из массива конструируем словарь/хэш у которого ключ — это цвет пикселя(сам пиксель), а значение — количество этих пикселей в массиве
acell = rcell.values.sort.reverse[2,64]#получаем массив пикселей, ниже второго места по распространённости в нашем знакоместе — «потерянные» пиксели bcell = acell != nil? acell: [0]# если таких не было (в знакоместе только один или два цвета) — то создаём массив из одного элемента, равный нулю. err = bcell.inject(0, &:+)# суммируем элементы массива — получаем сумму «потерянных» пикселей в знакоместе end
То на первом этапе получим хэш 1=>44, 0=>16, 2=>3, 3=>1
затем получим все, что ниже «второго места»: 3, 1
затем суммируем: 4.
«Штрафной рейтинг» знакоместа = 4.
У меня и лога есть под это:
1) мы идём «в обратную сторону», то есть пляшем от спектрумовской атрибутной сетки.
2) выбираем стартовое знакоместо и подгоняем, двигая (всю?) картинку под него на +-2 пикселя (что даёт нам 5 вариантов по горизонтали и 5 по вертикали, итого: 25 вариантов).
3) переходим к следующему соседнему знакоместу и также подгоняем двигая всю картинку (25 вариантов).
5) перебираем так всю атрибутную сетку: для каждого знакоместа у нас есть массив лучших вариантов, отсортированных по убыванию.
6) самый главный этап: пытаемся для каждого знакоместа выбрать лучший вариант с учётом лучших вариантов для соседних знакомест (тут количество переборов растёт по экспоненте).
Неограниченное количество слоёв со спектрум-палитрой в режиме «цвет на точку».
Каждый слой может независимо от остальных смещаться, двигаться и т.п. — редактироваться.
У каждого слоя есть «вес» при слиянии и рендеринге в спектрум режим: область просмотра которого всегда видна и доступна, любые изменения в любом из слоёв сразу отражаются там.
Вообще, это можно сделать уже сейчас, разделив исходник на объекты и просто обработав последовательность картинок.
Все эти идеи обсуждались в процессе мозгоштурма нового идеального графического редактора: оказалось что простой интнрактивной многослойности со слоями «цвет на точку» при моментальном перерендеринге в спекрум-атрибуты при любом изменении — достаточно для значительного упрощения рисования и снятия рутины.
А вот битовая (монохромная) маска повышенной значимости — поможет штрафовать сильнее за утерю пикселей повышенной значимости. Ну то есть если обмазать такой маской рот или глаза — штраф за их утерю будет выше. =)
Но тут важно понимать требования для запуска:
1) поставить ImageMagick,
2) поставить ruby,
3) поставить RMagick (для этого нужно [a] поставить DevKit)
на вход которой поступает img — картинка, px и py — координаты знакоместа (в пикселях):
def eval_cell(img,px,py)
cell = img.get_pixels(px,py,8,8) # получаем массив пикселей 8x8 (64) по коодинатам px и py
rcell = cell.reduce(Hash.new(0)) {|a,b| a[b] += 1;a} #из массива конструируем словарь/хэш у которого ключ — это цвет пикселя(сам пиксель), а значение — количество этих пикселей в массиве
acell = rcell.values.sort.reverse[2,64] #получаем массив пикселей, ниже второго места по распространённости в нашем знакоместе — «потерянные» пиксели
bcell = acell != nil? acell: [0] # если таких не было (в знакоместе только один или два цвета) — то создаём массив из одного элемента, равный нулю.
err = bcell.inject(0, &:+) # суммируем элементы массива — получаем сумму «потерянных» пикселей в знакоместе
end
то есть, предположим у нас есть массив:
1,1,1,1,1,1,1,1
1,1,1,1,1,1,1,1
1,1,1,1,0,0,0,0
1,1,1,1,0,0,0,0
1,1,1,1,0,0,0,0
1,1,1,1,2,2,2,3
То на первом этапе получим хэш 1=>44, 0=>16, 2=>3, 3=>1
затем получим все, что ниже «второго места»: 3, 1
затем суммируем: 4.
«Штрафной рейтинг» знакоместа = 4.
Повторить 768 раз =)
Вот ещё парочка: