【OpenCV + VS】直方图与模糊操作
在图像处理中,直方图是分析图像亮度、色彩分布的核心工具,而模糊操作则是降噪、平滑图像的基础手段。这篇教程将结合完整可运行的OpenCV代码,详细拆解1D直方图绘制、2D直方图分析、直方图均衡化以及三种常用模糊算法的原理与实现,从代码逐行解读到实际应用场景。

一、为什么这些操作很重要?
明确每个功能的核心作用:
- 直方图(1D/2D):将图像像素值的分布可视化,1D直方图聚焦单通道(如BGR)的亮度分布,2D直方图可分析色彩组合(如HSV的色相-饱和度),常用于图像分割、曝光调整等场景。
- 直方图均衡化:通过调整像素分布,增强图像对比度,解决暗部细节不清晰、图像偏暗等问题,是图像增强的基础方法。
- 模糊操作:通过卷积运算降低图像噪声,平滑细节。不同模糊算法的区别在于“保留边缘能力”和“降噪效果”的平衡——普通模糊降噪强但边缘模糊,双边模糊能在降噪的同时保留边缘。
二、代码结构
代码包含6个核心功能函数+1个主函数:
// 头文件与命名空间
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;// 1. 1D三通道直方图绘制
void Histogram_demo(Mat& image);
// 2. 2D(HSV)直方图绘制
void Histogram_2d_demo(Mat& image);
// 3. 直方图均衡化(灰度图)
void histogram_eq_demo(Mat& image);
// 4. 普通均值模糊
void blur_demo(Mat& image);
// 5. 高斯模糊
void gaussian_blur_demo(Mat& image);
// 6. 双边模糊
void bifilter_demo(Mat& image);// 主函数:读取图像+调用所有功能
int main() { ... }
三、逐函数拆解:原理+代码+细节
(一)1D直方图:可视化三通道像素分布(Histogram_demo)
核心作用
将BGR图像的蓝、绿、红三个通道,分别统计0~255像素值的出现次数,用三条曲线可视化,直观看到图像的色彩分布(如红色多则红色曲线偏高)。
代码逐行解读
void Histogram_demo(Mat& image) {// 1. 三通道分离:将BGR图像拆成3个单通道图像vector<Mat> bgr_plane; // 存储三个单通道的容器split(image, bgr_plane); // split(输入图像, 输出容器):bgr_plane[0]=B通道,[1]=G通道,[2]=R通道// 2. 直方图计算参数设置(关键!)const int channels[] = { 0 }; // 计算单通道直方图,通道索引为0(每个单通道独立计算)const int bins[] = { 256 }; // 分箱数:0~255共256个像素值,每个值对应一个"箱"float hranges[] = { 0, 255 }; // 像素值统计范围:只统计0到255(8位图像的全部范围)const float* ranges[] = { hranges }; // 指向范围数组的指针(calcHist要求参数格式)// 3. 存储三个通道的直方图结果(Mat类型,1行256列,float型)Mat b_hist, g_hist, r_hist;// 4. 计算直方图:calcHist是OpenCV核心函数// 参数说明:输入图像指针、图像数量、通道索引、掩码(Mat()表示无掩码)、输出直方图、// 直方图维度(1D)、分箱数、像素范围、是否均匀分布、是否累积calcHist(&bgr_plane[0], 1, channels, Mat(), b_hist, 1, bins, ranges);calcHist(&bgr_plane[1], 1, channels, Mat(), g_hist, 1, bins, ranges);calcHist(&bgr_plane[2], 1, channels, Mat(), r_hist, 1, bins, ranges);// 5. 准备直方图绘制的空白图像int hist_w = 512; // 直方图图像宽度(像素)int hist_h = 400; 