OpenCV CUDA模块直方图计算------在 GPU 上计算图像直方图的函数calcHist()
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
OpenCV 的 CUDA 模块 中用于在 GPU 上计算图像直方图的一个函数。
计算单通道 8-bit 图像的灰度直方图(Histogram)。
该函数在 GPU 上执行,适用于加速大规模图像处理任务中的直方图统计操作。
函数原型
void cv::cuda::calcHist
(InputArray src,OutputArray hist,Stream & stream = Stream::Null()
)
参数
- src 源图像,类型为 CV_8UC1(即单通道、8位无符号整型图像)。
- hist 目标直方图,具有 1 行、256 列,类型为 CV_32SC1(即单通道、32位有符号整型)。
- stream 用于异步执行的流(Stream),可实现与主机的异步操作。
注意事项
✅ 仅支持单通道 8-bit 图像(如 CV_8UC1),不支持多通道或浮点图像。
✅ 输出直方图大小固定为 256,每个元素表示对应灰度值出现的次数。
✅ 支持 CUDA 异步流(Stream)操作,可用于流水线优化。
⚠️ 如果输入图像不是灰度图,请先进行转换:
使用场景
适合需要快速获取图像灰度分布的场合,例如:
- 图像增强前的分析
- 直方图均衡化准备步骤
- 图像分割、阈值选取等预处理阶段
- 实时视频处理中统计帧信息
代码示例
#include <iostream>
#include <opencv2/cudaimgproc.hpp> // 包含 cuda::calcHist
#include <opencv2/opencv.hpp>int main()
{// 读取灰度图像cv::Mat img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_GRAYSCALE );if ( img.empty() ){std::cerr << "无法加载图像" << std::endl;return -1;}// 将图像上传到 GPUcv::cuda::GpuMat d_img;d_img.upload( img );// 创建输出直方图 Mat(256 个 bin)cv::cuda::GpuMat d_hist;d_hist.create( 256, 1, CV_32F ); // 浮点类型// 计算直方图cv::cuda::calcHist( d_img, d_hist );cv::Mat hist;d_hist.download( hist ); // 下载到 CPU// 转换为整型cv::Mat histInt;hist.convertTo( histInt, CV_32S ); // CV_32S 表示 32位有符号整型// 打印有效数据for ( int i = 0; i < 256; ++i ){int count = static_cast< int >( histInt.at< int >( i ) );if ( count > 0 )std::cout << "灰度值 " << i << ": " << count << " 个像素" << std::endl;}return 0;
}
运行结果
灰度值 39: 45 个像素
灰度值 43: 388 个像素
灰度值 46: 1171 个像素
灰度值 50: 2211 个像素
灰度值 53: 3583 个像素
灰度值 56: 5472 个像素
灰度值 59: 6460 个像素
灰度值 61: 5922 个像素
灰度值 64: 5104 个像素
灰度值 66: 4325 个像素
灰度值 68: 3100 个像素
灰度值 70: 2479 个像素
灰度值 72: 2093 个像素
灰度值 74: 1730 个像素
灰度值 76: 1566 个像素
灰度值 78: 1469 个像素
灰度值 80: 1377 个像素
灰度值 82: 1345 个像素
灰度值 84: 1335 个像素
灰度值 85: 1367 个像素
灰度值 87: 1416 个像素
灰度值 89: 1479 个像素
灰度值 90: 1468 个像素
灰度值 92: 1465 个像素
灰度值 93: 1438 个像素
灰度值 95: 1328 个像素
灰度值 96: 1431 个像素
灰度值 98: 1465 个像素
灰度值 99: 1504 个像素
灰度值 101: 1522 个像素
灰度值 102: 1564 个像素
灰度值 103: 1605 个像素
灰度值 105: 1674 个像素
灰度值 106: 1604 个像素
灰度值 107: 1741 个像素
灰度值 109: 1774 个像素
灰度值 110: 2021 个像素
灰度值 111: 2398 个像素
灰度值 112: 2598 个像素
灰度值 114: 2673 个像素
灰度值 115: 2588 个像素
灰度值 116: 2403 个像素
灰度值 117: 2126 个像素
灰度值 118: 2027 个像素
灰度值 119: 1730 个像素
灰度值 120: 1676 个像素
灰度值 122: 1554 个像素
灰度值 123: 1522 个像素
灰度值 124: 1510 个像素
灰度值 125: 1529 个像素
灰度值 126: 1579 个像素
灰度值 127: 1536 个像素
灰度值 128: 1603 个像素
灰度值 129: 1542 个像素
灰度值 130: 1719 个像素
灰度值 131: 1795 个像素
灰度值 132: 1851 个像素
灰度值 133: 1796 个像素
灰度值 134: 1919 个像素
灰度值 135: 1916 个像素
灰度值 136: 2022 个像素
灰度值 137: 2198 个像素
灰度值 138: 2409 个像素
灰度值 139: 2650 个像素
灰度值 140: 2626 个像素
灰度值 141: 2629 个像素
灰度值 142: 2685 个像素
灰度值 143: 2411 个像素
灰度值 144: 4435 个像素
灰度值 145: 1980 个像素
灰度值 146: 1930 个像素
灰度值 147: 1925 个像素
灰度值 148: 1939 个像素
灰度值 149: 2058 个像素
灰度值 150: 2237 个像素
灰度值 151: 4821 个像素
灰度值 152: 2411 个像素
灰度值 153: 2506 个像素
灰度值 154: 2411 个像素
灰度值 155: 2507 个像素
灰度值 156: 4627 个像素
灰度值 157: 2240 个像素
灰度值 158: 2277 个像素
灰度值 159: 2346 个像素
灰度值 160: 4692 个像素
灰度值 161: 2352 个像素
灰度值 162: 2221 个像素
灰度值 163: 2278 个像素
灰度值 164: 4174 个像素
灰度值 165: 1798 个像素
灰度值 166: 1729 个像素
灰度值 167: 2888 个像素
灰度值 168: 1316 个像素
灰度值 169: 1285 个像素
灰度值 170: 2222 个像素
灰度值 171: 1066 个像素
灰度值 172: 1035 个像素
灰度值 173: 1955 个像素
灰度值 174: 1012 个像素
灰度值 175: 1883 个像素
灰度值 176: 941 个像素
灰度值 177: 998 个像素
灰度值 178: 1969 个像素
灰度值 179: 990 个像素
灰度值 180: 1979 个像素
灰度值 181: 971 个像素
灰度值 182: 1816 个像素
灰度值 183: 836 个像素
灰度值 184: 1502 个像素
灰度值 185: 651 个像素
灰度值 186: 1097 个像素
灰度值 187: 538 个像素
灰度值 188: 1020 个像素
灰度值 189: 487 个像素
灰度值 190: 886 个像素
灰度值 191: 458 个像素
灰度值 192: 1036 个像素
灰度值 193: 532 个像素
灰度值 194: 1093 个像素
灰度值 195: 1145 个像素
灰度值 196: 595 个像素
灰度值 197: 1227 个像素
灰度值 198: 628 个像素
灰度值 199: 1176 个像素
灰度值 200: 1129 个像素
灰度值 201: 595 个像素
灰度值 202: 1098 个像素
灰度值 203: 1009 个像素
灰度值 204: 527 个像素
灰度值 205: 999 个像素
灰度值 206: 1066 个像素
灰度值 207: 1124 个像素
灰度值 208: 616 个像素
灰度值 209: 1249 个像素
灰度值 210: 1236 个像素
灰度值 211: 598 个像素
灰度值 212: 1139 个像素
灰度值 213: 1145 个像素
灰度值 214: 947 个像素
灰度值 215: 835 个像素
灰度值 216: 319 个像素
灰度值 217: 567 个像素
灰度值 218: 452 个像素
灰度值 219: 411 个像素
灰度值 220: 364 个像素
灰度值 221: 296 个像素
灰度值 222: 142 个像素
灰度值 223: 225 个像素
灰度值 224: 213 个像素
灰度值 225: 133 个像素
灰度值 226: 94 个像素
灰度值 227: 59 个像素
灰度值 228: 56 个像素
灰度值 229: 41 个像素
灰度值 230: 28 个像素
灰度值 231: 14 个像素
灰度值 232: 10 个像素
灰度值 233: 6 个像素
灰度值 234: 8 个像素
灰度值 236: 1 个像素
灰度值 238: 1 个像素
灰度值 242: 2 个像素
灰度值 245: 2 个像素