OpenCV学习Day05--2D直方图、直方图反向投影

旧巷老猫 提交于 2019-11-27 06:00:17
#直方图反向投影
'''
反向投影可以通过颜色直方图来理解,我们检测图像中某个像素点的颜色是否位于直方图中,如果位于则将颜色加亮,
通过对图像的检测,得出结果图像,结果图像一定和直方图像匹配。那么对于图像颜色的取样点越多,越能更好的找出目标图形。
这里直方图的作用在于提供一个比较标准(也就是模版),即对于要检测的图像来说,需要给它提供一个模版,用于识别出和模版
相应的特征。
'''
import cv2 as cv
import numpy as np
import matplotlib as mpl
mpl.use('TkAgg')
from matplotlib import pyplot as plt
def backProjectionDemo():
    sample=cv.imread("E:\OpenCVTests\QQ20190813185411.png")#读取样本与目标图像,并将其转换为HSV色彩模式
    target=cv.imread("E:\OpenCVTests\IMG_4686.JPG")
    spHSV=cv.cvtColor(sample,cv.COLOR_BGR2HSV)
    tarHSV=cv.cvtColor(target,cv.COLOR_BGR2HSV)
    cv.imshow("sample",sample)
    cv.imshow("target", target)

    spHist=cv.calcHist([spHSV],[0,1],None,[32,32],[0,180,0,256])#得出样本直方图,第四个参数调节细分度,越小查找的越精细
    cv.normalize(spHist,spHist,0,255,cv.NORM_MINMAX)#直方图归一化,映射到0-255,方可调用下一行API
    #反向投影生成
    dst=cv.calcBackProject([tarHSV],[0,1],spHist,[0,180,0,256],1)#1代表不放大或者缩小
    cv.imshow("backProjectDemo",dst)

def hist2Ddemo(image):#首先要建立2D直方图
    hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV)#将其转化为HSV模式
    hist=cv.calcHist([image],[0,1],None,[180,256],[0,180,0,256])#本次绘制的直方图为两条通道,则每个应对应两条信息
    '''
    注意:   一维直方图:只考虑图像的一个特征,灰度值
            二维直方图:考虑每个的颜色(Hue)和饱和度(Saturation)
        images参数表示输入图像,传入时应该用中括号[ ]括起来
        channels=[0, 1] 因为我们需要同时处理 H 和 S 两个通道
        mask参数表示掩膜图像。如果统计整幅图,那么为None。主要是如果要统计部分图的直方图,就得构造相应的掩膜来计算。
        bins=[180, 256]H 通道为 180, S 通道为 256
        range=[0, 180, 0, 256]H 的取值范围在 0 到 180, S 的取值范围在 0 到 256
    '''
    #cv.imshow("Hist",hist)#====我们得到结果是一个 180x256 的两维数组。
    # 所以我们可以使用函数 cv2.imshow() 来显示它。但是这是一个灰度图,除非我们知道不同颜色 H 通道的值,否则我们根本就不知道那到底代表什么颜色。
    plt.imshow(hist,interpolation='nearest')#第二个参数为差值方式,此处设为临近点方式
    plt.title("2D Histgram")
    plt.show()
#src=cv.imread("E:\OpenCVTests\IMG_4482.JPG")
#cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
#cv.imshow("input image",src)
#hist2Ddemo(src)
backProjectionDemo()

cv.waitKey(0)
cv.destroyAllWindows()

引用OpenCV库得到的直方图引用matplotlib库得到的2D直方图,更为直观,清晰
直方图反向投影图

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!