制作半色调图像的好算法(如this)是什么?一个快速的谷歌搜索带来了一堆关于这个主题的论文,但很难判断哪些是好的,有效的,等等。有没有最好的选择来做这类事情?
答案 0 :(得分:16)
将Pixels组视为六边形网格。使用圆形函数来确定哪些像素进入组。您可以调整圆的重叠以调整输出的黑/饱和度。这实际上是为高分辨率输出设计的,例如打印。如果您这样做是为了在屏幕上显示为视觉效果,请确保使用抗锯齿圆绘图例程来补偿显示器的低分辨率。 (与打印相比,即使HD也不是那么高。)
如果你这样做是因为你喜欢这种效果,那很酷。但是如果你只是想要沉溺于黑白图像,可以考虑使用“Floyd-Steinberg”抖动。它提供高质量的结果,并在整个图像中分配错误。 http://en.wikipedia.org/wiki/Floyd-Steinberg_dithering
答案 1 :(得分:4)
半色调非常有效。
单级半色调: 输入:图像中的像素;包含阈值的预构建“屏幕”。 在运行时:对于每个颜色通道,对于每个像素,选择一个阈值(索引到阈值阵列模数阵列维度)。像素和阈值之间的一个比较确定输出值是打开还是关闭。
通过使用多个屏幕,它也可以推广到多级输出。
有趣的部分是屏幕的构造(阈值阵列)。有许多变化 - 聚集点(AM),随机(FM),许多变化和混合,包括蓝噪声和绿噪声(AM / FM)。而且您通常希望每个颜色通道都有不同的屏幕。传统的聚集点屏幕将它们的点放在矩形网格中,可以通过它们的频率(低频率=大点)和角度来描述(青色通常为15°,洋红色为75°,黄色为90°,黑色为45°)
如果您想进行实验,使用半色调网屏方法的Photoshop位图(请参阅此tutorial)有一个内部屏幕生成器,并将灰度图像屏幕化为位图,就像您的示例一样。
其他人建议的抖动方法涉及更多的每像素计算,并且输出与您的聚集点屏蔽半色调示例不相似。
答案 2 :(得分:2)
有许多算法的开源实现可以创建半色调图像。您可以查看源代码。下面是使用Marvin Image Processing Framework在Java中开发的一些实现。
错误扩散(source):
Rylanders (source):
抖动(source):
圈子(source):
答案 3 :(得分:0)
最简单的方法是逐像素地使用随机性: 对于每个像素,将其着色的概率=原始颜色的暗度。
这可以为您提供双线抖动算法。它不会像弗洛伊德 - 斯坦伯格那样漂亮(因为那个跟踪错误),或者像“瓷砖然后把磁盘放在每个瓷砖中那样,以便黑色的一部分=原始瓷砖中的平均黑暗”,但它在实践中运作良好。