我在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;
}
}
}
我有这个
我只想得到黑白颜色相同的图像
最佳答案
上次我对一个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/