• 灰度直方图均衡化(上)


    仿写:


    // 直方图均衡化.cpp : 定义控制台应用程序的入口点。
    //
    
    #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 采用如下法则对输入图像进行直方图均衡化:

    1. 计算输入图像的直方图 H
    2. 直方图归一化,因此直方块和为255
    3. 计算直方图积分:
    4. 采用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#静态函数什么时候被调用的问题
    Visual Studio调试之断点技巧篇
    使用MPLex实现语法高亮显示的功能
    Generate Ellipsoid画椭球用MATLAB
    matlab学习
    12.17 V155 Q169. 机经加感悟。
    GRE阅读
    Matlab7.0程序启动后自动退出问题
    远程打开MATLAB
    Resin是CAUCHO公司的产品,是一个非常流行的application server,对servlet和JSP提供了良好的支持,性能也比较优良,resin自身采用JAVA语言开发。
  • 原文地址:https://www.cnblogs.com/pangblog/p/3322823.html
Copyright © 2020-2023  润新知