图像局部对比度增强算法
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
相关文章推荐
- actionscript里面如何上传文件到服务端?
- Android组件保活,service保活
- 第十三周项目二动物这样叫三
- 2016/6/21--网页点击保存按钮将数据存到数据库
- cocos-九宫格数据切割
- 软件工程各阶段的评审内容(转载)
- ado查询
- python模块fileinput
- python模块fileinput
- 乐学成语
- oracle索引使用监控
- 运行DesktopDemo应用程序
- iOS - Modal后控制器的关系 及 modal后不移除后面的控件
- 微信分享到朋友中 时 分享的描述desc参数不能与换行 否则无法分享,
- 使用Renci.SshNet实现sftp文件上传和下载
- 关键字explicit
- 项目计划与项目进度跟踪(转载)
- Java本身是一种设计的非常简单语言
- Java - Hibernate Tools Query property should be explicitly set for Query Exporter?
- 天气