c++ - Floyd Steinberg 抖动灰色(pgm ascii)到黑白(pbm ascii)

标签 c++ image-processing pbm

我在pgm中有图像

enter image description here

使用此功能后:

void convertWithDithering(array_type& pixelgray)
{

    int oldpixel;
    int newpixel;
    int quant_error;

    for (int y = 0; y< HEIGHT-1; y++){
        for (int x = 1; x<WIDTH-1; x++){
                oldpixel = pixelgray[x][y];
                 newpixel  = (oldpixel > 128) ? 0 : 1;
                 pixelgray[x][y] = newpixel;
                  quant_error  = oldpixel - newpixel;
                 pixelgray[x+1][y]  =  pixelgray[x+1][y] + 7/16 * quant_error;
                pixelgray[x-1][y+1]  = pixelgray[x-1][y+1] + 3/16 * quant_error;
                pixelgray[x  ][y+1]=pixelgray[x  ][y+1]+  5/16 * quant_error;
                 pixelgray[x+1][y+1] = pixelgray[x+1][y+1]+ 1/16 * quant_error;
        }
    }

}

我有这个

enter image description here

我只想得到黑白颜色相同的图像

最佳答案

上次我对一个PGM文件有类似的吐槽,是因为我把数据保存在了一个由fopen(filename,"w");打开的文件中

该文件有很多 \r\n 行结尾 (os: windows),而它只需要 \n。也许你的问题是这样的。以二进制格式保存文件,用

fopen(文件名,"wb");

编辑:除了微笑之外,您对 Floyd–Steinberg 抖动的实现是不正确的。

首先,您的错误传播应该是 XXX * quant_error/16 而不是 XXX/16 * quant_error(它将始终等于 0)。

然后,您混合了两个颜色空间(0/1 和 0->255)。正确的处理方法是始终使用 0->255 空间,方法是将测试行更改为

newpixel = (oldpixel > 128) ? 255:0; (注意 255 : 0 的顺序很重要,如果你让 0 : 255,算法将不起作用)

在函数结束时,你的数组将是满的或0或255。如果你愿意,你可以再迭代一次将其转换为0-1,但我认为记录一次更容易你的 pbm 文件。

关于c++ - Floyd Steinberg 抖动灰色(pgm ascii)到黑白(pbm ascii),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20068490/

相关文章:

algorithm - 图片相似度比较

opencv - 我应该使用什么样的描述符来检测海豹幼崽?

c++ - 检测堆损坏

模板参数列表的 C++ 别名

c++ - 如何填充由 GL_LINE_LOOP 组成的形状

c++ - 编写我自己的字符串类但得到 "reference to ‘string’ 是不明确的“编译错误

java - JAVA中改变图像尺寸而不改变分辨率

opencv - C++无法使用Opencv打开pbm文件

python - 我有一个 PNG 图像,想知道如何在 python 中有效地将其转换为 PBM