如何在netpbm图像中绘制平滑像素?

时间:2019-08-02 03:42:41

标签: c++ image-processing

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

的北极猴子徽标

0.5[cos(19t) - cos(21t)] (我在叠加之前先尝试绘制两个余弦) enter image description here

显然,它看起来非常“脆”且锋利。我使用了尽可能小的步长,而无需花费很多时间来完成。 (0.0005,耗时<5秒)

我唯一的想法是,当绘制白色像素时,我还应该使用稍微浅一些的灰色绘制其直接相邻像素。然后用更浅的灰色绘制THOSE像素的邻居。几乎像白色是“溶解”或“消散”。

我没有尝试实现它,因为这样做感觉很不好,我什至不确定它会产生什么效果,所以我想先问一下。

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

绘制循环:

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)

SetPixel:

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

这是这段代码产生的

enter image description here

1 个答案:

答案 0 :(得分:0)

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