问题标签 [dithering]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
173 浏览

algorithm - 使用相似的非重叠圆近似图像

我正在尝试找到一种算法,该算法可以使用来自可使用的预定义形状集中的适当数量的数学形状(在我的情况下为 3 个不同大小的圆圈)来近似灰度图像。

我考虑过基于误差扩散的算法,例如 Floyd-Steinberg 算法,但我看不到将基于像素的误差扩散转换为数学形状的方法。

有人有什么建议吗?

编辑:这是一个使用正方形而不是圆形的 正方形而不是圆形的示例 示例 另一个在网格上使用统一大小的圆形的示例。这是通过用圆形替换抖动的正方形来产生的,但是由于与最初的近似图像有偏差,结果很差。这里的圆圈分布在一个网格中,这不是我要找的: 在此处输入图像描述

0 投票
0 回答
37 浏览

colors - 抖动以获得较深的色调

(英语不是我的母语,而且已经很晚了)。

几天来我面临一个问题,经过多次失败的尝试,我决定来这里寻求帮助或至少一个方向。

我们将讨论抖动和色带。我不会在这里解释这些是什么,我只是假设读者已经知道了。

好吧,让我们从一张图片开始

没有抖动的图像

在此图像上,没有抖动。色带很容易看到,如果不是在墙上,至少在地板上。因为我正在生成这个图像,所以在生成过程中我确实可以为每个像素获得更高的精度。如果通道是从 0 到 255 的整数,我确实可以访问 5.24 之类的值(重要的是“.24”——这就是我所说的“更高的精度”)。我最初的想法是根据像素在屏幕上的位置使用噪声。如果我们断言噪声产生值在 0 和 1 之间,对于 5.24,算法看起来像

if (noise(x,y) < 0.24) 颜色 = 6 否则颜色 = 5

我也使用了“白噪声”,我得到了这个结果 图像抖动,使用白噪声

它更加平滑,但我们得到了非常高的噪音。另外,还有色带,这将是我遇到的问题。通过用“蓝噪声”替换白噪声,我得到了最后一张图像

抖动的图像,使用蓝噪声

这对于生成的图像的噪点要好得多,但是......仍然有色带。

我试图找出原因。我认为这是因为我使用了我所说的“线性分割”或“线性渐变”或“线性插值”……或“线性”的东西,但它是线性的。这是我已经给出的公式

if (noise(x,y) < 0.24) 颜色 = 6 否则颜色 = 5

如果不是 0.24 而是 0.5,则表示 (5,5,5) 和 (6,6,6) 的 50/50 混合。但是,这样的图像看起来更接近(6,6,6)而不是(5,5,5)。不知何故,我认为认为(0,0,0)和(1,1,1)之间的步长与(200,200,200)和(201,201,201)之间的步长相同是错误的。我认为它不应该被认为是一个加法,而是一个比率。并且上面的公式并没有真正考虑到“5”(对于 5.24 和 200.24,它的行为方式相同)。

不知道自己解释得好不好,已经很晚了。

总结一下,我正在寻找一个公式,不仅考虑到“.24”部分,不仅考虑到像素的位置,还考虑到“5”部分。

我认为某处存在指数(因为光学中总是有指数),结果将取决于显示器(我正在寻找的更多与 cymk 相关,而不是与 rgb 相关)。

但是,还有什么我可以做的吗?这种“颜色值的非线性增加”有名称吗?有什么我可以问谷歌的吗?

非常感谢。

0 投票
0 回答
699 浏览

c# - 如何在 C# 中使用 Floyd-Steinberg 算法抖动图像

我是 C# 的新手,对于我的第二个项目,我正在尝试编写一个使用 Floyd-Steinberg 方法抖动位图的算法,我遵循 Coding Trains Video 但我得到了一堆 RGB 值超出范围的错误,因为例如,有时值是 256,有时甚至是负数。

这是重要的代码块。

0 投票
1 回答
105 浏览

c# - 是否可以在 WPF 渐变上使用抖动?

我想知道是否可以在 WPF 渐变上使用抖动(例如 Floyd-Steinberg)?

XAML:

0 投票
2 回答
640 浏览

opengl - 了解图像抖动以及它们如何帮助混合 CSM

所以我希望在我的级联阴影贴图分割之间实现抖动作为混合模式。

我不知道它们是什么,所以我观看了这个视频来尝试理解它。
据我了解,这是一种将图像颜色映射到有限托盘的方法,同时试图在不同颜色的像素之间保持令人信服的渐变。

现在,从这个视频中,我了解了如何根据抖动模式的权重计算我的眼睛会看到什么颜色。我不明白的是我们如何拍摄具有 4 字节像素数据的图像,例如尝试将其映射到 1 字节像素数据。如果我们基本上受到限制,我们如何将原始图像中的每个像素颜色映射到其加权平均看起来就像是原始颜色的抖动模式?假设我们仅限于 5 种颜色,我猜测并非使用这 5 种托盘颜色的抖动模式的所有可能加权平均组合都可以产生原始像素颜色,那么如何实现呢?是否还为每个像素计算抖动模式以实现抖动图像?

除了这些关于图像抖动的一般问题之外,我仍然很难理解这种技术如何帮助我们在级联分割之间进行混合,就在代码中实际实现它而言,我已经看到了一个使用片段空间坐标的示例并计算一个抖动(不确定它实际上在计算什么,因为它不返回一个矩阵它返回一个浮点数):

然后它根据返回的浮点数对任一级联图进行采样。所以我的大脑无法将我了解到的你可以有一个抖动模式来模拟大颜色模式的知识转化为这个使用返回的浮点数作为阈值因子并将其与某个混合因子进行比较的示例,以从任一阴影贴图中进行采样。所以这让我更加困惑。

希望对此有一个很好的解释

编辑:

好的,我看到我提供的算法与维基百科关于有序抖动的文章之间的相关性,据我所知,这是首选的抖动算法,因为根据文章:

此外,由于抖动模式的位置相对于显示帧始终保持不变,因此与误差扩散方法相比,它更不容易出现抖动,因此适用于动画。

现在我看到代码试图为给定的空间坐标获取此阈值,尽管在我看来它有点错误,因为以下阈值计算如下: Mpre(i,j) = (Mint(i,j)+1) / n^2

它需要设置:float d = 1.0而不是float d = 0.0如果我没记错的话。其次,我不确定如何左移ivec2空间坐标(我什至不确定 glsl 中向量的按位移位的行为是什么......)但我假设它只是组件按位运算,我尝试了插件(头部计算) 对于给定的空间坐标(2,1)(根据我对按位运算的假设)并得到不同的阈值结果,该阈值应该是 4x4 拜耳矩阵中该位置的阈值。

所以我怀疑这段代码实现有序抖动算法的效果如何。

其次,我仍然不确定这个阈值与在阴影贴图 1 或 2 之间进行选择有什么关系,而不仅仅是减少给定像素的颜色托盘,这个逻辑还没有在我的脑海中解决,因为我不明白使用给定空间坐标的抖动阈值来选择要从中采样的正确地图。

最后会不会选择空间坐标会导致抖动?给定世界位置的片段,(x,y,z)谁被阴影。给定帧的片段空间坐标是(i,j)。如果相机移动,这个片段空间坐标是否会改变,从而使为这个片段计算的抖动阈值随着每次移动而改变,从而导致抖动模式的抖动?

EDIT2: 尝试将地图混合如下,尽管结果看起来不太好,有什么想法吗?

基本上,如果我理解我正在做的是从矩阵中获取阴影像素的每个空间坐标的阈值,并且它(使用概率)高于混合因子,而不是我对第二张地图进行采样。

结果如下: 在此处输入图像描述 较大的红色框是地图之间发生分割的地方。
较小的红色框表示存在一些抖动模式,但图像并没有像我认为的那样混合。

0 投票
1 回答
315 浏览

c# - 有序抖动 - 每个通道的颜色值

在推进我的有序抖动算法时,我遇到了一个问题,主要是我真的不知道 col[levels] 可能是什么。

这是伪代码

在此处输入图像描述

k - 每个通道的颜色值数量

n - 阈值 Bayers 矩阵的大小

我的代码在某种程度上适用于 K = 2,但是当 K = 3、K = 4 等时它不会返回正确的结果图像

更新代码

0 投票
3 回答
594 浏览

matlab - Floyd Steinberg Dithering Matlab - 我做错了什么?

我正在尝试使用 Wikipedia 页面https://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering上的伪代码在 MATLAB 中实现 Floyd Steinberg Dithering

我的代码如下

图 1

图 1,错误地抖动

图 2

图 2,正确的抖动结果

我期待图像 2 中的结果,但我得到的是图像 1。看起来算法没有做任何事情。有任何想法吗?:)

编辑:我尝试image_dithered使用不同的值进行初始化;全零,量化图像和原始图像。它们都不能正常工作

编辑2:我现在计算循环内的误差和量化越来越近了。然而,仍然没有发现。

编辑 3:感谢@saastn 和@Cris Luengo,这两个答案都帮助我找出了哪里出错了,现在它似乎正在按预期工作!

为了完整起见,固定代码如下。

几乎可以工作的抖动图像,但不完全是预期的结果

0 投票
2 回答
299 浏览

java - 如何使用 Java 实现 1 位抖动?

最近,我们的老师让我们使用 Java 将彩色图像转换为 1 位图像。经过一些实验,我得到了以下结果:

好吧,它可以工作,但不幸的是,很多细节都丢失了。这是一个比较:

原来的:

原来的

输出:

转换后的输出

我想要什么:(总部:https ://i.stack.imgur.com/vlEAE.png )

我的目标

我正在考虑在我的转换器中添加抖动,但我还没有找到一种可行的方法,更不用说任何伪代码了。

谁能帮我?

编辑:

所以我创建了一个DitheringUtils-class:

并将我的功能更改为:

但输出最终看起来……很奇怪?

迷幻输出

我真的不明白为什么会有这样的波浪。

0 投票
1 回答
49 浏览

pixel - 有没有办法在 Photoshop 中绘制每一秒像素?(用于抖动)

我在问这个关于绘制像素艺术的问题。例如,如果我想画一条线,我可以用我的铅笔工具点击一个像素,按住 shift 键并点击我想要线条结束的地方。我想知道是否有某种方法可以做到这一点,但只绘制每隔一个像素,所以每当我想要实现抖动效果时,我不必单独绘制每个其他像素。当我排长队时,这尤其令人讨厌。谢谢你的帮助!

0 投票
0 回答
44 浏览

image-processing - X * Y 单色图像的有序抖动伪代码

我被分配为使用 D 作为阈值图的 x*y 单色图像 I 的有序抖动编写伪代码。有人可以帮我吗