【开发日志】2023.05 ZENO----Image Processing----ImageExtractColor、ImageDelColor

该代码定义了两个图像处理节点,ImageExtractColor和ImageDelColor,用于根据颜色阈值改变图像像素。它们接受输入的颜色阈值范围和背景类型(透明、黑色或白色),并相应地调整图像像素。如果背景设置为透明,节点会设置超出阈值范围的像素的透明度为0;如果背景是黑色或白色,则会将这些像素替换为对应的颜色。
摘要由CSDN通过智能技术生成

 

 

 

 

 

 

 

 

 

 

 

struct ImageExtractColor : INode {
    virtual void apply() override {
        auto image = get_input<PrimitiveObject>("image");
        auto background = get_input2<std::string>("background");
        auto &ud = image->userData();
        int w = ud.get2<int>("w");
        int h = ud.get2<int>("h");
        vec3f up = get_input2<vec3f>("high_threshold");
        vec3f low = get_input2<vec3f>("low_threshold");
        float upr = up[0]/255, upg = up[1]/255, upb = up[2]/255;
        float lr = low[0]/255,lg = low[1]/255,lb = low[2]/255;
        zeno::log_info("up:{}, {}, {}",upr,upg,upb);
        zeno::log_info("low:{}, {}, {}",lr,lg,lb);
        if(background == "transparent"){
            if(!image->has_attr("alpha")){
                image->verts.add_attr<float>("alpha");
                for(int i = 0; i < image->verts.size();i++){
                    image->verts.attr<float>("alpha")[i] = 1;
                }
            }
            for (auto i = 0; i < image->verts.size(); i++) {
                if(((upr < image->verts[i][0]) || (image->verts[i][0] < lr)) ||
                   ((upg < image->verts[i][1]) || (image->verts[i][1] < lg)) ||
                   ((upb < image->verts[i][2]) || (image->verts[i][2] < lb))){
                    image->verts.attr<float>("alpha")[i] = 0;
                }
            }
        }
        else if(background == "black"){
            for (auto i = 0; i < image->verts.size(); i++) {
                if(((upr < image->verts[i][0]) || (image->verts[i][0] < lr)) ||
                   ((upg < image->verts[i][1]) || (image->verts[i][1] < lg)) ||
                   ((upb < image->verts[i][2]) || (image->verts[i][2] < lb))){
                    image->verts[i] = {0,0,0};

                }
            }
        }
        else if(background == "white"){
            for (auto i = 0; i < image->verts.size(); i++) {
                if(((upr < image->verts[i][0]) || (image->verts[i][0] < lr)) ||
                   ((upg < image->verts[i][1]) || (image->verts[i][1] < lg)) ||
                   ((upb < image->verts[i][2]) || (image->verts[i][2] < lb))){
                    image->verts[i] = {1,1,1};
                }
            }
        }
        set_output("image", image);
    }
};
ZENDEFNODE(ImageExtractColor, {
    {
        {"image"},
        {"vec3f", "high_threshold", "255,255,255"},
        {"vec3f", "low_threshold", "0,0,0"},
        {"enum transparent black white", "background", "transparent"},
    },
    {
        {"image"},
    },
    {},
    { "image" },
});

struct ImageDelColor: INode {
    void apply() override {
        auto image = get_input<PrimitiveObject>("image");
        auto background = get_input2<std::string>("background");
        auto &ud = image->userData();
        int w = ud.get2<int>("w");
        int h = ud.get2<int>("h");
        vec3f up = get_input2<vec3f>("high_threshold");
        vec3f low = get_input2<vec3f>("low_threshold");
        float upr = up[0]/255, upg = up[1]/255, upb = up[2]/255;
        float lr = low[0]/255,lg = low[1]/255,lb = low[2]/255;
        if(background == "transparent"){
            if(!image->has_attr("alpha")){
                image->verts.add_attr<float>("alpha");
                for(int i = 0; i < image->verts.size();i++){
                    image->verts.attr<float>("alpha")[i] = 1;
                }
            }
            for (auto i = 0; i < image->verts.size(); i++) {
                if(((lr <= image->verts[i][0]) && (image->verts[i][0] <= upr)) &&
                   ((lg <= image->verts[i][1]) && (image->verts[i][1] <= upg)) &&
                   ((lb <= image->verts[i][2]) && (image->verts[i][2] <= upb))){
                    image->verts.attr<float>("alpha")[i] = 0;
                }
            }
        }
        else if(background == "black"){
            for (auto i = 0; i < image->verts.size(); i++) {
                if(((lr <= image->verts[i][0]) && (image->verts[i][0] <= upr)) &&
                   ((lg <= image->verts[i][1]) && (image->verts[i][1] <= upg)) &&
                   ((lb <= image->verts[i][2]) && (image->verts[i][2] <= upb))){
                    image->verts[i] = {0,0,0};
                }
            }
        }
        else if(background == "white"){
            for (auto i = 0; i < image->verts.size(); i++) {
                if(((lr <= image->verts[i][0]) && (image->verts[i][0] <= upr)) &&
                   ((lg <= image->verts[i][1]) && (image->verts[i][1] <= upg)) &&
                   ((lb <= image->verts[i][2]) && (image->verts[i][2] <= upb))){
                    image->verts[i] = {1,1,1};
                }
            }
        }
        set_output("image", image);
    }
};

ZENDEFNODE(ImageDelColor, {
    {
        {"image"},
        {"vec3f", "high_threshold", "255,255,255"},
        {"vec3f", "low_threshold", "0,0,0"},
        {"enum transparent black white", "background", "transparent"},
    },
    {
        {"image"},
    },
    {},
    {"image"},
});

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值