直方图均衡化

来源:互联网 发布:sql注入与防御 编辑:程序博客网 时间:2024/05/17 09:28
%matlab实现
cl;img=imread('mask.jpg');imshow(img);[x,y]=size(img);img_man=zeros(x,y);img_com=zeros(x,y);%% 直方图均衡化算法Max=max(max(img));Min=min(min(img));Hist=zeros(1,256);for i=1:x    for j=1:y        Hist(img(i,j)+1)=Hist(img(i,j)+1)+1;    endendfigure,plot(Hist);p=zeros(1,256);for i=1:256    p(i)=Hist(i)/(x*y);endfigure,plot(p);c=zeros(1,256);for i=1:256    c(i)=sum(p(1:i));endfigure,plot(c);for i=1:x    for j=1:y        img_man(i,j)=c(img(i,j)+1)*(Max-Min)+Min;    endendfigure,imshow(uint8(img_man))Hist2=zeros(1,256);for i=1:x    for j=1:y        Hist2(img_man(i,j)+1)=Hist2(img_man(i,j)+1)+1;    endendfigure,plot(Hist2);%% matlab直方图均衡化函数img_com=histeq(img);     figure,imshow(img_com)Hist3=zeros(1,256);for i=1:x    for j=1:y        Hist3(img_com(i,j)+1)=Hist3(img_com(i,j)+1)+1;    endendfigure,plot(Hist3);
//c++实现,iplimage版
//图像的灰度直方图均衡化  //By MoreWindows (http://blog.csdn.net/MoreWindows)  #include <opencv2/opencv.hpp>  #include <opencv2/legacy/compat.hpp>  using namespace std;  #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  void FillWhite(IplImage *pImage)  {      cvRectangle(pImage, cvPoint(0, 0), cvPoint(pImage->width, pImage->height), CV_RGB(255, 255, 255), CV_FILLED);  }  // 创建灰度图像的直方图  CvHistogram* CreateGrayImageHist(IplImage **ppImage)  {      int nHistSize = 256;      float fRange[] = {0, 255};  //灰度级的范围        float *pfRanges[] = {fRange};        CvHistogram *pcvHistogram = cvCreateHist(1, &nHistSize, CV_HIST_ARRAY, pfRanges);      cvCalcHist(ppImage, pcvHistogram);      return pcvHistogram;  }  // 根据直方图创建直方图图像  IplImage* CreateHisogramImage(int nImageWidth, int nScale, int nImageHeight, CvHistogram *pcvHistogram)  {      IplImage *pHistImage = cvCreateImage(cvSize(nImageWidth * nScale, nImageHeight), IPL_DEPTH_8U, 1);      FillWhite(pHistImage);        //统计直方图中的最大直方块      float fMaxHistValue = 0;      cvGetMinMaxHistValue(pcvHistogram, NULL, &fMaxHistValue, NULL, NULL);        //分别将每个直方块的值绘制到图中      int i;      for(i = 0; i < nImageWidth; i++)      {          float fHistValue = cvQueryHistValue_1D(pcvHistogram, i); //像素为i的直方块大小          int nRealHeight = cvRound((fHistValue / fMaxHistValue) * nImageHeight);  //要绘制的高度          cvRectangle(pHistImage,              cvPoint(i * nScale, nImageHeight - 1),              cvPoint((i + 1) * nScale - 1, nImageHeight - nRealHeight),              cvScalar(i, 0, 0, 0),               CV_FILLED              );       }      return pHistImage;  }  int main( int argc, char** argv )  {         const char *pstrWindowsSrcTitle = "原图(http://blog.csdn.net/MoreWindows)";      const char *pstrWindowsGrayTitle = "灰度图(http://blog.csdn.net/MoreWindows)";      const char *pstrWindowsHistTitle = "直方图(http://blog.csdn.net/MoreWindows)";      const char *pstrWindowsGrayEqualizeTitle = "灰度图-均衡化后(http://blog.csdn.net/MoreWindows)";      const char *pstrWindowsHistEqualizeTitle = "直方图-均衡化后(http://blog.csdn.net/MoreWindows)";            // 从文件中加载原图      IplImage *pSrcImage = cvLoadImage("013.jpg", CV_LOAD_IMAGE_UNCHANGED);      IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);      IplImage *pGrayEqualizeImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);            // 灰度图      cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);      // 直方图图像数据      int nHistImageWidth = 255;      int nHistImageHeight = 150;       int nScale = 2;          // 灰度直方图及直方图图像      CvHistogram *pcvHistogram = CreateGrayImageHist(&pGrayImage);      IplImage *pHistImage = CreateHisogramImage(nHistImageWidth, nScale, nHistImageHeight, pcvHistogram);        // 均衡化      cvEqualizeHist(pGrayImage, pGrayEqualizeImage);        // 均衡化后的灰度直方图及直方图图像      CvHistogram *pcvHistogramEqualize = CreateGrayImageHist(&pGrayEqualizeImage);             IplImage *pHistEqualizeImage = CreateHisogramImage(nHistImageWidth, nScale, nHistImageHeight, pcvHistogramEqualize);        // 显示      //显示代码….      cvWaitKey(0);      //回收资源代码…      return 0;  }  


//C++实现, mat版

/**  @function main */int main( int argc, char** argv ){  Mat src, dst;  char* source_window = "Source image";  char* equalized_window = "Equalized Image";  /// 加载源图像  src = imread( argv[1], 1 );  if( !src.data )    { cout<<"Usage: ./Histogram_Demo <path_to_image>"<<endl;      return -1;}  /// 转为灰度图  cvtColor( src, src, CV_BGR2GRAY );  /// 应用直方图均衡化  equalizeHist( src, dst );  /// 显示结果  namedWindow( source_window, CV_WINDOW_AUTOSIZE );  namedWindow( equalized_window, CV_WINDOW_AUTOSIZE );  imshow( source_window, src );  imshow( equalized_window, dst );  /// 等待用户按键退出程序  waitKey(0);  return 0;}


Iplimage *src;

src = &iplimage(mat);

或者

Iplimage *src;

*src = iplimage(mat);

转换都不能用于直方图均衡化,但是可以显示。


0 0
原创粉丝点击