OpenCV如何仅保留图像指定区域内容、其余置黑且保持原有位置
解决方案
你出现位置不匹配的核心原因是你把裁剪出的圆形区域额外做了填充后再和原图拼接,破坏了原始坐标对应关系。要实现保留原位置、其他区域置黑的效果,用掩码运算即可,不需要做裁剪拼接操作。
修正后完整代码
import cv2 import numpy as np pic = cv2.imread('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) # 创建全黑掩码,大小和边缘检测结果一致 mask = np.zeros_like(res) if circles is not None: circles = np.uint16(np.around(circles)) for i in circles[0, :]: # 在掩码上把检测到的圆形区域填充为白色 cv2.circle(mask, (i[0], i[1]), i[2], 255, -1) # 可选:在原图上绘制圆形边框 cv2.circle(pic, (i[0], i[1]), i[2], (255,255,255), 2) # 按位与运算,仅保留掩码为白色的区域内容 result = cv2.bitwise_and(res, res, mask=mask) # 如果想要基于彩色原图保留选中区域,用下面这行代码即可 # result = cv2.bitwise_and(pic, pic, mask=mask) cv2.imshow('Hole', result) cv2.waitKey(0) cv2.destroyAllWindows()
关键修改说明
- 移除了裁剪、填充、拼接的错误逻辑,换成掩码运算保证坐标完全匹配
- 修正了原代码中
NumPy导入的大小写错误,避免运行报错 - 增加了圆形检测结果非空判断,避免无检测结果时代码崩溃
- 掩码运算直接在原始图像尺寸上操作,选中区域的位置和原图完全一致
内容的提问来源于stack exchange,提问作者Felix Filipi
相关产品推荐
相关产品推荐

