005 OpenCV直方图

目录

一、环境

二、直方图原理概述

三、代码


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、直方图原理概述

OpenCV是一个广泛使用的开源计算机视觉库,它提供了许多用于图像处理和分析的函数和算法。其中,直方图是一种常用的图像分析工具,它可以用来描述图像的像素值分布情况。OpenCV提供了多种直方图函数,可以生成各种类型的直方图,包括灰度直方图、彩色直方图、积分直方图等。

灰度直方图是描述图像亮度分布的直方图。它显示了每个像素值出现的频率,横轴表示像素值,纵轴表示频率。灰度直方图可以帮助我们了解图像的亮度分布情况,例如图像的对比度和亮度是否合适,是否存在过曝或欠曝等问题。

彩色直方图是描述图像颜色分布的直方图。它显示了每个颜色通道的像素值分布情况,横轴表示像素值,纵轴表示频率。彩色直方图可以帮助我们了解图像的颜色分布情况,例如图像的主要颜色和色彩平衡是否合适,是否存在颜色偏差等问题。

积分直方图是一种扩展了直方图概念的函数,它不仅可以描述像素值的分布情况,还可以描述像素值的累积分布情况。积分直方图的横轴表示像素值,纵轴表示该像素值以下的所有像素值的频率之和。积分直方图可以帮助我们了解图像的整体分布情况,例如图像的整体亮度分布和颜色分布是否合适。

OpenCV中生成直方图的函数包括calcHistcalcHist的改进版本calcHistcompareHist等。其中,calcHist函数可以计算一维或二维直方图,可以应用于灰度图像或彩色图像的直方图计算。compareHist函数可以比较两个直方图,用于识别和比较不同图像的直方图。此外,OpenCV还提供了其他一些函数和算法,例如直方图均衡化、直方图规定化等,可以进一步扩展直方图的应用范围。

总的来说,OpenCV的直方图功能非常强大且灵活,可以应用于各种不同的计算机视觉任务中。通过使用OpenCV的直方图函数和算法,我们可以更好地理解和分析图像数据,提高计算机视觉系统的性能和准确性。

最简代码:

from __future__ import print_function
import cv2 as cv
import argparse

parser = argparse.ArgumentParser(description='Code for Histogram Equalization tutorial.')
parser.add_argument('--input', help='Path to input image.', default='lena.jpg')
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)
src = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
dst = cv.equalizeHist(src)
cv.imshow('Source image', src)
cv.imshow('Equalized Image', dst)
cv.waitKey()

三、代码

OpenCV提供了用于计算数组集(通常是图像或分割后的通道)直方图的函数calcHist,该函数支持最高达32维的直方图。在调用calcHist函数时,需要传入一些参数,包括:

  • images:输入数组,通常为图像;
  • channels:指定要计算直方图的通道;如果设置为0,则表示计算所有通道的直方图;
  • mask:掩码图像;
  • histSize:用于表示直方图大小的整数或浮点数;如果设置为整型值(如[16, 16]),则两个值分别代表直方图的高度和宽度。如果是浮点型值(如[16.0, 16.0]),则两个值必须相同且代表直方图的直径;
  • ranges:像素值范围;
  • hist:输出数组;
  • accumulate:布尔类型,用于设置是否将结果累积到输出数组中。

完整代码:

from __future__ import print_function
from __future__ import division
import cv2 as cv
import numpy as np
import argparse

def Hist_and_Backproj(val):
    bins = val
    histSize = max(bins, 2)
    ranges = [0, 180]
    ## 获取直方图并归一化
    hist = cv.calcHist([hue], [0], None, [histSize], ranges, accumulate=False)
    cv.normalize(hist, hist, alpha=0, beta=255, norm_type=cv.NORM_MINMAX)
    backproj = cv.calcBackProject([hue], [0], hist, ranges, scale=1)
    cv.imshow('BackProj', backproj)
    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='data/home.jpg')
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)
## 彩色图转到HSV空间
hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)
ch = (0, 0)
hue = np.empty(hsv.shape, hsv.dtype)
# 由于ch=(0, 0),所有这里就是:将hsv的0通道复制到hue的0通道
cv.mixChannels([hsv], [hue], ch)
## 创建滑条
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()

005 OpenCV直方图_第1张图片

你可能感兴趣的:(OpenCV,opencv,计算机视觉)