您的位置:首页 > 其它

图像局部对比度增强算法

2016-06-21 18:20 741 查看
   
    本算法为基于灰度值的局部对比度提升算法。

    核心想法是:采用局部处理,提升某一点与周围像素点的差别。

   算法流程:

    选择一定大小模板(默认3*3)在图像滑动,对于当前点f(x,y),计算其局部区域(8邻域)均值
    average = 1/8(f(x-1,y-1)+f(x-1,y)+f(x-1,y+1)+f(x,y-1)+f(x-1,y)+f(x+1,y+1)+f(x+1,y)+f(x,y+1))

    为了提升对比度,应提加大该点灰度,并减去平均值
    其更新值为g(x,y) = s*f(x,y) +(1-s)*average,可以认为s是增强强度

   显然当s>1时为提升对比度,s<1为降低对比度(当s=0为特例,即均值滤波)

    以下为opencv代码、实验结果、MATLAB代码

[align=left]
[/align]
#include<highgui.h>
#include<cv.h>

void main()
{
int row , col ;
int ci = 0.1;  //contrast enhance intensity
double sum,average ;

char name[] = "test.jpg";
IplImage * imgcolor = cvLoadImage(name);
IplImage * img = cvCreateImage(cvSize(500,500),IPL_DEPTH_8U,1);
cvCvtColor(imgcolor,img,CV_RGB2GRAY);
IplImage *img_out8 = cvCreateImage(cvSize(500,500),IPL_DEPTH_8U,1);
IplImage *img_out64 = cvCreateImage(cvSize(500,500),IPL_DEPTH_64F,1);
uchar *ptr1,*ptr2,*ptr3;
double *out;

for (row=0;row<img_out64->height;row++)
{
out =  ( double*)(img_out64->imageData+row*img_out64->widthStep);
for (col=0;col<img_out64->width;col++)
out[col] = 0;
}

for (row=1;row<img->height-1;row++)
{
ptr1 = ( uchar*)(img->imageData+row*img->widthStep);
ptr2 = ( uchar*)(img->imageData+(row-1)*img->widthStep);
ptr3 = ( uchar*)(img->imageData+(row+1)*img->widthStep);
out =  ( double*)(img_out64->imageData+row*img_out64->widthStep);
for (col=1;col<img->width-1;col++)
{
sum = ptr2[col-1]+ptr2[col]+ptr2[col+1]+ptr3[col-1]+ptr3[col]+ptr3[col+1]+ptr1[col-1]+ptr1[col+1];
average = sum/8;
out[col] =  ci*ptr1[col] +(1-ci)*average;
}
}
cvConvertScale(img_out64,img_out8 );
cvNamedWindow("img_in",CV_WINDOW_AUTOSIZE);
cvShowImage("img_in",img);
cvNamedWindow("img_out",CV_WINDOW_AUTOSIZE);
cvShowImage("img_out",img_out8);
cvWaitKey(0);

}


实验结果(以我所做项目水下图像为例,从左至右分别是原图,s=10,s=0.3)


 

 


可以看出,s=10时对比度有较大的提升,当然也有噪声产生,当s=0.3时,模糊效果不明显,这与模板大小有关。

MATLAB仿真代码:
function gray_contrast = contrast_gray ( gray, s )

[ m, n ] = size ( gray );
gray3d = zeros ( 8, m, n );

gray = double ( gray );

gray3d(1,:,:) = circshift ( gray, [ -1, -1 ] );
gray3d(2,:,:) = circshift ( gray, [ -1,  0 ] );
gray3d(3,:,:) = circshift ( gray, [ -1,  1 ] );
gray3d(4,:,:) = circshift ( gray, [  0, -1 ] );
gray3d(5,:,:) = circshift ( gray, [  0,  1 ] );
gray3d(6,:,:) = circshift ( gray, [  1, -1 ] );
gray3d(7,:,:) = circshift ( gray, [  1,  0 ] );
gray3d(8,:,:) = circshift ( gray, [  1,  1 ] );

gray_average = sum ( gray3d ) / 8.0;

gray_average_2d(1:m,1:n) = gray_average(1,1:m,1:n);

gray_contrast = ( 1.0 - s ) * gray_average_2d(:,:) + s * gray;

gray_contrast = uint8 ( gray_contrast );

gray_contrast(1,:) = gray(1,:);
gray_contrast(m,:) = gray(m,:);
gray_contrast(:,1) = gray(:,1);
gray_contrast(:,n) = gray(:,n);

return
end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: