gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:11:51 30 4
gpt4 key购买 nike

我在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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com