OpenCV---直方图反向投影

一:直方图反向投影的方法

二:二维直方图的表示

(一)直接显示

def hist2D_demo(image):
    hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
    hist = cv.calcHist([image],[0,1],None,[289,286],[0,289,0,286])
    cv.imshow("hist2D",hist)

(二)使用matplotlib

def hist2D_demo(image):
    hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
    hist = cv.calcHist([image],[0,1],None,[289,286],[0,289,0,286])
    plt.imshow(hist,interpolation="nearest")
    plt.title("2D Histogram")
    plt.show()

三:直方图反向映射

calcHist方法参数可见:OpenCV---图像直方图

def back_projection_demo():
    sample = cv.imread("./s2.png")
    target = cv.imread("./b.png")
    roi_hsv = cv.cvtColor(sample,cv.COLOR_BGR2HSV)
    tar_hsv = cv.cvtColor(target,cv.COLOR_BGR2HSV)

    cv.imshow("sample",sample)
    cv.imshow("target",target)

    roihist = cv.calcHist([roi_hsv], [0, 1], None, [324, 356], [0, 324, 0, 356])  #加红部分越小,匹配越放松,匹配越全面,若是bsize值越大,则要求得越精细,越不易匹配,所以导致匹配出来的比较小
    cv.normalize(roihist,roihist,0,255,cv.NORM_MINMAX)  #规划到0-255之间
    dst = cv.calcBackProject([tar_hsv],[0,1],roihist,[0,324,0,356],1)   #直方图反向投影
    cv.imshow("back_projection_demo",dst)

roihist = cv.calcHist([roi_hsv], [0, 1], None, [32, 46], [0, 324, 0, 356])  #这是两个通道,bsize变少了,但是他的匹配更加广了(对于匹配的局限放宽了)

opencv 2 归一化函数normalize详解

1. 归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。

归一化函数cv2.normalize原型:normalize(src, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]]) -> dst 

src参数表示输入数组。

dst参数表示输出与src相同大小的数组,支持原地运算。

alpha参数表示range normalization模式的最小值。

beta参数表示range normalization模式的最大值,不用于norm normalization(范数归一化)模式。

norm_type参数表示归一化的类型。

norm_type参数可以有以下的取值:

NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。

NORM_INF:归一化数组的C-范数(绝对值的最大值)。

NORM_L1 :归一化数组的L1-范数(绝对值的和)。

NORM_L2 :归一化数组的(欧几里德)L2-范数。
2.反向投影用于在输入图像(通常较大)中查找特定图像(通常较小或者仅1个像素,以下将其称为模板图像)最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置。

函数cv2.calcBackProject用来计算直方图反向投影。

函数原型:calcBackProject(images, channels, hist, ranges, scale[, dst]) -> dst

images参数表示输入图像(是HSV图像)。传入时应该用中括号[ ]括起来。

channels参数表示用于计算反向投影的通道列表,通道数必须与直方图维度相匹配。

hist参数表示输入的模板图像直方图。

ranges参数表示直方图中每个维度bin的取值范围 (即每个维度有多少个bin)。

scale参数表示可选输出反向投影的比例因子,一般取1。

原文地址:https://www.cnblogs.com/ssyfj/p/9271327.html

时间: 2024-08-05 08:01:45

OpenCV---直方图反向投影的相关文章

OpenCv 020---图像直方图反向投影

1 前备知识 直方图的方向投影原理及代码实现 反向投影的直观理解 直方图反向投影的作用 2 所用到的主要OpenCv API /** @brief 计算(一个或多个)数组的直方图 */ void calcHist( const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, b

OpenCV2马拉松第10圈——直方图反向投影(back project)

收入囊中 灰度图像的反向投影 彩色图像的反向投影 利用反向投影做object detect 葵花宝典 什么是反向投影?事实上没有那么高大上! 在上一篇博文学到,图像能够获得自己的灰度直方图. 反向投影差点儿相同是逆过程,由直方图得到我们的投影图. 步骤例如以下: 依据模版图像,得到模版图像的灰度直方图. 对灰度直方图对归一化,归一化后是个概率分布,直方图的积分是1 依据概率分布的直方图,求输入图像的投影图,也就是对每个像素点,我们依据灰度值,能够得到其概率 得到的投影图是介于[0,1]之间的,为

OpenCV2马拉松第11圈——meanshift与直方图反向投影

收入囊中 meanshift图像聚类 meanshift object detect 葵花宝典 今天有点累,理论就讲少点吧T_T meanshift中文是均值飘逸,就是给定一个点,然后会移动到概率密度最大的地方. 对于图像,什么是概率密度最大? 我们可以定义很多要素: 距离 RGB HSV 下面我有个例子,就是用距离(x,y)和HSV(h,s,v)作图像聚类的. 于是我们有5个要素,当前点与其他点的距离,HSV越接近,则概率密度越高. 假定我们有一点(m,n),如何选择下一个点呢,如何在一个矩形

OpenCV —— 直方图与匹配

直方图就是对数据进行统计,将统计值组织到一系列事先定义好的bin中.bin中的数值是从数据中计算出来的特征的统计量,这些数据可以是诸如梯度,方向,色彩或任何其他特征. 直方图获得是是数据分布的统计图 直方图的基本数据结构 CvHistogram 创建一个新的直方图 cvCreateHist dims   直方图维数的数目 sizes  直方图维数尺寸的数组 type  直方图的表示格式: CV_HIST_ARRAY 意味着直方图数据表示为多维密集数组 CvMatND; CV_HIST_TREE

反向投影的工作原理

1.反向投影的作用是什么?    反向投影用于在输入图像(通常较大)中查找特定图像(通常较小或者仅1个像素,以下将其称为模板图像)最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置.2.反向投影工作原理    查找的方式就是不断的在输入图像中切割跟模板图像大小一致的图像块,并用直方图对比的方式与模板图像进行比较. 例如我们有一张100x100的输入图像,有一张10x10的模板图像,查找的过程是这样的:(1)从输入图像的左上角(0,0)开始,切割一块(0,0)至(10,10)的临时图像:(

OpenCV 直方图

OpenCV中有灰度直方图均衡化的函数equalizeHist ( InputArray src, OutputArray dst ) 只能处理单通道的灰色图像,对于彩色图像,需要把每个信道分别均衡化,再Merge为彩色图像. OpenCV函数 compareHist ()产生一个表达两个直方图的相似度的数值 要比较两个直方图(H1 and H2), 首先必须要选择一个衡量直方图相似度的对比标准  该函数提供了4种对比标准来计算相似度 1.Correlation ( CV_COMP_CORREL

《OpenCV:直方图应用:直方图均衡化,直方图匹配,对比直方图》

直方图均衡化 直方图均衡化(Histogram Equalization)是直方图最典型的应用,是图像点运算的一种.对于一幅输入图像,通过运算产生一幅输出图像,点运算是指输出图像的每个像素点的灰度值由输入像素点决定,即: 直方图均衡化是通过灰度变换将一幅图像转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数过程.从分布图上的理解就是希望原始图像中y轴的值在新的分布中尽可能的展开.变换过程是利用累积分布函数对原始分布进行映射,生成新的均匀拉伸的分布.因此对应每个点的操作是寻找原始分布

Opencv直方图计算是否需要Gpu加速?

众所周知,Gpu加速技术对图像处理具有很大的影响,在前面的博客中通过对比验证了Gpu加速技术对图像滤波的高效率.但是Gpu技术并不是万能的,本文通过比较发现Gpu计算直方图的效率并没有传统计算方法效率高.下面表格是对比结果,时间是通过运行20次求平均值而得,后面给出相应的比较代码.由结果可以看出Cpu计算直方图是运行效率更高,当对图片数据库进行训练时,如果有5000幅图片需要处理,采用Cpu计算方式可以节省75分钟左右的时间,节省的时间还是相当可观的. Gpu与Cpu计算直方图效率对比 方式 C

OpenCV——直方图均衡化(用于图像增强)

1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 #include <math.h> 4 5 using namespace cv; 6 using namespace std; 7 8 9 int main(int argc, char** argv) 10 { 11 Mat src,src_gray,dst; 12 //src = imread("3 input.bmp"); 13 s