灰度或者彩色图像的直方图均衡化+Opencv(可以选择其中的某一个区域进行均衡)
2012-08-27 09:41
477 查看
灰度或者彩色图像的直方图均衡化+Opencv(可以选择其中的某一个区域进行均衡)
支持单通道或者多通道的处理。可以对直方图选择其中的一段区域进行均衡,也可以对整个直方图进行均衡(只要改变均衡的起始和结束的直方图级别即可)。可以对背景或者黑白的部分进行排除而不对其进行处理,减少这些对均衡化的影响。
#include <highgui.h>
#include <cv.h>
int main()
{
int i = 0;
int j = 0;
int k = 0;
IplImage* src = cvLoadImage("33.jpg", CV_LOAD_IMAGE_GRAYSCALE );//CV_LOAD_IMAGE_GRAYSCALE
cvNamedWindow( "src", 1 );
cvShowImage( "src", src );
//cvWaitKey(0);
IplImage* dst = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, src->nChannels );
//直方图均衡化,灰度或者彩色图均可
if( src )
{
for( k = 0; k < src -> nChannels; k++ )
{
//直方图均衡化,原始图像和目标图像必须是单通道
//cvEqualizeHist( imgChannel[i], imgChannel[i] );
int Hist[256] = {0};
int pixelsnum = 0;
int nStartGrayLevel = 8;
int nEndGrayLevel = 256 - nStartGrayLevel;
int nGrayLevel = 256 - nStartGrayLevel * 2;//需要均衡化的灰度级
unsigned char gray = 0;
//直方图
for(i = 0; i < src->height; i++)
{
char *p = src->imageData + i * src->widthStep + k;//+k是选择需要均衡化的通道
for(j = 0; j < src->width; j++)
{
gray = (unsigned char)(*(p));
Hist[gray]++;
if(gray > nStartGrayLevel && gray < nEndGrayLevel)
pixelsnum++;
p += 3;
}
}
//均衡化索引
for(i = 0; i < nStartGrayLevel;i++)
{
Hist[i] = i;
}
int temp = 0;
for(i = nStartGrayLevel; i < nEndGrayLevel;i++)
{
temp += Hist[i];
int value = 0;
value = (int)(temp * nGrayLevel / (float)pixelsnum + 0.5 +nStartGrayLevel);
if(value > 255)
value = 255;
if(value < 0)
value = 0;
Hist[i] = value;
}
for(i = nEndGrayLevel; i < 256;i++)
{
Hist[i] = i;
}
//根据均衡化索引进行处理
for(i = 0; i < src->height; i++)
{
char *ps = src->imageData + i * src->widthStep + k;//+k是选择需要均衡化的通道
char *p = dst->imageData + i * dst->widthStep + k;//+k是保存均衡化的通道
for(j = 0; j < src->width; j++)
{
gray = (unsigned char)(*(ps));
*(p) = (unsigned char)(Hist[gray]);
ps += 3;
p += 3;
}
}
}
cvNamedWindow( "src", 1 );
cvShowImage( "src", src );
cvNamedWindow( "Equalize", 1 );
cvShowImage( "Equalize", dst );
cvWaitKey(0);
//释放资源
cvReleaseImage( &dst );
}
return 0;
}
支持单通道或者多通道的处理。可以对直方图选择其中的一段区域进行均衡,也可以对整个直方图进行均衡(只要改变均衡的起始和结束的直方图级别即可)。可以对背景或者黑白的部分进行排除而不对其进行处理,减少这些对均衡化的影响。
#include <highgui.h>
#include <cv.h>
int main()
{
int i = 0;
int j = 0;
int k = 0;
IplImage* src = cvLoadImage("33.jpg", CV_LOAD_IMAGE_GRAYSCALE );//CV_LOAD_IMAGE_GRAYSCALE
cvNamedWindow( "src", 1 );
cvShowImage( "src", src );
//cvWaitKey(0);
IplImage* dst = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, src->nChannels );
//直方图均衡化,灰度或者彩色图均可
if( src )
{
for( k = 0; k < src -> nChannels; k++ )
{
//直方图均衡化,原始图像和目标图像必须是单通道
//cvEqualizeHist( imgChannel[i], imgChannel[i] );
int Hist[256] = {0};
int pixelsnum = 0;
int nStartGrayLevel = 8;
int nEndGrayLevel = 256 - nStartGrayLevel;
int nGrayLevel = 256 - nStartGrayLevel * 2;//需要均衡化的灰度级
unsigned char gray = 0;
//直方图
for(i = 0; i < src->height; i++)
{
char *p = src->imageData + i * src->widthStep + k;//+k是选择需要均衡化的通道
for(j = 0; j < src->width; j++)
{
gray = (unsigned char)(*(p));
Hist[gray]++;
if(gray > nStartGrayLevel && gray < nEndGrayLevel)
pixelsnum++;
p += 3;
}
}
//均衡化索引
for(i = 0; i < nStartGrayLevel;i++)
{
Hist[i] = i;
}
int temp = 0;
for(i = nStartGrayLevel; i < nEndGrayLevel;i++)
{
temp += Hist[i];
int value = 0;
value = (int)(temp * nGrayLevel / (float)pixelsnum + 0.5 +nStartGrayLevel);
if(value > 255)
value = 255;
if(value < 0)
value = 0;
Hist[i] = value;
}
for(i = nEndGrayLevel; i < 256;i++)
{
Hist[i] = i;
}
//根据均衡化索引进行处理
for(i = 0; i < src->height; i++)
{
char *ps = src->imageData + i * src->widthStep + k;//+k是选择需要均衡化的通道
char *p = dst->imageData + i * dst->widthStep + k;//+k是保存均衡化的通道
for(j = 0; j < src->width; j++)
{
gray = (unsigned char)(*(ps));
*(p) = (unsigned char)(Hist[gray]);
ps += 3;
p += 3;
}
}
}
cvNamedWindow( "src", 1 );
cvShowImage( "src", src );
cvNamedWindow( "Equalize", 1 );
cvShowImage( "Equalize", dst );
cvWaitKey(0);
//释放资源
cvReleaseImage( &dst );
}
return 0;
}
相关文章推荐
- 我创建了一个托盘图标,可以正常使用,点击右键打开菜单。问题是如果点击右键后不选择其中一个菜单项进行操作的话,它就总不消失。
- opencv2鼠标选择感兴趣区域后对两幅图像进行均值漂移算法
- jquery或者js实现两个下拉列表框只可以选择其中一个
- opencv把一个彩色图像加载成灰度图像
- OpenCV下设置灰度直方图的阈值来对图像进行查找(查表)变换的源码
- android从摄像头或者图库选择图片,并进行裁剪,可以用来用户头像处理
- 【Android】使用OpenCV彩色图像转灰度图像
- opencv学习(一)实现将彩色图像转换成灰度图像和二值图像
- 如何在opencv对图像中一个区域涂色呢?
- C语言实现一个Window控制台带彩色,且可以用方向键选择并确认的菜单式列表(二) ---学生信息管理系统
- opencv保存选择图像中的区域(二)
- MFC的View区显示OpenCV的Mat数据结构图像,24位彩色或者8位灰度图像
- opencv彩色图像与灰度图像叠加
- Opencv绘制灰度/彩色图像的直方图及直方图的均衡化实例及源代码
- OpenCV入门四:用OpenCV读取一个图像,并使用Canny算子进行边缘提取
- 利用OpenCV读入一个彩色视频文件并以灰度格式输出
- OpenCV_复制一个或多个ROI图像区域
- Opencv实现图像的灰度处理,二值化,阀值选择
- OpenCV应用笔记】(彩色/灰度)图像像素值读取并保存到txt文件
- 求 a+aa+aaa+.......+aaaaaaaaa=? 其中a为1至9之中的一个数,项数也可以指定? 思路:先求出 1+11+111+1111+11111+.....+111111111 的公式,然后参照公式进行编码