【开发日志】2023.05 ZENO----Image Processing----CompBlur----DIY kernel

 

std::vector<std::vector<float>> createKernel(float blurValue,
                                             float l_blurValue, float r_blurValue,
                                             float t_blurValue, float b_blurValue,
                                             float lt_blurValue, float rt_blurValue,
                                             float lb_blurValue, float rb_blurValue) {
    std::vector<std::vector<float>> kernel;
//    if (isBounded) {
//        kernel = {
   
   {blurValue}};
//    }
    kernel = {
   
   {lt_blurValue, t_blurValue, rt_blurValue},
              {l_blurValue, blurValue, r_blurValue},
              {lb_blurValue, b_blurValue, rb_blurValue}};
    return kernel;
}
struct CompBlur : INode {
    virtual void apply() override {
        auto image = get_input<PrimitiveObject>("image");
        auto s = get_input2<float>("strength");
        auto ktop = get_input2<vec3f>("kerneltop");
        auto kmid = get_input2<vec3f>("kernelmid");
        auto kbot = get_input2<vec3f>("kernelbot");
        auto &ud = image->userData();
        int w = ud.get2<int>("w");
        int h = ud.get2<int>("h");
        auto blurredImage = std::make_shared<PrimitiveObject>();
        blurredImage->verts.resize(w * h);
        blurredImage->userData().set2("h", h);
        blurredImage->userData().set2("w", w);
        blurredImage->userData().set2("isImage", 1);
        if(image->has_attr("alpha")){
            blurredImage->verts.attr<float>("alpha") = image->verts.attr<float>("alpha");
        }
        std::vector<std::vector<float>>k = createKernel(kmid[1],kmid[0],kmid[2],ktop[1],kbot[1],ktop[0],ktop[2],kbot[0],kbot[2]);
        int kernelSize = s * k.size();
        int kernelRadius = kernelSize / 2;

// 计算卷积核的中心坐标
        int anchorX = 3 / 2;
        int anchorY = 3 / 2;
        for (int iter = 0; iter < s; iter++) {
            // 对每个像素进行卷积操作
            for (int y = 0; y < h; y++) {
                for (int x = 0; x < w; x++) {
                    float sum0 = 0.0f;
                    float sum1 = 0.0f;
                    float sum2 = 0.0f;
                    for (int i = 0; i < 3; i++) {
                        for (int j = 0; j < 3; j++) {
                            int kernelX = x + j - anchorX;
                            int kernelY = y + i - anchorY;

                            if (kernelX >= 0 && kernelX < w && kernelY >= 0 && kernelY < h) {

                                sum0 += image->verts[kernelY * h + kernelX][0] * k[i][j];
                                sum1 += image->verts[kernelY * h + kernelX][1] * k[i][j];
                                sum2 += image->verts[kernelY * h + kernelX][2] * k[i][j];
                            }
                        }
                    }
                    // 将结果赋值给输出图像
                    blurredImage->verts[y * w + x] = {static_cast<float>(sum0), static_cast<float>(sum1),
                                                      static_cast<float>(sum2)};
                }
            }
            image = blurredImage;
        }
        set_output("image", blurredImage);
    }
};

ZENDEFNODE(CompBlur, {
    {
        {"image"},
        {"float", "strength", "5"},
        {"vec3f", "kerneltop", "0.075,0.124,0.075"},
        {"vec3f", "kernelmid", "0.124,0.204,0.124"},
        {"vec3f", "kernelbot", "0.075,0.124,0.075"},
    },
    {
        {"image"}
    },
    {},
    { "image" },
});

猜你喜欢

转载自blog.csdn.net/Angelloveyatou/article/details/130936523