直方图均衡化
来源:互联网 发布: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
- 直方图均衡化、自适应直方图均衡化
- 直方图均衡化推导
- 直方图均衡化
- 直方图均衡化
- 直方图均衡化
- 直方图均衡化
- 灰度直方图均衡化
- 直方图均衡化
- 直方图均衡化
- 直方图均衡化
- matlab直方图均衡化
- 直方图均衡化
- opencv直方图均衡化
- 直方图均衡化原理
- 直方图均衡化
- 直方图均衡化
- 直方图的均衡化
- 直方图均衡化ZT
- 微信小程序学习(一)
- robot入门1
- jQuery实现单击变换样式
- 使用spring的使用spring的RequestMappingHandlerMapping类自动扫描入库类自动扫描URL写入数据库
- 注解笔记
- 直方图均衡化
- 引入外部JS
- 理解网页请求过程
- 统计学习精要 (Elements of Statistical Learning ) 习题 2.4
- COM学习笔记(一)
- js 判断只能输入正整数或两位以内的小数(包括小数)
- window.onresize或者$(window).resize()触发两次
- csv文件导入到mysql
- oracle 两个时间相减