【OpenCV入门学习--python】直方图反向投射

例子源于OpenCV官网–直方图反向投射
(https://docs.opencv.org/4.x/da/d7f/tutorial_back_projection.html)
使用OpenCV函数cv::calcBackProject计算反向投影
使用OpenCV函数cv::mixChannels混合图像的不同通道

下述代码的功能:
1.加载一个图像
2.将原始文件转换为HSV格式,并只分离用于直方图的Hue通道(使用OpenCV函数cv::mixChannels)
3.让用户输入要在直方图计算中使用的bin数量。
4.计算同一图像的直方图(如果bin变化则更新它)和反向投影。
5.在窗口中显示反向投影和直方图。

代码:

#直方图反向投射(Back Projection)
from __future__ import print_function
from __future__ import division
import cv2 as cv
import numpy as np
import argparse
def Hist_and_Backproj(val):
    
    
    #初始化cv::calcHist所需的参数。bin的数量来自Trackbar:
    bins = val
    histSize = max(bins, 2)
    ranges = [0, 180] # hue_range
    
    #计算直方图,并将其归一化到范围[0,255]
    hist = cv.calcHist([hue], [0], None, [histSize], ranges, accumulate=False)
    cv.normalize(hist, hist, alpha=0, beta=255, norm_type=cv.NORM_MINMAX)#归一化
    
    #计算反向投影图像-calcBackProject,即通过调用函数cv::calcBackProject获得相同图像的反向投影
    backproj = cv.calcBackProject([hue], [0], hist, ranges, scale=1)
    
    """
    所有参数都是已知的(与计算直方图相同),
    只有我们添加了backproj矩阵,它将存储源图像的反投影(&色相)
    显示backproj:
    """
    cv.imshow('BackProj', backproj)
    
    #绘制图像的1-D Hue直方图:
    w = 400
    h = 400
    bin_w = int(round(w / histSize))
    histImg = np.zeros((h, w, 3), dtype=np.uint8)
    for i in range(bins):
        cv.rectangle(histImg, (i*bin_w, h), ( (i+1)*bin_w, h - int(np.round( hist[i]*h/255.0 )) ), (0, 0, 255), cv.FILLED)
    cv.imshow('Histogram', histImg)
    
    
#读取输入图像:    
parser = argparse.ArgumentParser(description='Code for Back Projection tutorial.')
parser.add_argument('--input', help='Path to input image.', default='Base_0.png')
args = parser.parse_args()
src = cv.imread(cv.samples.findFile(args.input))
if src is None:
    print('Could not open or find the image:', args.input)
    exit(0)
    
#将图像从RGB色彩空间转换到HSV色彩空间cvtColor:    
hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)

#分割出hue通道mixChannels
ch = (0, 0)
hue = np.empty(hsv.shape, hsv.dtype)
cv.mixChannels([hsv], [hue], ch)
"""
使用cv::mixChannels函数从hsv图像中只获取通道0 (Hue)。它获得以下参数:
&hsv:将从其中复制通道的源数组
1:源阵列个数
&hue:复制通道的目标数组
1:目标阵列个数
ch[] ={0,0}:指示如何复制通道的索引对数组。在本例中,将&hsv的Hue(0)通道复制到&hue的0通道(1通道)
1:索引对数
"""
#为用户创建一个Trackbar来输入bin值。Trackbar上的任何更改都意味着调用Hist_and_Backproj回调函数。
window_image = 'Source image'
cv.namedWindow(window_image)
bins = 25
cv.createTrackbar('* Hue  bins: ', window_image, bins, 180, Hist_and_Backproj )
Hist_and_Backproj(bins)

#显示图像并等待用户退出程序:
cv.imshow(window_image, src)
cv.waitKey()

运行结果:

原图:

在这里插入图片描述

直方图反向投射:
在这里插入图片描述

直方图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值