реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Цветная картинка на монохромном принтере, Цвет в плотность точек
Petrovich
сообщение Sep 20 2012, 06:38
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 2-06-05
Из: Днепропетровск
Пользователь №: 5 658



Господа!
Нужно на монохромном термопринтере печатать исходно цветную картинку. Не могу найти алгоритм преобразования цвета в плотность точек. При этом что бы был не требователен к размеру памяти.
Если кто знает, куда глянуть, буду весьма признателен.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Sep 20 2012, 12:02
Сообщение #2


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



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

В matlab есть функция grayscale для преобразования цветного изображения в градации серого.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Sep 20 2012, 12:38
Сообщение #3


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



biggrin.gif еще вариант...


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
Guest_TSerg_*
сообщение Sep 20 2012, 13:21
Сообщение #4





Guests






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


Как печатать собрались ?
Точками или символьной матрицей ?
Go to the top of the page
 
+Quote Post
Petrovich
сообщение Sep 20 2012, 16:48
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 2-06-05
Из: Днепропетровск
Пользователь №: 5 658



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

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

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

Точками...плотностью точек. Вроде нашел простой...ссылка в другом компе, завтра сюда скину.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Sep 20 2012, 18:33
Сообщение #6


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



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

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

ImageMagick эту задачу тоже может выполнить, доступны исходные тексты всех утилит этого пакета. Утилита convert. Может Вам поможет.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Guest_TSerg_*
сообщение Sep 21 2012, 07:56
Сообщение #7





Guests






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


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

В шкалу серого просто:
I := (R * 61 + G * 174 + B * 21) / 256
Далее, делим изображение на матрицы, например 8*8, подсчитываем среднюю интенсивность в каждой матрице ( в данном случае max = 64*255 ) и заменяем матрицу на некоторую заранее просчитанную матрицу по эквивалентной плотности из таблицы матриц.
Go to the top of the page
 
+Quote Post
Petrovich
сообщение Sep 21 2012, 08:47
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 2-06-05
Из: Днепропетровск
Пользователь №: 5 658



Вот что нашел... во вложении. Но результат зависит от исходной картинки.
Но пока устраивает.
Да... сначала конечно переводим каждый пиксел в градации серого, но это просто Y = (R+G+В)/3
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Guest_TSerg_*
сообщение Sep 21 2012, 12:29
Сообщение #9





Guests






Ну, я задачи всей не знаю - Вам виднее что и как.

Это оптимизировано под глаз
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;
Go to the top of the page
 
+Quote Post
Petrovich
сообщение Sep 22 2012, 15:05
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 2-06-05
Из: Днепропетровск
Пользователь №: 5 658



Цитата(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;

Как то очень просто выглядит... Попробую ,спасибо!
Go to the top of the page
 
+Quote Post
Guest_TSerg_*
сообщение Sep 24 2012, 08:13
Сообщение #11





Guests






Цитата(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)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 06:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.0145 секунд с 7
ELECTRONIX ©2004-2016