opencv学习系列——绘制给定图片的直方图分布

本文介绍了如何使用OpenCV进行图像直方图的绘制与均衡化。首先,通过calcHist函数计算多通道图片的单通道直方图,并展示了不同通道的直方图分布。接着,探讨了直方图均衡化的作用,即拉伸像素强度分布,提高图像对比度,以增强图像细节。文中对比了均衡化前后图像的效果,包括灰度图像和彩色图像。
摘要由CSDN通过智能技术生成

绘制给定图片的直方图分布

(代码在文末~~)

直方图显示

(1)先不考虑第四通道,给定一张3通道的图片,首先把多通道图片分成单通道,对每个通道计算直方图。计算直方图直接调用cv中的calcHist函数:
calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false )
(2)这里使用一张颜色比较丰富的图片为例:在这里插入图片描述

(3)得到各个通道的直方图如下所示:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

(4)三个通道的直方折线图放在一起如下所示:
在这里插入图片描述

直方图均值化

(5)直方图应用——直方图均值化
直方图均衡化是通过拉伸像素强度的分布范围,使得在0~255灰阶上的分布更加均衡,提高了图像的对比度,达到改善图像主观视觉效果的目的。对比度较低的图像适合使用直方图均衡化方法来增强图像细节。

灰色图像对比:
原始:
在这里插入图片描述
均值化后:
在这里插入图片描述
彩色
均值化前:
在这里插入图片描述
均值化后:
在这里插入图片描述
但是这种处理会产生过度曝光的效果:

在这里插入图片描述在这里插入图片描述

//彩色图像直方图均衡化

#include<opencv2/opencv.hpp>
#include<iostream>
#include<cmath>

using namespace cv;
using namespace std;

const char* output = "histogram iamge";

int main(int argc, char* argv)
{
   
	Mat src, dst, dst1;
	src = imread("D:\\picture\\scene.jpg");
	if (!src.data)
	{
   
		printf("could not load image...\n");
		return -1;
	}
	char input[] = "input image";
	namedWindow(input, 0);
	namedWindow(output, 0);
	resizeWindow(input, 600, 400);
	imshow(input, src);

	//分割通道
	vector<Mat>channels;
	split(src, channels);

	Mat blue, green, red;
	blue = channels.at(0);
	green = channels.at(1);
	red = channels.at(2);
	//分别对BGR通道做直方图均衡化
	equalizeHist(blue, blue);
	equalizeHist(green, green);
	equalizeHist(red, red
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值