【OpenCV学习笔记30】- OpenCV 中的直方图 - 直方图 - 4:直方图反投影

本文是关于OpenCV官方文档中图像处理的笔记,介绍了直方图反投影的概念、应用场景以及如何使用Numpy在OpenCV中实现这一技术。通过实例展示了从计算直方图到生成概率图像的过程,并提到了OpenCV内置函数cv.calcBackProject的应用。
摘要由CSDN通过智能技术生成

这是对于 OpenCV 官方文档中 图像处理 的学习笔记。学习笔记中会记录官方给出的例子,也会给出自己根据官方的例子完成的更改代码,同样彩蛋的实现也会结合多个知识点一起实现一些小功能,来帮助我们对学会的知识点进行结合应用。
如果有喜欢我笔记的请麻烦帮我关注、点赞、评论。谢谢诸位。

学习笔记:
学习笔记目录里面会收录我关于OpenCV系列学习笔记博文,大家如果有什么不懂的可以通过阅读我的学习笔记进行学习。
【OpenCV学习笔记】- 学习笔记目录

内容

  • 直方图反投影

理论

它是由 Michael J. SwainDana H. Ballard 在他们的论文 “ 通过颜色直方图索引” 中提出的。

简单来说到底是什么?它用于图像分割或在图像中查找感兴趣的对象。简而言之,它创建的图像大小与输入图像相同(但只有一个通道),其中每个像素对应于该像素属于我们物体的概率。在更简单的环境中,与其余部分相比,输出图像将使我们感兴趣的对象具有更多的白色。好吧,这是一个直观的解释。(我无法使其更简单)。直方图反投影与camshift算法等配合使用。

我们该怎么做呢 ?我们创建一个图像的直方图,其中包含我们感兴趣的对象(在我们的示例中是地面,离开播放器等)。对象应尽可能填充图像以获得更好的效果。而且颜色直方图比灰度直方图更可取,因为对象的颜色比其灰度强度是定义对象的更好方法。然后,我们将该直方图“反向投影”到需要找到对象的测试图像上,换句话说,我们计算出属于地面的每个像素的概率并将其显示出来。在适当的阈值下产生的输出仅使我们有基础。

Numpy中的算法

1. 首先,我们需要计算我们要查找的对象(使其为“ M”)和要搜索的图像(使其为“ I”)的颜色直方图。

示例代码:

# OpenCV 中的直方图
# 直方图 - 4:直方图反投影
# Numpy中的反投影算法
import numpy as np
import cv2 as cv

# roi is the object or region of object we need to find
# ROI是我们需要找到的对象或对象的区域
roi = cv.imread('../image/3.10.3-1.png')
hsv = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
# target is the image we search in
# 目标是我们搜索的图像
target = cv.imread('../image/3.10.3-1.png')
hsvt = cv.cvtColor(target, cv.COLOR_BGR2HSV)
# Find the histograms using calcHist. Can be done with np.histogram2d also
# 使用calcHist查找直方图。可以用np来完成。histogram2d也
M = cv.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
I = cv.calcHist([hsvt], [0, 1], None, [180, 256], [0, 180, 0, 256])
2. 求出比率 (R= M/I)。然后反向投影R,即使用R作为调色板,并以每个像素作为其对应的目标概率创建一个新图像。即 (B(x,y)= R [h(x,y),s(x,y)]) 其中h是色调,s是像素在(x,y)的饱和度。之后,应用条件 (B(x,y)= min[B(x,y),1]) 。
h,s,v = cv.split(hsvt)
B = R[h.ravel(),s.ravel()]
B = np.minimum(B,1)
B = B.reshape(hsvt.shape[:2])
3.现在对圆盘应用卷积,(B=D∗B) ,其中D是光盘内核。
disc = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
cv.filter2D(B,-1,disc,B)
B = np.uint8(B)
cv.normalize(B,B,0,255,cv.NORM_MINMAX)
4.现在最大强度的位置给了我们物体的位置。如果我们期望图像中有一个区域,则对合适的值进行阈值处理将获得不错的结果。
ret,thresh = cv.threshold(B,50,255,0) 

OpenCV中的反投影

OpenCV提供了一个内置函数 cv.calcBackProject() 。它的参数与 cv.calcHist() 函数几乎相同。它的参数之一是直方图,它是对象的直方图,我们必须找到它。另外,在传递给backproject函数之前,应对对象直方图进行标准化。它返回概率图像。然后,我们将图像与磁盘内核卷积并应用阈值。

示例代码:

ret,thresh = cv.threshold(B,50,255,0) 

原图:
在这里插入图片描述
区域图:
在这里插入图片描述

效果图:
在这里插入图片描述

其他资源

“Indexing via color histograms”(“基于颜色直方图的索引”),Swain, Michael J.,第三届计算机视觉国际会议,1990。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜七天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值