首页 > 解决方案 > 如何在 netpbm 图像中绘制平滑像素?

问题描述

我刚刚写了一个小的 netpbm 解析器,我玩得很开心,主要是绘制参数方程。他们第一次看起来不错,但我怎样才能扩展它并拥有看起来合法的东西?这张照片是我的方法如何重新创建了北极猴子标志

0.5[cos(19t) - cos(21t)] (我试图在叠加它们之前先绘制两个余弦) 在此处输入图像描述

它显然看起来非常“脆”和锋利。我使用尽可能小的步长,而不需要永远完成。(0.0005,耗时 < 5 秒)

我唯一的想法是,当绘制一个白色像素时,我还应该用一些稍微浅一点的灰色来绘制它的近邻。然后用更浅的灰色绘制那些像素的邻居。几乎就像白色是“溶解”或“消散”。

我没有尝试实现这一点,因为它感觉是一种非常糟糕的方法,而且我什至不确定它会产生接近理想效果的任何东西,所以我想我会先问一下。

编辑:这是一个仅绘制一个小螺旋的示例代码

绘制循环:

for (int t = 0; t < 6 * M_PI; t += 0.0005)
    {
        double r = t;
        new_x = 10 * r * cosf(0.1 * M_PI * t);
        new_y = -10 * r * sinf(0.1 * M_PI * t);
        img.SetPixel(new_x + img.img_width / 2, new_y + img.img_height / 2, 255);
    }

//img is a PPM image with magic number P5 (binary grayscale)

设置像素:

void PPMimage::SetPixel(const uint16_t x, const uint16_t y, const uint16_t pixelVal)
{
    assert(pixelVal >= 0 && pixelVal <= max_greys && "pixelVal larger than image's maximum max_grey\n%d");
    assert(x >= 0 && x < img_width && "X value larger than image width\n");
    assert(y >= 0 && y < img_height && "Y value larger than image height\n");


    img_raster[y * img_width + x] = pixelVal;
}

这就是这段代码产生的

在此处输入图像描述

标签: c++image-processing

解决方案


散点图(由点而不是线组成)的一种非常基本的抗锯齿形式可以通过应用随机舍入之类的方法来实现:将画笔视为像素大小的正方形(但请注意此模型的严重限制),居中在绘图点的非整数坐标处,并计算其与共享最接近该点的角的四个像素的重叠。将该重叠部分视为灰度部分,并将每个像素设置为接近一条线的大量点的最大值,或对少量离散点进行alpha混合


推荐阅读