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
相关产品推荐
相关产品推荐

