【OpenCV_08】直方图均衡化Histogram Equalization

原创 2016年05月31日 19:40:04

直方图 Histogram


这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。

通过这种方法,亮度可以更好地在直方图上分布。

这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。

这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。

这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。



E.G -参见下图,这里位深为2,所以每个像素的位深为0 到 3.

Sample Image (Depth = 2 bits)

直方图是表现了每个像素值分布。可以看到上图5个像素值为0,7个像素值为1,9个像素值为2,4个像素值为3。

这些信息的分布如下

用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数


图像的直方图通常表示为如下图的就是上面图的直方图

图像直方图

直方图均衡化


直方图均衡被定义为均衡的图像的强度分布或压扁的强度分布曲线。

直方图均衡是用来改善图像的对比度。上述图像的直方图均衡化理想状况如下图。


直方图均衡化
上图是理想状况,实际上,达到完美的直方图均衡化是不可能的。可以接近完美实现直方图均衡。

在OpenCV中,有一个内置的OpenCV函数来均衡直方图。


灰度图像直方图均衡化


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main( int argc, const char** argv )
{
     Mat img = imread("C:/MyPic.JPG", CV_LOAD_IMAGE_COLOR); //open and read the image

     if (img.empty())
     {
          cout << "Image cannot be loaded..!!" << endl;
          return -1;
     }

     cvtColor(img, img, CV_BGR2GRAY); //change the color image to grayscale image

     Mat img_hist_equalized;
     equalizeHist(img, img_hist_equalized); //equalize the histogram

     //create windows
     namedWindow("Original Image", CV_WINDOW_AUTOSIZE);
     namedWindow("Histogram Equalized", CV_WINDOW_AUTOSIZE);

     //show the image
     imshow("Original Image", img);
     imshow("Histogram Equalized", img_hist_equalized);

     waitKey(0); //wait for key press

     destroyAllWindows(); //destroy all open windows

     return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////




新的OpenCV函数

  • void cvtColor( InputArray src, OutputArray dst, int code, int dstCn=0 )

这个函数是将图像从一个色彩空间变换到另外一个色彩空间。OpenCV一般是以BGR色彩空间的形式载入。

上例中, 欲把图像变换到灰度空间中。采用CV_BGR2GRAY为第3参数。如果想转换到HSV色彩空间需要用CV_BGR2HSV作为参数

下面是对上面函数的每个参数简单说明:

  • InputArray src- 输入图像(8或16位深无符号整形或者32为浮点型图像)
  • OutputArray dst - 输出图像(与输入图像大小及位深一致)
  • int code- 是一个掩码,表示由src到dst之间是怎么转的,比如是彩色转为灰度,还是彩色转为HSI模式;
    • CV_BGR2HSV
    • CV_HSV2BGR
    • CV_RGB2HLS
    • CV_HLS2RGB
    • CV_BGR2GRAY
    • CV_GRAY2BGR
  • int dstCn - 最后的dstCn表示dst图像的波段数,这个值默认是0,它可以从参数code中推断。通道数,默认为0的时候,目标图像通道数自动从源图像继承以及色彩空间。初学者推荐设置为默认值。

  • void equalizeHist( InputArray src, OutputArray dst )

这个函数是单通道图像的直方图(灰度图)。

通过均衡化直方图,亮度归一化。其结果是,对比度得到提高。

  • InputArray src - 8位深单通道图像
  • OutputArray dst - 输出的图像与输入图像大小与数据类型相同(应和源图像大小及位深一致)

彩色图片直方图均衡化



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main( int argc, const char** argv )
{
       Mat img = imread("MyPic.JPG", CV_LOAD_IMAGE_COLOR); //open and read the image

       if (img.empty()) //if unsuccessful, exit the program
       {
            cout << "Image cannot be loaded..!!" << endl;
            return -1;
       }

       vector<Mat> channels; 
       Mat img_hist_equalized;

       cvtColor(img, img_hist_equalized, CV_BGR2YCrCb); //change the color image from BGR to YCrCb format

       split(img_hist_equalized,channels); //split the image into channels

       equalizeHist(channels[0], channels[0]); //equalize histogram on the 1st channel (Y)

   merge(channels,img_hist_equalized); //merge 3 channels including the modified 1st channel into one image

      cvtColor(img_hist_equalized, img_hist_equalized, CV_YCrCb2BGR); //change the color image from YCrCb to BGR format (to display image properly)

       //create windows
       namedWindow("Original Image", CV_WINDOW_AUTOSIZE);
       namedWindow("Histogram Equalized", CV_WINDOW_AUTOSIZE);

       //show the image
       imshow("Original Image", img);
       imshow("Histogram Equalized", img_hist_equalized);

       waitKey(0); //wait for key press

       destroyAllWindows(); //destroy all open windows

       return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////





新OpenCV函数


  • cvtColor(img, img_hist_equalized, CV_BGR2YCrCb)

    把'img'的BGR色彩空间变换到YCrCb色彩空间保存到'img_hist_equalized'.


  • void split(const Mat& m, vector<Mat>& mv )

    有些时候处理多通道图像时不是很方便,在这种情况下,可以利用split() 分别复制每个通道到多个单通道图像,如果需要,split()函数将复制m(即源多通道图像)的各个通道到图像vector里 'mv'。用法很简单,src 是一幅多通道的图像。 mv 保存各个通道,每个通道存放到一个 mat 中。

参数表
  • const Mat& m - 输入的多通道图像。
  •  vector<Mat>& mv - mv保存各个通道,每个通道存放到一个 mat 中

  • equalizeHist(channels[0], channels[0]);
用来使灰度图象直方图均衡化。

  • 第一个参数--输入的 8-比特 单信道图像 
  • 第二个参数--输出的图像与输入图像大小与数据类型相同
  • 只对第一个通道感兴趣 (Y) ,因为此通道代表了强度。而其他两个通道(Cr 及 Cb)代表颜色。所以采用OpenCV内置函数'equalizeHist(..)' 把第一个通道直方图均衡化,而其他另外俩通道不便保持不变。

  • void merge(const vector<Mat>& mv, OutputArray dst )
merge 与split 函数相反。可以将多个单通道图像合成一幅多通道图像。 

功能是将多个单通道图像合并为单个多通道图像。

参数表

  • const vector<Mat>& mv - 向量是多通道。所有的通道的图像大小以及位深必须一致。
  • OutputArray dst - 存储多通道图像


版权声明:本文为博主原创文章,未经博主允许不得转载。

OpenCV,常用图像增强算法的实现

原文地址 http://blog.csdn.net/kezunhai/article/details/41553097 好资料,没收了!!! 1、对数图像增强算法       对数图像增强是图像...
  • EbowTang
  • EbowTang
  • 2016年11月25日 13:49
  • 8753

数字图像处理-----直方图均衡化

直方图均衡化(Histogram Equalization) 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等。这样,原来直方图中间的峰顶部分对...
  • ranjiewen
  • ranjiewen
  • 2016年09月20日 14:13
  • 594

灰度图像--图像增强 直方图均衡化(Histogram equalization)

直方图均衡,直方图均衡原理,直方图均衡分析
  • TonyShengTan
  • TonyShengTan
  • 2015年02月03日 15:12
  • 6529

openCV—Python(8)—— 图像直方图及其直方图均衡化

一、函数简介1、calcHist—计算图像直方图函数原型:calcHist(images, channels, mask, histSize, ranges, hist=None, accumulat...
  • jnulzl
  • jnulzl
  • 2015年07月31日 16:02
  • 4602

OpenCV-Python教程(10、直方图均衡化)

相比C++而言,Python适合做原型。本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处。这篇文章介绍在Python中使用OpenCV和NumP...
  • sunny2038
  • sunny2038
  • 2013年07月25日 13:01
  • 20017

Opencv3.0-python的那些事儿:(八)、Opencv的直方图均衡化

# coding: utf-8 import numpy as np import cv2 from matplotlib import pyplot as plt ''' 第22章: 直方图 直方图...
  • qingyuanluofeng
  • qingyuanluofeng
  • 2016年06月06日 11:53
  • 1212

Python OpenCV -- 直方图均衡化(十三)

直方图均衡化     直方图是图像中像素强度分布的图形表达方式。它统计了每一个强度值所具有的像素个数。                                                ...
  • u013220584
  • u013220584
  • 2014年02月25日 01:18
  • 2151

直方图均衡化(Histogram equalization)

综述直方图均衡化(Histogram equalization)常用于增强图片的整体对比度,特别对于那些有用的数据被相似数据所代表的情况。通过直方图均衡化将亮度更好的分布于直方图上,使得低对比度区域有...
  • sinat_33790214
  • sinat_33790214
  • 2016年01月19日 17:11
  • 1100

限制对比度自适应直方图均衡化

一、自适应直方图均衡化(Adaptive histgram equalization/AHE)       1.简述        自适应直方图均衡化(AHE)用来提升图像的对比度的一种计...
  • huangli19870217
  • huangli19870217
  • 2015年05月06日 12:39
  • 2764

opencv直方图均衡化算法及实现

1、为什么要直方图均衡化很多时候,我们的图片看起来的效果不是那么的清晰,这时候可以对图像进行一些处理来扩大图像像素值显示的范围。例如有些图像整体像素值偏低,图像中的一些特征看的不是很清晰,只是隐约看到...
  • qq_29441995
  • qq_29441995
  • 2016年09月11日 13:52
  • 479
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【OpenCV_08】直方图均衡化Histogram Equalization
举报原因:
原因补充:

(最多只允许输入30个字)