对比度增强算法

您所在的位置:网站首页 图像对比度增强目的和意义怎么写的 对比度增强算法

对比度增强算法

2024-07-09 16:08| 来源: 网络整理| 查看: 265

版权声明:本文为EbowTang原创文章,后续可能继续更新本文。如果转载,请务必复制本文末尾的信息! https://blog.csdn.net/EbowTang/article/details/38236441

关于图像增强必须清楚的基本概念

1.图像增强的目的:

1)改善图像的视觉效果, 2)转换为更适合于人或机器分析处理的形式 3)突出对人或机器分析有意义的信息 4)抑制无用信息,提高图像的使用价值 5)增强后的图像并不一定保真

 

2,图像增强的方法分类:

1)从处理对象分类:灰度图像,(伪)彩色图像 2)从处理策略分类:全局处理,局部处理(ROI ROI,Region of Interest Interest) 3)从处理方法分类:空间域(点域运算,即灰度变换;邻域方法,即空域滤波),频域方法 4)从处理目的分类:图像锐化,平滑去噪,灰度调整(对比度增强)

 

3,图像增强的方法之对比度增强

1)灰度变换法

线性变换(已实现) 对数变换(已实现) 指数变换(已实现) 2)直方图调整法 直方图均衡化(已实现) 直方图匹配(未实现)

 

 

一,直方图均衡化 

直方图均衡化的英文名称是Histogram Equalization. 

  图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。   直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。   缺点:    1)变换后图像的灰度级减少,某些细节消失;    2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。    直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。    这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。   这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景杂讯的对比度并且降低有用信号的对比度。   

 

 

 

二,指数变换

指数变换(Power-Law )的公式:S=c*R^r,通过合理的选择c和r可以压缩灰度范围,算法以c=1.0/255.0, r=2实现。

要做该图像增强变换需要先做归一化,再指数变换,最后反归一化

增强效果展示:可以看见,改增强算法并不能很好的将像素尽可能的碾平。

指数增强参考程序为:

 

clc;

close all;

clear all;

 

% -------------Gamma Transformations-----------------

%f = imread('Fig0316(4)(bottom_left).tif');

f = imread('seed.tif');

Gamma = 0.4;

g2 = myExpEnhance(f,Gamma);

 

figure();

subplot(221); imshow(f); xlabel('a).Original Image');

subplot(222),imhist(f),title('原图像直方图');%显示原始图像直方图

subplot(223); imshow(g2); xlabel('b).Gamma Transformations \gamma = 0.4');

subplot(224),imhist(g2),title('增强图像直方图');%显示原始图像直方图

指数增强核心函数为:

 

function dst_img=myExpEnhance(src_img,Gamma)

src_img = mat2gray(src_img,[0 255]);%将图像矩阵A中介于amin和amax的数据归一化处理, 其余小于amin的元素都变为0, 大于amax的元素都变为1。

C = 1;

g2 = C*(src_img.^Gamma);

%反归一化

max=255;

min=0;

dst_img=uint8(g2*(max-min)+min);

 

 

 

三,对数变换

       对数变换主要用于将图像的低灰度值部分扩展,将其高灰度值部分压缩,以达到强调图像低灰度部分的目的。变换方法由下式给出。

这里的对数变换,底数为(v+1),实际计算的时候,需要用换底公式。其输入范围为归一化的【0-1】,其输出也为【0-1】。对于不同的底数,其对应的变换曲线如下图所示。

底数越大,对低灰度部分的强调就越强,对高灰度部分的压缩也就越强。相反的,如果想强调高灰度部分,则用反对数函数就可以了。看下面的实验就可以很直观的理解,下图是某图像的二维傅里叶变换图像,其为了使其灰度部分较为明显,一般都会使用灰度变换处理一下。

 

效果图:

 

参考代码:

 

clc;

close all;

clear all;

 

%-------------Log Transformations-----------------

f = imread('seed.tif');

 

g_1 = myLogEnhance(f,10);

g_2 = myLogEnhance(f,100);

g_3 = myLogEnhance(f,200);

 

figure();

subplot(2,2,1);

imshow(f);xlabel('a).Original Image');

 

subplot(2,2,2);

imshow(g_1);xlabel('b).Log Transformations v=10');

 

subplot(2,2,3);

imshow(g_2);xlabel('c).Log Transformations v=100');

 

subplot(2,2,4);

imshow(g_3);

xlabel('d).Log Transformations v=200');

对数变换核心函数

 

function dst_img=myLogEnhance(src_img,v)

c=1.0;

src_img = mat2gray(src_img,[0 255]);

g =c*log2(1 + v*src_img)/log2(v+1);

%反归一化

max=255;

min=0;

dst_img=uint8(g*(max-min)+min);

 

 

 

 

四,灰度拉伸  

灰度拉伸也用于强调图像的某个部分,与伽马变换与对数变换不同的是,灰度拉升可以改善图像的动态范围。可以将原来低对比度的图像拉伸为高对比度图像。实现灰度拉升的方法很多,其中最简单的一种就是线性拉伸。而这里介绍的方法稍微复杂一些。灰度拉伸所用数学式如下所示。

同样的,其输入r为【0-1】,其输出s也为【0-1】。这个式子再熟悉不过了,跟巴特沃斯高通滤波器像极了,其输入输出关系也大致能猜到是个什么形状的。但是,这里就出现一个问题了,输入为0时候,式子无意义了。所以,在用Matlab计算的时候,将其变为如下形式。

这里的eps,就是Matlab里面,一个很小数。如此做的话,式子变得有意义了。但是,其输入范围为【0-1】的时候,其输出范围变为了。输出范围大致为【0-1】,为了精确起见,使用mat2gray函数将其归一化到精确的[0-1]。调用格式如下。

 

 

 

五,线性拉伸

为了突出感兴趣的目标或者灰度区间,相对抑制那些不感兴趣的灰度区域,可采用分段线性法,常用的是三段线性变换

 

 

参考程序:

 

 

clc;

close all;

clear all;

 

I=imread('seed.tif');

[m,n,k]=size(I);

figure (1)

imshow('seed.tif');title(' 原图像');

mid=mean(mean(I));

%横轴

fa=20; fb=80;

%纵轴

ga=50; gb=230;

 

J=myLinearEnhance(I,fa,fb,ga,gb);

figure (2)

imshow(J);title(' 线性拉伸图像');

 

pixel_f=1:256;

pixel_g=zeros(1,256);

 

%三段斜率,小于1表示该段将会被收缩

k1=double(ga/fa);

k2=(gb- ga)/(fb- fa);

k3=(256- gb)/(256- fb);

for i=1:256

if i



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3