Полутоновые изображения в Python
================================

Я работаю над проектом, который требует от меня отделить каждый цвет в изображении CYMK и создать полутоновое изображение, которое будет напечатано на специальном полутоновом принтере. Используемый метод является аналогом шелкографии в том, что процесс практически идентичен. Сфотографируйте и вырежьте каждый цветной канал. Затем создайте экран для полутона. Каждый цветной экран должен иметь угол наклона экрана на 15-45 (регулируемый) градусов. Размер точки и LPI должны быть рассчитаны из настраиваемых пользователем значений для достижения различных эффектов. Мне сказали, что этот процесс используется в шелкографии, но мне не удалось найти какую-либо информацию, объясняющую полутонирование CYMK. Я нашел много для того, чтобы свести к одному цвету и создать новый стиль печати черно-белого полутонового изображения.

Я бы предположил, что мне нужно: 1. разделить файл на его цветные каналы. 2. создать монохромное полутоновое изображение для этого канала. 3. Наклоните результирующее полутоновое изображение на количество градусов * номер канала. Кто-нибудь знает, если это правильный подход?

Кто-нибудь знает какой-либо существующий код Python для этого? Или каких-либо хороших объяснений этого процесса или алгоритмов?

Раньше я управлял студией трафаретной печати (она была довольно маленькой), и хотя я никогда не занимался цветной печатью, я достаточно хорошо знаком с принципами. Вот как я бы подошел к этому:

1. Split the image into C, M, Y, K.
2. Rotate each separated image by 0, 15, 30, and 45 degrees respectively.
3. Take the half-tone of each image (dot size will be proportional to the intensity).
4. Rotate back each half-toned image.

Теперь у вас есть разделенные изображения цвета. Как вы упомянули, шаг поворота уменьшает проблемы с выравниванием точек (которые могут все испортить), и такие вещи, как[Мойр & # xE9; шаблонные эффекты](https://en.wikipedia.org/wiki/Moir%C3%A9_pattern) будет разумно сведено к минимуму.

Это должно быть довольно легко с помощью кода[PIL](http://www.pythonware.com/library/pil/handbook/image.htm).

**Update 2:**

Я написал небольшой код, который сделает это за вас, он также включает в себя`GCA` функция (описано ниже):

Это превратит это:

![enter image description here](/imgs/2ee5J.jpg)

в это (размыть глаза и отойти от монитора):

![enter image description here](/imgs/N7CiK.jpg)

Обратите внимание, что выборка изображения может быть попиксельной (таким образом, сохраняя разрешение исходного изображения, в конечном изображении). Сделайте это, установив`sample=1`, в этом случае вам нужно установить`scale` к большему числу, так что есть ряд возможных размеров точек. Это также приведет к увеличению размера выходного изображения (размер исходного изображения * масштаб ** 2, так что следите!).

По умолчанию при конвертации из`RGB` в`CMYK` `K` канал (черный канал) пуст. Нужно ли вам`K` канал или нет, зависит от вашего процесса печати. Существуют различные возможные причины, по которым вы можете этого захотеть: получить черный цвет лучше, чем наложение`CMY`экономия чернил, сокращение времени сушки, уменьшение вытекания чернил и т. д. Во всяком случае, я также написал немного[Замена серого компонента](https://en.wikipedia.org/wiki/Grey_component_replacement) функция`GCA`, так что вы можете установить процент`K` канал, который вы хотите заменить`CMY` перекрываются с (я объясняю это немного дальше в комментариях к коду).

Вот пара примеров для иллюстрации. Обработка`letter F` с картинки, с`sample=1` а также`scale=8`, так что довольно высокое разрешение.

4`CMYK` каналы, с`percentage=0`так пусто`K` канал:

![enter image description here](/imgs/kuQre.jpg)![enter image description here](/imgs/xeUpM.jpg)![enter image description here](/imgs/8xCS6.jpg)![enter image description here](/imgs/XfK3a.jpg)

объединяет в производство:

![enter image description here](/imgs/VXb5U.jpg)

`CMYK` каналы, с`percentage=100`, так`K` канал используется. Вы можете видеть, что голубой канал полностью подавлен, а пурпурный и желтый каналы используют намного меньше чернил в черной полосе внизу изображения:

![enter image description here](/imgs/jlC3D.jpg)![enter image description here](/imgs/fnG6g.jpg)![enter image description here](/imgs/XgYlt.jpg)![enter image description here](/imgs/DQj4O.jpg)![enter image description here](/imgs/tSK9C.jpg)



Мое решение также использует PIL, но использует внутренний метод дизеринга (Floyd-Steinberg), поддерживаемый внутри. Однако создает артефакты, поэтому я подумываю переписать его C-код.

Неявное применение GCR PIL также может быть расширено более общим, но я попытался описать простое решение, в котором также игнорируются разрешение и выборка.