• 005 OpenCV直方图


    目录

    一、环境

    二、直方图原理概述

    三、代码


    一、环境

    本文使用环境为:

    • Windows10
    • Python 3.9.17
    • opencv-python 4.8.0.74

    二、直方图原理概述

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

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

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

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

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

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

    最简代码:

    1. from __future__ import print_function
    2. import cv2 as cv
    3. import argparse
    4. parser = argparse.ArgumentParser(description='Code for Histogram Equalization tutorial.')
    5. parser.add_argument('--input', help='Path to input image.', default='lena.jpg')
    6. args = parser.parse_args()
    7. src = cv.imread(cv.samples.findFile(args.input))
    8. if src is None:
    9. print('Could not open or find the image:', args.input)
    10. exit(0)
    11. src = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    12. dst = cv.equalizeHist(src)
    13. cv.imshow('Source image', src)
    14. cv.imshow('Equalized Image', dst)
    15. cv.waitKey()

    三、代码

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

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

    完整代码:

    1. from __future__ import print_function
    2. from __future__ import division
    3. import cv2 as cv
    4. import numpy as np
    5. import argparse
    6. def Hist_and_Backproj(val):
    7. bins = val
    8. histSize = max(bins, 2)
    9. ranges = [0, 180]
    10. ## 获取直方图并归一化
    11. hist = cv.calcHist([hue], [0], None, [histSize], ranges, accumulate=False)
    12. cv.normalize(hist, hist, alpha=0, beta=255, norm_type=cv.NORM_MINMAX)
    13. backproj = cv.calcBackProject([hue], [0], hist, ranges, scale=1)
    14. cv.imshow('BackProj', backproj)
    15. w = 400
    16. h = 400
    17. bin_w = int(round(w / histSize))
    18. histImg = np.zeros((h, w, 3), dtype=np.uint8)
    19. for i in range(bins):
    20. 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)
    21. cv.imshow('Histogram', histImg)
    22. ## 读取图片
    23. parser = argparse.ArgumentParser(description='Code for Back Projection tutorial.')
    24. parser.add_argument('--input', help='Path to input image.', default='data/home.jpg')
    25. args = parser.parse_args()
    26. src = cv.imread(cv.samples.findFile(args.input))
    27. if src is None:
    28. print('Could not open or find the image:', args.input)
    29. exit(0)
    30. ## 彩色图转到HSV空间
    31. hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)
    32. ch = (0, 0)
    33. hue = np.empty(hsv.shape, hsv.dtype)
    34. # 由于ch=(0, 0),所有这里就是:将hsv的0通道复制到hue的0通道
    35. cv.mixChannels([hsv], [hue], ch)
    36. ## 创建滑条
    37. window_image = 'Source image'
    38. cv.namedWindow(window_image)
    39. bins = 25
    40. cv.createTrackbar('* Hue bins: ', window_image, bins, 180, Hist_and_Backproj )
    41. Hist_and_Backproj(bins)
    42. ## 可视化
    43. cv.imshow(window_image, src)
    44. cv.waitKey()

  • 相关阅读:
    08 【爬虫】
    CopyOnWriteArrayList解析
    Monaco Editor教程(四):设置或获取内容,并监听内容的改变
    简单实用的模糊照片修复方法,小白也能轻松上手
    学习servlet【续】
    SAP UI5 表格数据如何导出成 Excel 文件(Table Export As Excel)
    【动手学深度学习】--循环神经网络
    【samba】Ubuntu20.04安装并配置Samba服务
    程序员关于技术应当如何做好职业规划的问题?
    父工程导入了spring-boot-dependencies依赖,子工程在引用spring-boot-dependencies中的依赖的时候,引用不到
  • 原文地址:https://blog.csdn.net/m0_72734364/article/details/134512036