уменьшение большого 1-битного tiff до 8-битного оттенка серого / 24 бит

Скажем, у меня есть tiff размером 100000x100000 1 бит (K-канал) с разрешением 2000 точек на дюйм, и я хочу уменьшить его до 200 точек на дюйм. Моим результирующим изображением будет изображение 10000x10000. Означает ли это, что каждые 10 бит в 1-битном изображении соответствуют 1 пикселю в новом изображении? Кстати, я использую libtiff и читаю 1-битный tiff с помощью tiffreadscanline. Спасибо!


person Community    schedule 28.01.2010    source источник


Ответы (2)


Это означает, что каждые 100 бит в 1-битном изображении соответствуют 1 пикселю в новом изображении. Вам нужно будет усреднить значение для области 10x10 1 бит пикселей. Для более плавных оттенков серого лучше усреднить по n битам, где n - битовая глубина вашего целевого пикселя, частично перекрывая вычисленную область с соседними областями (квадраты 16x16 пикселей на расстоянии 10x10 пикселей друг от друга , поэтому их границы накладываются друг на друга для получения гладких 8-битных оттенков серого.)

person SF.    schedule 28.01.2010
comment
Однако имейте в виду, что это не только снижает разрешение, но и размывает изображение. - person Joey; 28.01.2010
comment
С радиусом размытия 1,3 пикселя эффект, скорее всего, повысит (субъективное) качество, а не уменьшит его, и я обнаружил, что масштабирование от 100 до 256 уровней градаций серого с помощью простого поиска выглядит действительно некрасиво в областях градиента изображения. - person SF.; 28.01.2010
comment
Я просто попробовал свой собственный эксперимент со средним размытием 5x5 и 7x7 с последующим понижением разрешения 5: 1. Тот, у которого было размытие 7x7, был намного лучше, чем другой. Я не уверен, что буду основывать этот фактор на битовой глубине цели. - person Mark Ransom; 05.06.2010

Важно понимать, почему вы хотите уменьшить масштаб (из-за среды вывода или из-за размера файла?). Как указал SF, цвета / оттенки серого в некоторой степени взаимозаменяемы с разрешением. Если речь идет только о размере файла, сжатие без потерь / с потерями тоже стоит посмотреть ..

Другая вещь - это немного понять характеристики вашего исходного изображения. Например, если исходное изображение растеризовано (как для газетных изображений), вы можете получить неудобные узоры из-за того, что точечная матрица испорчена. Однажды я попытался восстановить изображение старой газеты, и это потребовало много усилий. Я закончил тем, что сначала преобразовал его в шкалу серого, прежде чем улучшать изображение.

Я предлагаю немного поэкспериментировать с VIPS или Irfanview, чтобы найти наилучшие результаты (т. Е. Какие - это влияние определенного алгоритма передискретизации на качество изображения). Причина для этих программ (например, Photoshop) заключается в том, что вы можете экспериментировать с графическим интерфейсом / командной строкой, зная имя / параметры алгоритмов, стоящих за ним. С VIPS вы можете контролировать большинство, если не все параметры.

[Править] TiffDump (поставляется с двоичными файлами LibTiff) - ценный источник информации. Он расскажет вам о порядке байтов и т. Д. Я начал с известного образа. Например, LibTIFF.NET поставляется с множеством тестовых изображений, включая черно-белые (некоторые с 0 = черный, некоторые с 1 = черный). [/Редактировать]

person Adriaan    schedule 28.01.2010
comment
На самом деле моя текущая проблема теперь заключается в интерпретации битов в 1-битном изображении. Скажем, у меня есть 1-битное изображение размером 200x144 pix, и я просто хочу преобразовать его в 8-битное изображение размером 200x144 pix, тогда как мое отображение будет 1-битным, 0 - 255 ( серый), а 1-битный 1 равен 0 (серый). на 1-битном изображении tiffreadscanline я получаю следующие биты: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 , 0x00,0x00,0x00, 0x00,0x00,0x00 я получаю только 25 бит, но ширина 1-битного изображения равна 200. поэтому я ожидаю, что размер строки развертки также будет 200. если я умножу 25 на 8, я получу 200, но где бы я получаю данные? благодаря. - person ; 29.01.2010
comment
Вы получаете 25 байтов по 8 бит каждый, всего 200 бит = пикселей. Увеличивая глубину до 8 бит, вы потратите 7 бит на байт результирующего изображения. Вам решать (используя битовый сдвиг, маски и логические операторы), чтобы извлечь один бит из байта. - person SF.; 29.01.2010
comment
Я согласен с SF. См. Мое Изменить в моем сообщении. - person Adriaan; 29.01.2010
comment
Привет спасибо!! Мне удалось извлечь биты с помощью оператора & (2, 4, 8, 16, 32, 64, 128) в каждом байте. Итак, теперь я могу преобразовать 1 бит в формат, отличный от 1 бит. Теперь я делаю масштабирование большого 1-битного tiff (100 000 X 80 000) при 2400 DPI. Единственная причина, по которой я хочу уменьшить масштаб до формата 200 точек на дюйм, отличного от 1 бит, - это возможность читать изображение с помощью C # GDI +. - person ; 01.02.2010
comment
Используйте производную libtiff ... Обработка GDI + TIFF ужасна в Windows XP. Windows 7, кажется, работает намного лучше. В C # .NET вы видите загадочную ошибку в XP, тогда как вызов Windows7 будет работать должным образом. - person Adriaan; 01.02.2010