Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Цветная картинка на монохромном принтере
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Petrovich
Господа!
Нужно на монохромном термопринтере печатать исходно цветную картинку. Не могу найти алгоритм преобразования цвета в плотность точек. При этом что бы был не требователен к размеру памяти.
Если кто знает, куда глянуть, буду весьма признателен.
mdmitry
Цитата(Petrovich @ Sep 20 2012, 10:38) *
Господа!
Нужно на монохромном термопринтере печатать исходно цветную картинку. Не могу найти алгоритм преобразования цвета в плотность точек. При этом что бы был не требователен к размеру памяти.
Если кто знает, куда глянуть, буду весьма признателен.

В matlab есть функция grayscale для преобразования цветного изображения в градации серого.
DRUID3
biggrin.gif еще вариант...
TSerg
Цитата(Petrovich @ Sep 20 2012, 10:38) *
Господа!
Нужно на монохромном термопринтере печатать исходно цветную картинку. Не могу найти алгоритм преобразования цвета в плотность точек. При этом что бы был не требователен к размеру памяти.
Если кто знает, куда глянуть, буду весьма признателен.


Как печатать собрались ?
Точками или символьной матрицей ?
Petrovich
Цитата(mdmitry @ Sep 20 2012, 15:02) *
В matlab есть функция grayscale для преобразования цветного изображения в градации серого.

Это конечно здорово! Осталось заставить матлаб работать на PIC32 rolleyes.gif

Цитата(TSerg @ Sep 20 2012, 16:21) *
Как печатать собрались ?
Точками или символьной матрицей ?

Точками...плотностью точек. Вроде нашел простой...ссылка в другом компе, завтра сюда скину.
mdmitry
Цитата(Petrovich @ Sep 20 2012, 20:48) *
Это конечно здорово! Осталось заставить матлаб работать на PIC32 rolleyes.gif
Если кто знает, куда глянуть, буду весьма признателен

А глянуть, как реализовано.

ImageMagick эту задачу тоже может выполнить, доступны исходные тексты всех утилит этого пакета. Утилита convert. Может Вам поможет.
TSerg
Цитата(Petrovich @ Sep 20 2012, 20:48) *
Точками...плотностью точек. Вроде нашел простой...ссылка в другом компе, завтра сюда скину.


Обычно все же сначала преобразуют цвет в gray и уже по плотности строят точечную модель.
А цветную в точки - это надо еще палитру преобразования указывать.

В шкалу серого просто:
I := (R * 61 + G * 174 + B * 21) / 256
Далее, делим изображение на матрицы, например 8*8, подсчитываем среднюю интенсивность в каждой матрице ( в данном случае max = 64*255 ) и заменяем матрицу на некоторую заранее просчитанную матрицу по эквивалентной плотности из таблицы матриц.
Petrovich
Вот что нашел... во вложении. Но результат зависит от исходной картинки.
Но пока устраивает.
Да... сначала конечно переводим каждый пиксел в градации серого, но это просто Y = (R+G+В)/3
TSerg
Ну, я задачи всей не знаю - Вам виднее что и как.

Это оптимизировано под глаз
I := (R * 61 + G * 174 + B * 21) / 256

Это примитивный переход
I = (R+G+В)/3

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

Многопроходный Floyd дает неупорядочную структуру, но занимает в 3-4 больше времени.

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


С матрицей размытия алгоритм таков

arBlur[0,0] := 0;
arBlur[0,1] := 80;
arBlur[1,0] := 192;
arBlur[1,1] := 230;

function Level_Blur(x,y: integer; cl: TColor32): TColor32;
var i,j: integer;
begin
i := y mod 2;
j := x mod 2;
if Intensity(cl) > arBlur[i,j] then Result := Gray32(255)
else Result := Gray32(0);
end;
Petrovich
Цитата(TSerg @ Sep 21 2012, 15:29) *
С матрицей размытия алгоритм таков

arBlur[0,0] := 0;
arBlur[0,1] := 80;
arBlur[1,0] := 192;
arBlur[1,1] := 230;

function Level_Blur(x,y: integer; cl: TColor32): TColor32;
var i,j: integer;
begin
i := y mod 2;
j := x mod 2;
if Intensity(cl) > arBlur[i,j] then Result := Gray32(255)
else Result := Gray32(0);
end;

Как то очень просто выглядит... Попробую ,спасибо!
TSerg
Цитата(Petrovich @ Sep 22 2012, 19:05) *
Как то очень просто выглядит... Попробую ,спасибо!


Примерно так выглядит ( gray, threshold, blur, floyd ):



Кстати, в вашем посте #8 в книжке приведен т.н. "The "false" Floyd-Steinberg filter",

* 3
3 2 (1/8)

который работает хуже истинного Floyd-Steinberg
0 * 7
3 5 1 (1/16)

Есть простой ,в вычислительном отношении, фильтр Сьерры, который дает результаты, чаще лучше, чем Floyd-Steinberg
0 * 2
1 1 0 (1/4)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.