You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何根据布尔值为图片指定区域上色?

实现方案(以Python + OpenCV为例)

核心逻辑

先确定胸部区域的掩码(mask),当chest=True时,将该区域与蓝色图层融合,完成染色。

具体步骤

    1. 加载并预处理图像
      用OpenCV读取图像后,转换为RGB格式(OpenCV默认采用BGR编码):
    import cv2
    import numpy as np
    
    # 加载目标图像
    img = cv2.imread("Iy80N.jpg")
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
    1. 创建胸部区域掩码
      针对固定图像,可手动框选胸部坐标生成掩码;如果需要适配不同图像,建议用人体姿态模型自动定位:
    # 初始化全黑掩码
    mask = np.zeros_like(img_rgb)
    # 根据你的图像调整胸部区域坐标(x1,y1为左上角,x2,y2为右下角)
    x1, y1, x2, y2 = 150, 300, 350, 500
    # 将胸部区域标记为白色(表示需要染色的范围)
    mask[y1:y2, x1:x2] = [255, 255, 255]
    
    1. 根据布尔值执行染色
      当chest=True时,融合蓝色图层与原始图像:
    chest = True
    if chest:
        # 创建纯蓝色图层(RGB格式)
        blue_layer = np.full_like(img_rgb, (0, 0, 255))
        # 仅在掩码区域替换为蓝色,其余保留原图
        result = np.where(mask == 255, blue_layer, img_rgb)
        # 转换回BGR格式用于保存或显示
        result_bgr = cv2.cvtColor(result, cv2.COLOR_RGB2BGR)
        cv2.imwrite("chest_colored.jpg", result_bgr)
        cv2.imshow("Result", result_bgr)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    else:
        # chest为False时直接展示原图
        cv2.imshow("Original", img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

优化建议

  • 手动坐标需根据图像实际调整,可用系统自带画图工具获取胸部区域的像素范围。
  • 若需自动识别胸部,可使用MediaPipe Pose等人体姿态模型,通过定位胸部关键点生成不规则掩码。
  • 想要半透明染色效果,可改用cv2.addWeighted调整融合权重:
    alpha = 0.4  # 透明度,0为完全透明,1为完全不透明
    blended = cv2.addWeighted(blue_layer, alpha, img_rgb, 1-alpha, 0)
    result = np.where(mask == 255, blended, img_rgb)
    

内容的提问来源于stack exchange,提问作者user21809094

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:55:05