python - OpenCV Python 删除图像中的某些对象
问题描述
我正在使用带有 opencv 和 numpy 的 python 来检测天文中的星星,例如这一张1图像。使用模板匹配,我可以通过在星形模板周围绘制一个矩形来检测具有阈值的星形(单击 2) 2 。我的下一个目标是基本上从图像中“移除”星星。
为此,我尝试使用不同的方法(cv2.blur 等)模糊图像,但它不会产生我想要的效果。我的下一个想法是从星星周围的像素中获取 rgb 数据,将它们平均,然后用所选颜色在星星上着色。这是最好的选择吗?我该怎么做?
我的代码如下。
import cv2
import numpy as np
import time
start = time.time()
threshold = 0.4
image = cv2.imread('lag.jpg')
imageG = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#cv2.imshow('original', image)
#cv2.imshow('greyscale', imageG)
template = cv2.imread('template.jpg', 0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(imageG,template,cv2.TM_CCOEFF_NORMED)
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
a = cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0,0,255), 1)
cv2.imshow('lag.jpg', image)
end = time.time()
final = end - start
print(final)
cv2.waitKey(0)
cv2.destroyAllWindows()
解决方案
您可以创建一个蒙版,并使用cv2.inpaint使用区域边界附近的像素替换选定的“蒙版区域”。
由于您没有发布'template.jpg'
,因此我创建了以下内容:
通过在 zeros 图像上绘制填充矩形来构建遮罩:
mask = np.zeros_like(imageG) for pt in zip(*loc[::-1]): #a = cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0,0,255), 1) cv2.rectangle(mask, (pt[0]+3, pt[1]+3), (pt[0]+w-3, pt[1]+h-3), 255, -1) # Reduce the size of the rectangle by 3 pixels from each side.
注意:我曾经
cv2.rectangle
保留您的原始代码,但我认为在您的情况下圈子可能会更好。inpaint
用于去除遮罩区域:image = cv2.inpaint(image, mask, 2, cv2.INPAINT_NS)
您可以调整参数。
这是完整的代码:
import cv2
import numpy as np
import time
start = time.time()
threshold = 0.4
image = cv2.imread('lag.jpg')
imageG = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#template = cv2.imread('template.jpg', 0)
template = cv2.imread('template.png', 0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(imageG,template,cv2.TM_CCOEFF_NORMED)
loc = np.where( res >= threshold)
mask = np.zeros_like(imageG)
for pt in zip(*loc[::-1]):
#a = cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0,0,255), 1)
cv2.rectangle(mask, (pt[0]+3, pt[1]+3), (pt[0]+w-3, pt[1]+h-3), 255, -1) # Reduce the size of the rectangle by 3 pixels from each side
image = cv2.inpaint(image, mask, 2, cv2.INPAINT_NS)
cv2.imshow('lag.jpg', image)
cv2.imshow('mask', mask)
end = time.time()
final = end - start
print(final)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果:
您可以使用几个大小的矩形(或圆形)来改进解决方案 - 使用较大的矩形来覆盖较大的星星。
推荐阅读
- c# - 如何解密使用 .NET 中的 AES 加密的 Node.js 中的数据?
- button - 如何在 TextBox / ComboBox 中添加 ListView 的值?VB6
- php - 调试opencart 3时出现异常
- python - 根据等于 True 的列数选择数据框中的行
- mongoose-os - GPIO.read() 在猫鼬操作系统(mos 工具)中不起作用
- javascript - 工厂函数,如何生成随机密钥?
- sass - node-sass 编译器不编译以下划线开头的 scss 文件
- php - 带有 php 代码的引导数据表不起作用
- java - 在创建可定制的 java 客户端期间出现 StreamCorruptedException
- aerospike - 为什么与写入/秒相比,aerospike 的读取/秒非常少?