本代码通过直方图变换增强了图像对比度,实现了单通道图像增强。将图像灰度阈值拉伸到0-255,图像检测结果见底部
Keywords: 图像增强 增强对比度 直方图变换
int ImageStretchByHistogram(IplImage *src1,IplImage *dst1)
/*************************************************
Function:? ? ? 通过直方图变换进行图像增强,将图像灰度的域值拉伸到0-255
src1:? ? ? ? ? ? ? 单通道灰度图像? ? ? ? ? ? ? ? ?
dst1:? ? ? ? ? ? ? 同样大小的单通道灰度图像
*************************************************/
{
?assert(src1->width==dst1->width);
?double p[256],p1[256],num[256];
?
?memset(p,0,sizeof(p));
?memset(p1,0,sizeof(p1));
?memset(num,0,sizeof(num));
?int height=src1->height;
?int width=src1->width;
?long wMulh = height * width;
?
?//statistics
?for(int x=0;xwidth;x++)
?{
? for(int y=0;y height;y++){
? ?uchar v=((uchar*)(src1->imageData + src1->widthStep*y))[x];
? ? num[v]++;
? }
?}
?//calculate probability
?for(int i=0;i<256;i++)
?{
? p[i]=num[i]/wMulh;
?}
?//p1[i]=sum(p[j]);?j<=i;
?for(int i=0;i<256;i++)
?{
? for(int k=0;k<=i;k++)
? ?p1[i]+=p[k];
?}
?// histogram transformation
?for(int x=0;xwidth;x++)
?{
? for(int y=0;y height;y++){
? ?uchar v=((uchar*)(src1->imageData + src1->widthStep*y))[x];
? ? ((uchar*)(dst1->imageData + dst1->widthStep*y))[x]= p1[v]*255+0.5;? ? ? ? ? ?
? }
?}
?return 0;
}
void CCVMFCView::OnImageAdjustContrast()
{
?if(workImg->nChannels>1)
? OnColorToGray();
?Invalidate();
?dst=cvCreateImage(cvGetSize(workImg),workImg->depth,workImg->nChannels);
?ImageStretchByHistogram(workImg,dst);
?m_dibFlag=imageReplace(dst,&workImg);
?Invalidate();
}
Experiment Result:
?

? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? 原图灰度化

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?检测结果1

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 灰度化并增强对比度

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?检测结果2
--------------------------------------分割线 --------------------------------------
--------------------------------------分割线 --------------------------------------