【OpenCV-Python】教程:3-10 直方图(4)直方图反向投影
创始人
2024-04-15 12:59:33
0

OpenCV Python 直方图 反向投影

【目标】

  • 直方图反向投影
  • calcBackProject

【原理】

用于图像分割和查找感兴趣目标。简单的说,会创建一个与输入图像同样大小的图像(单通道),每个像素对应像素属于目标的概率。更简单的说就是,输出图像在感兴趣的目标处更白。常常与 camshift 算法一起使用,用于目标跟踪(查找目标)
如何使用呢?创建一个图像的直方图,包含了感兴趣目标,目标必须尽可能充满图像,效果会更好。颜色直方图优于灰度直方图,因为对象的颜色比其灰度强度更适合定义对象。然后,我们反向投影这个直方图去测试图像上查找这个目标。换句话说,我们计算每个像素属于地面的概率并显示它,结果显示我们需要的地面。

【代码】

在这里插入图片描述

import numpy as np 
import cv2 img = cv2.imread("assets/messi5.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)ground_patch = cv2.imread("assets/messi_ground.png")
ground_hsv = cv2.cvtColor(ground_patch, cv2.COLOR_BGR2HSV)# 计算目标的直方图
ground_hist = cv2.calcHist([ground_hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])# 归一化
cv2.normalize(ground_hist, ground_hist, 0, 255, cv2.NORM_MINMAX)# 反向投影
dst = cv2.calcBackProject([hsv], [0, 1], ground_hist, [0, 180, 0, 256], 1)# 对投影图像做一些处理
ele = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
cv2.filter2D(dst, -1, ele, dst)
ret, thresh = cv2.threshold(dst, 50, 255, cv2.THRESH_BINARY)# threshcolor = cv2.merge((thresh, thresh, thresh))
threshcolor = cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR)result = cv2.bitwise_and(threshcolor, img)
result = np.hstack((img, threshcolor, result))cv2.imshow("result", result)
# cv2.imshow("src", img)
cv2.imshow("patch", ground_patch)
cv2.waitKey(0)
cv2.destroyAllWindows()

【接口】

  • calcBackProject
cv2.calcBackProject(	images, channels, hist, ranges, scale[, dst]	) ->	dst

计算直方图的反向投影,其中一个参数是目标的直方图,是需要查找的目标。目标的直方图在传入之前需要归一化,返回一个概率图。然后用个特殊的核进行卷积,并进行阈值化。

  • images: 输入图像数组,是一个list
  • channels: 用于计算反向投影的通道,必须与待计算直方图通道来源一致;
  • hist: 输入的直方图(待检目标的直方图)
  • ranges: 与 calcHist 意思相同
  • scale: 可选参数,越大越精确

【参考】

  1. OpenCV官方文档
  2. “Indexing via color histograms”, Swain, Michael J. , Third international conference on computer vision,1990.

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...