zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Python-OpenCV图像处理-11-图像的直方图的反向投影

PythonOpencv图像处理 11 图像 反向 直方图 投影
2023-09-14 09:13:04 时间

直方图反向投影用于图像分割或查找图像中感兴趣的对象,简单来说,它会创建一个与输入图像大小相同(单个通道)的图像,其中每个像素对应于属于我们对象该像素的概率.输出图像将使我们感兴趣的对象比其余部分更明显.

首先,我们创建一个包含我们感兴趣对象的图像的直方图,对象应尽可能填充图像以获得更好的结果,颜色直方图比灰度直方图更受青睐,因为对象的颜色比灰度强度更能定义对象,然后我们将这个直方图“反投影”到我们需要找到对象的测试图像上.

实现的效果和nRange()函数对颜色进行捕捉类似

#直方图的反向投影
#基于直方图比较 多数在HSV色彩空间
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

def back_projection_demo():
    smaple = cv.imread("C:\\Users\\william\\Pictures\\4.png")
    target = cv.imread("C:\\Users\\william\\Pictures\\3.png")
    # roi是我们需要找到的对象或区域
    roi_hsv =cv.cvtColor(smaple,cv.COLOR_BGR2HSV)
    # target是我们搜索的图像
    target_hsv =cv.cvtColor(target,cv.COLOR_BGR2HSV)

    cv.imshow("smaple",smaple)
    cv.imshow("target",target)
    # 计算对象的直方图
    roiHist = cv.calcHist([roi_hsv],[0,1],None,[36,36],[0,180,0,256])
    # 标准化直方图,并应用投影
    cv.normalize(roiHist,roiHist,0,256,cv.NORM_MINMAX)
    dst = cv.calcBackProject([target_hsv],[0,1],roiHist,[0,180,0,256],1)
    cv.imshow("backprojection_demo",dst)

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

归一化函数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-范数。

 

反向投影用于在输入图像(通常较大)中查找特定图像(通常较小或者仅1个像素,以下将其称为模板图像)最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置。

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

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

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

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

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

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

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

def hist2d_demo(image):
    hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
    hist = cv.calcHist([image],[0,1],None,[180,256],[0,180,0,256])
    #cv.imshow("hist2d",hist)
    plt.imshow(hist,interpolation='nearest')
    plt.title("2D_Histogram")
    plt.show()
src =cv.imread("C:\\Users\\william\\Pictures\\go.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
back_projection_demo()
cv.waitKey(0)
cv.destroyAllWindows()

cv2.calcHist()
原型为:calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) -> hist

images参数表示输入图像,传入时应该用中括号[ ]括起来

channels参数表示传入图像的通道,如果是灰度图像,那就不用说了,只有一个通道,值为0,如果是彩色图像(有3个通道),那么值为0,1,2,中选择一个,对应着BGR各个通道。这个值也得用[ ]传入。

mask参数表示掩膜图像。如果统计整幅图,那么为None。主要是如果要统计部分图的直方图,就得构造相应的掩膜来计算。

histSize参数表示灰度级的个数,需要中括号,比如[256]

ranges参数表示像素值的范围,通常[0,256]。此外,假如channels为[0,1],ranges为[0,256,0,180],则代表0通道范围是0-256,1通道范围0-180。