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

如何用相邻颜色填充图像中的目标?基于OpenCV的实践问询

用相邻颜色填充粉色区域的解决方案

问题描述

需要为图像中的粉色框填充相邻区域的颜色以提升真实度,当前使用左上角像素颜色填充的效果不符合预期。

原始图像:
原始图像

当前实现效果:
当前效果

当前代码:

up = np.array([151,157,255])
pink_mask = cv2.inRange(img, up, up)
cnts, _ = cv2.findContours(pink_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in cnts:
    color = tuple(map(int, img[0, 0]))
    cv2.fillPoly(img, pts=[c], color=color)

解决思路

核心是获取粉色区域相邻的非粉色像素的颜色,以此作为填充色。具体步骤:

  1. 对粉色掩码做膨胀操作,覆盖粉色区域及其相邻区域
  2. 从膨胀后的掩码中提取出原本非粉色的部分,这部分就是相邻区域的像素
  3. 计算这些相邻像素的平均颜色,用该颜色填充粉色区域

改进后的代码

import cv2
import numpy as np

# 读取图像(替换为你的图像路径)
# img = cv2.imread("your_image_path.jpg")

up = np.array([151,157,255])
pink_mask = cv2.inRange(img, up, up)

# 膨胀操作获取相邻区域,核大小可根据粉色框尺寸调整
kernel = np.ones((5,5), np.uint8)
dilated_mask = cv2.dilate(pink_mask, kernel, iterations=1)

# 提取相邻区域:膨胀区域减去原始粉色区域
neighbor_mask = cv2.subtract(dilated_mask, pink_mask)

# 计算相邻区域的平均颜色
neighbor_pixels = img[neighbor_mask > 0]
if len(neighbor_pixels) > 0:
    avg_color = np.mean(neighbor_pixels, axis=0).astype(int)
    avg_color = tuple(map(int, avg_color))
else:
    # 极端情况 fallback:使用左上角像素颜色
    avg_color = tuple(map(int, img[0, 0]))

# 填充粉色区域
cnts, _ = cv2.findContours(pink_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in cnts:
    cv2.fillPoly(img, pts=[c], color=avg_color)

# 保存或查看结果
# cv2.imwrite("filled_result.jpg", img)
# cv2.imshow("Filled Image", img)
# cv2.waitKey(0)

说明

  • 膨胀核的大小可根据粉色框的实际尺寸调整,确保能覆盖到有效相邻区域
  • 平均色填充能让粉色区域和周围环境过渡更自然,提升真实感
  • 增加了 fallback 逻辑,避免极端场景下无相邻像素导致的报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:22:48