资源简介
用去图像增强的一种常用方法,本资源基于论文Gray-level grouping (GLG) an automatic method for optimized image contrast Enhancement-part I the basic method实现,c++编程实现,需要opencv环境
代码片段和文件信息
//GLG,自动实现最优化的图像对比增强
#include
#include “cv.h“
#include “highgui.h“
#include
using namespace std;
int ImageGLG(IplImage *srcIplImage *dst);
int DrawHistogram(IplImage* src);//画src图像的直方图
int _tmain(int argc _TCHAR* argv[])
{
IplImage * pImg;
pImg=cvLoadImage(“lena.jpg“-1);
//创建一个灰度图像
IplImage* GrayImage = cvCreateImage(cvGetSize(pImg) IPL_DEPTH_8U 1);
IplImage* dstGrayImage = cvCreateImage(cvGetSize(pImg) IPL_DEPTH_8U 1);
cvCvtColor(pImg GrayImage CV_BGR2GRAY);
ImageGLG(GrayImagedstGrayImage);
DrawHistogram(GrayImage);//画原图像的直方图
DrawHistogram(dstGrayImage);//画GLG后图像的直方图
cvNamedWindow( “dstGrayImage“ 1 ); //创建窗口
cvNamedWindow( “GrayImage“ 1 ); //创建窗口
cvShowImage( “dstGrayImage“ dstGrayImage ); //显示图像
cvShowImage( “GrayImage“ GrayImage ); //显示图像
cvWaitKey(0); //等待按键
cvDestroyWindow( “dstGrayImage“ );//销毁窗口
cvDestroyWindow( “GrayImage“ );//销毁窗口
cvReleaseImage( &pImg ); //释放图像
cvReleaseImage( &GrayImage ); //释放图像
cvReleaseImage( &dstGrayImage ); //释放图像
return 0;
}
int ImageGLG(IplImage *srcIplImage *dst)
/*************************************************
Function:
Description: GLG图像对比增强
Input: 单通道灰度图像
Output: 同样大小的单通道灰度图像
Return:
DATE: 2013-10-16
*************************************************/
{
//Hn[]存放各个灰度级出现的次数
//Gray[][]存放非零的灰度级,Gray[0][]表示Hn[]的非零值,Gray[1][]表示G(n-1)(i),以此类推
//L[][]存放左极限,L[0][]表示L(n)(i),L[1][]表示L(n-1)(i),以此类推
//R[][]存放右极限,R[0][]表示R(n)(i),R[1][]表示R(n-1)(i),以此类推
assert(src->width==dst->width);//判断大小,如果输出和输入图像大小不等就报错退出
float Hn[256];
memset(Hn0sizeof(Hn));//把一维数组Hn全置零
int height=src->height;//取得图像尺寸
int width=src->width;
long wMulh = height * width;
//求存放图象各个灰度级出现的次数
// to do use openmp
//char *imageData; /* 指向排列的图像数据 */
//int widthStep; /* 排列的图像行大小,以字节为单位 */
for(int x=0;x for(int y=0;y uchar k=((uchar*)(src->imageData + src->widthStep*y))[x];
Hn[k]++;
}
}
//找出Hn[k]中的非0项,并把他赋给Gray[0][],Gray的列数为Hn[k]的非0项个数,Gray的行数,为Hn[k]非0项个数减19
int num=0;//用于统计Hn[k]中的非零项个数
float g[256]l[256]r[256];//暂时存放Gray,L,R第一行的值
for(int k=0;k<256;k++){
if(Hn[k]!=0){
g[num]=Hn[k];
l[num]=k;
r[num]=k;
num++;
}
}
//用一般数组Gray,L,R
float Gray[256][256];
float L[256][256];
float R[256][256];
//把Gray,LR的第0行初始化
for(int i=0;i Gray[0][i]=g[i];
L[0][i]=l[i];
R[0][i]=r[i];
}
//循环从这开始,由第0行,计算到第num-20行,循环num-20次
for(int ii=0;ii //找Gray[ii][]中的最小值a,及其位置ia
int a=Gray[ii][0];
int ia=0;
for(int i=0;i if(Gray[ii][i] a=Gray[ii][i];
ia=i;
}
}
cout<
//计算位置ia的灰度级与旁边较小的灰度级j合并j的幅值 - 上一篇:C++倒排索引
- 下一篇:用数组和链表方法实现约瑟夫环
相关资源
- C++获取计算机的CPU ID,硬盘序列号等
- C++头文件转delphi工具 + 源码
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
川公网安备 51152502000135号
评论
共有 条评论