【python opencv】直方图反投影
这是由Michael J. Swain和Dana H. Ballard在他们的论文《通过颜色直方图索引》中提出的。 用简单的话说是什么意思?它用于图像分割或在图像中查找感兴趣的对象。简而言之,它创建的图像大小与输入图像相同(但只有一个通道),其中每个像素对应于该像素属于我们物体的概率。用更简单的话来说,与其余部分相比,输出图像将在可能有对象的区域具有更多的白色值。好吧,这是一个直观的解释。(我无法使其更简单)。直方图反投影与camshift算法等配合使用。 我们该怎么做呢?我们创建一个图像的直方图,其中包含我们感兴趣的对象(在我们的示例中是背景等)。对象应尽可能填充图像以获得更好的效果。而且颜色直方图比灰度直方图更可取,因为对象的颜色对比灰度强度是定义对象的好方法。然后,我们将该直方图“反投影”到需要找到对象的测试图像上,换句话说,我们计算出属于背景的每个像素的概率并将其显示出来。在适当的阈值下产生的输出使我们仅获得背景。 Numpy中的算法
原始图像: roi图像: 处理之后: OpenCV的反投影OpenCV提供了一个内建的函数cv.calcBackProject()。它的参数几乎与cv.calchist()函数相同。它的一个参数是直方图,也就是物体的直方图,我们必须找到它。另外,在传递给backproject函数之前,应该对对象直方图进行归一化。它返回概率图像。然后我们用圆盘内核对图像进行卷积并应用阈值。下面是我的代码和结果: import numpy as np cv2 as cv from google.colab.patches cv2_imshow roi = cv.imread() hsv = 计算对象的直方图 roihist = cv.calcHist([hsv],1)">] ) 直方图归一化并利用反传算法 cv.normalize(roihist,roihist,255) 用圆盘进行卷积 disc = cv.getStructuringElement(cv.MORPH_ELLIPSE,1)">)) cv.filter2D(dst,dst) 应用阈值作与操作 ret,thresh = cv.threshold(dst,0) thresh = cv.merge((thresh,thresh,thresh)) res = cv.bitwise_and(target,thresh) res = np.vstack((target,res)) cv2_imshow(res) 结果: 附加资源
参考: http://woshicver.com/FifthSection/4_10_4_%E7%9B%B4%E6%96%B9%E5%9B%BE-4%EF%BC%9A%E7%9B%B4%E6%96%B9%E5%9B%BE%E5%8F%8D%E6%8A%95%E5%BD%B1/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |