0

我一直在使用 aforge 的 floyed-steinberg 抖动方法,但我注意到您无法指定抖动量。我希望能够指定 0 到 100 之间的数量。所以如果我要求 50,它会抖动 100 的一半。或者,如果我指定 0,那么生成的图像将由纯色组成每种颜色之间都有硬边……或者换句话说,没有抖动。我正在为诸如 floyed-steinberg 或 Jarvis、Judice、Ninke dithering 之类的例程寻找 c# 代码,它接受一个数量。有人知道吗?

4

1 回答 1

1

通过稍微改变这种抖动,您可以获得抖动的可扩展性。r0,g0,b0只需按比例缩放颜色累加器(剩余部分)<0,1>

示例 (GIF) 动画:

例子

这里只是 C++ 抖动部分(其余部分在上面的链接中)

// dithering
r0=0; g0=0; b0=0;   // no leftovers
for (y=0;y<pic0.ys;y++)
 for (x=0;x<pic0.xs;x++)
    {
    // get source pixel color
    c=pic0.p[y][x];
    // add to leftovers
    r0+=WORD(c.db[picture::_r]);
    g0+=WORD(c.db[picture::_g]);
    b0+=WORD(c.db[picture::_b]);
    // find closest color from pal[]
    for (i=0,j=-1;i<pal.num;i++)
        {
        c=pal[i];
        r=WORD(c.db[picture::_r]);
        g=WORD(c.db[picture::_g]);
        b=WORD(c.db[picture::_b]);
        e=(r-r0); e*=e; d =e;
        e=(g-g0); e*=e; d+=e;
        e=(b-b0); e*=e; d+=e;
        if ((j<0)||(d0>d)) { d0=d; j=i; }
        }
    // get selected palette color
    c=pal[j];
    // sub from leftovers
    r0-=WORD(c.db[picture::_r]);
    g0-=WORD(c.db[picture::_g]);
    b0-=WORD(c.db[picture::_b]);
    // scale dithering
    r0=(r0*coef)/100;
    g0=(g0*coef)/100;
    b0=(b0*coef)/100;
    // copy to destination image
    pic2.p[y][x]=c;
    }

coef = <0,100>你的秤在哪里。链接答案中代码的唯一变化是添加了 3 行用于缩放抖动。这里使用VGA 256 色默认调色板的示例:

系数 = 100

在此处输入图像描述

系数 = ~75

在此处输入图像描述

系数 = ~50

在此处输入图像描述

系数 = ~25

在此处输入图像描述

系数 = 0

在此处输入图像描述

[笔记]

Mycoef由滚动条设置,因此只有 0% 和 100% 是精确的,所有其他系数都可能接近所选值。

例如,如果将系数范围更改为 2 的幂,<0,128>则可以在缩放时使用位移而不是除法。

于 2016-04-25T11:22:56.127 回答