1

我在 pgm 中有图像

在此处输入图像描述

使用此功能后:

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;
        }
    }

}

我有这个

在此处输入图像描述

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

4

2 回答 2

2

上次我对 PGM 文件进行了类似的操作,这是因为我将数据保存在由fopen(filename,"w");

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

fopen(filename,"wb");

编辑:除了 smeering,您对 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 文件,这样做会更容易.

于 2013-11-19T12:13:36.797 回答
0

看起来在这个函数之外转换为 PBM 做错了什么。看起来它正在将一个 PGM 像素转换为几个 PBM 像素,这会导致这种“模糊”效果。只是一个疯狂的猜测。除了一件小事之外,该功能本身对我来说看起来还不错:我认为由于您使用int了所有内容,所以您的所有内容都 5/16 * quant_error将为零。而是使用浮点数或双精度数并制作它5.0/16.0

于 2013-11-19T11:01:19.743 回答