|
|
  |
Цветная картинка на монохромном принтере, Цвет в плотность точек |
|
|
|
Sep 20 2012, 12:02
|

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

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

|
Цитата(Petrovich @ Sep 20 2012, 10:38)  Господа! Нужно на монохромном термопринтере печатать исходно цветную картинку. Не могу найти алгоритм преобразования цвета в плотность точек. При этом что бы был не требователен к размеру памяти. Если кто знает, куда глянуть, буду весьма признателен. Как печатать собрались ? Точками или символьной матрицей ?
|
|
|
|
|
Sep 20 2012, 16:48
|
Местный
  
Группа: Свой
Сообщений: 230
Регистрация: 2-06-05
Из: Днепропетровск
Пользователь №: 5 658

|
Цитата(mdmitry @ Sep 20 2012, 15:02)  В matlab есть функция grayscale для преобразования цветного изображения в градации серого. Это конечно здорово! Осталось заставить матлаб работать на PIC32  Цитата(TSerg @ Sep 20 2012, 16:21)  Как печатать собрались ? Точками или символьной матрицей ? Точками...плотностью точек. Вроде нашел простой...ссылка в другом компе, завтра сюда скину.
|
|
|
|
|
Sep 20 2012, 18:33
|

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

|
Цитата(Petrovich @ Sep 20 2012, 20:48)  Это конечно здорово! Осталось заставить матлаб работать на PIC32  Если кто знает, куда глянуть, буду весьма признателен А глянуть, как реализовано. ImageMagick эту задачу тоже может выполнить, доступны исходные тексты всех утилит этого пакета. Утилита convert. Может Вам поможет.
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
Guest_TSerg_*
|
Sep 21 2012, 07:56
|
Guests

|
Цитата(Petrovich @ Sep 20 2012, 20:48)  Точками...плотностью точек. Вроде нашел простой...ссылка в другом компе, завтра сюда скину. Обычно все же сначала преобразуют цвет в gray и уже по плотности строят точечную модель. А цветную в точки - это надо еще палитру преобразования указывать. В шкалу серого просто: I := (R * 61 + G * 174 + B * 21) / 256 Далее, делим изображение на матрицы, например 8*8, подсчитываем среднюю интенсивность в каждой матрице ( в данном случае max = 64*255 ) и заменяем матрицу на некоторую заранее просчитанную матрицу по эквивалентной плотности из таблицы матриц.
|
|
|
|
|
Sep 21 2012, 08:47
|
Местный
  
Группа: Свой
Сообщений: 230
Регистрация: 2-06-05
Из: Днепропетровск
Пользователь №: 5 658

|
Вот что нашел... во вложении. Но результат зависит от исходной картинки. Но пока устраивает. Да... сначала конечно переводим каждый пиксел в градации серого, но это просто Y = (R+G+В)/3
Эскизы прикрепленных изображений
|
|
|
|
Guest_TSerg_*
|
Sep 21 2012, 12:29
|
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;
|
|
|
|
|
Sep 22 2012, 15:05
|
Местный
  
Группа: Свой
Сообщений: 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; Как то очень просто выглядит... Попробую ,спасибо!
|
|
|
|
Guest_TSerg_*
|
Sep 24 2012, 08:13
|
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)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|