当前位置:编程学习 > C/C++ >>

灰度直方图均衡化(上)

 
 
//  
  
#include "stdafx.h"  
#include "opencv2/opencv.hpp"  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    //加载图片  
    IplImage* src= cvLoadImage("F:\\Opencv_picture\\05.jpg", 1);     
    //BGRA四通道,并初始化为0  
    IplImage* imgChannel[4]= {0, 0, 0, 0};  
    //创建dst并分配数据  
    IplImage* dst= cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);  
       
    if(src)  //如果src不等于0,即存在为真;反之加载图片失败  
    {  
         for(int i=0; i< src->nChannels; i++)  
         {  
             //是每一通道为8位无符号的单通道  
             imgChannel[i]= cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);  
         }  
         //分离通道,分别是BGRA  
         cvSplit(src, imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3] );  
                 
         for(int  i=0; i< dst-> nChannels; i++)  
         {  
             cvEqualizeHist( imgChannel[i], imgChannel[i]);  
         }  
  
         //组合通道  
         cvMerge( imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3], dst);  
            
         cvNamedWindow("src", 1);  
         cvShowImage("src", src);  
         cvNamedWindow("Equalize", 1);  
         cvShowImage("Equalize", dst);  
  
         cvWaitKey(0);  
          
         //释放src,dst和imgChannel[i]  
         cvReleaseImage(&src);  
         for(int i=0; i< src-> nChannels; i++)  
         {  
              if(imgChannel[i])  
              {  
                  cvReleaseImage(&imgChannel[i]);  
              }  
         }  
         cvReleaseImage(&dst);  
    }  
    return 0;  
}  
 
结果图:
 
处理前:
 
处理后:
EqualizeHist
 
灰度图象直方图均衡化 
 
void cvEqualizeHist( const CvArr* src, CvArr* dst );
src 
输入的 8-比特 单信道图像 
dst 
输出的图像与输入图像大小与数据类型相同 
函数 cvEqualizeHist 采用如下法则对输入图像进行直方图均衡化: 
 
计算输入图像的直方图 H 
直方图归一化,因此直方块和为255 
计算直方图积分: 
采用H'作为查询表:dst(x,y)=H'(src(x,y))进行图像变换。 
该方法归一化图像亮度和增强对比度。 
 
 
cvSplit
分割多通道数组成几个单通道数组或者从数组中提取一个通道 
 
void cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1,
CvArr* dst2, CvArr* dst3 );
#define cvCvtPixToPlane cvSplit
src 
原数组. 
dst0...dst3 
目标通道 
函数 cvSplit 分割多通道数组成分离的单通道数组d。可获得两种操作模式 . 如果原数组有N通道且前N输出数组非NULL, 所有的通道都会被从原数组中提取,如果前N个通道只有一个通道非NULL函数只提取该指定通道,否则会产生一个错误,馀下的通道(超过前N个通道的以上的)必须被设置成NULL,对于设置了COI的IplImage 结使用cvCopy 也可以从图像中提取单通道。
 
cvMerge
从几个单通道数组组合成多通道数组或插入一个单通道数组 
 
void cvMerge( const CvArr* src0, const CvArr* src1,
const CvArr* src2, const CvArr* src3, CvArr* dst );
#define cvCvtPlaneToPix cvMerge
src0... src3 
输入的通道. 
dst 
输出数组. 
函数cvMerge 是前一个函数的反向操作。如果输出数组有N个通道并且前N个输入通道非NULL,就拷贝所有通道到输出数组,如果在前N个通道中只有一个单通道非NULL ,只拷贝这个通道到输出数组,否则 就会产生错误。除前N通道以外的馀下的通道必须置NULL。对于设置了COI的 IplImage结构使用 cvCopy也可以实现向图像中插入一个通道 。 
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,