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

OpenCV如何保留选中区域图像内容、将其余背景设置为黑色

实现选中区域保留彩色、其余背景变黑的效果

我需要实现的效果是:仅保留已识别出的选中区域的彩色原图内容,将其余区域的背景全部设置为黑色,和我现有代码的效果刚好相反。
需求示意图如下:
需求示意图
图中黑色区域为已识别的选中区域,我需要反转效果,让选中区域保留彩色,背景变为黑色。

现有代码

import cv2
import numpy as np

pic= cv2.imread('dataset/set.jpeg')
pic = cv2.resize(pic, dsize=(500, 400), interpolation=cv2.INTER_CUBIC)
gray=cv2.cvtColor(pic,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),5)
_,thres = cv2.threshold(blur, 100,250, cv2.THRESH_TOZERO)
res = cv2.Canny(thres, 100, 200, L2gradient=True)

circles = cv2.HoughCircles(res,cv2.HOUGH_GRADIENT,1,20,param1=200,param2=15,minRadius=80,maxRadius=100)

for i in circles[0,:]:
    # draw the outer circle
    cv2.circle(pic,(int(i[0]),int(i[1])),int(i[2]),(255,255,255),2)
    i = i.astype(int)
    pic[i[1]-i[2]:i[1]+i[2], i[0]-i[2]:i[0]+i[2]] = 0

cv2.imshow('Hole',pic)
cv2.waitKey(0)
cv2.destroyAllWindows()

当前问题出在pic[i[1]-i[2]:i[1]+i[2], i[0]-i[2]:i[0]+i[2]] = 0这段逻辑上:现在的代码是将选中区域设置为黑色(值为0),不知道如何修改才能实现保留选中区域彩色、其余背景变为黑色的效果。

解决方案

你可以先创建一个和原图尺寸完全一致的全黑画布,再把识别到的圆形区域替换为原图对应位置的彩色内容即可,修改后的代码如下:

import cv2
import numpy as np

pic= cv2.imread('dataset/set.jpeg')
pic = cv2.resize(pic, dsize=(500, 400), interpolation=cv2.INTER_CUBIC)
# 保存原始彩色图备用
original_pic = pic.copy()
gray=cv2.cvtColor(pic,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),5)
_,thres = cv2.threshold(blur, 100,250, cv2.THRESH_TOZERO)
res = cv2.Canny(thres, 100, 200, L2gradient=True)

circles = cv2.HoughCircles(res,cv2.HOUGH_GRADIENT,1,20,param1=200,param2=15,minRadius=80,maxRadius=100)

# 初始化全黑的结果画布
result = np.zeros_like(pic)

for i in circles[0,:]:
    i = i.astype(int)
    # 仅将识别到的圆形区域的原始彩色内容复制到全黑画布中
    result[i[1]-i[2]:i[1]+i[2], i[0]-i[2]:i[0]+i[2]] = original_pic[i[1]-i[2]:i[1]+i[2], i[0]-i[2]:i[0]+i[2]]
    # 绘制外圆边框
    cv2.circle(result,(int(i[0]),int(i[1])),int(i[2]),(255,255,255),2)

cv2.imshow('Hole',result)
cv2.waitKey(0)
cv2.destroyAllWindows()

核心修改逻辑:

  • 新增变量保存原始彩色图,避免操作过程中修改原图后无法读取原始内容
  • 不再直接修改原图,改为先创建全黑画布,仅把选中的圆形区域内容从原图拷贝到画布中
  • 调整外圆绘制顺序,避免边框被区域内容覆盖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:39:03