前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图像增强的几个方法以及Matlab代码

图像增强的几个方法以及Matlab代码

原创
作者头像
Mezereon
发布2018-09-17 12:10:22
3.8K0
发布2018-09-17 12:10:22
举报
文章被收录于专栏:MyBlogMyBlog

1. 灰度线性变换

灰度线性变换, 是一种空域的方法, 直接对每一个像素的灰度值进行操作

假设图像为I

则其中每一个像素点的灰度值为I(x,y)

我们利用简单的线性变换可以得到:

I(x,y)^*=k*I(x,y)+b

k=1,b=16可以得到

Alt text
Alt text
Alt text
Alt text
Alt text
Alt text

这里给出关键代码

代码语言:txt
复制
original = imread(strcat(strcat('resource\',name),'.bmp'));
transformed = LinearFunction(original, 1, 16);
subplot(1,3,3);
imshow(transformed)
title('线性变换后的图像')
imwrite(transformed,strcat(strcat('result\',name),'(linear).jpg'))

2. 直方图均衡变换

这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。

考虑一个离散的灰度图像\{x\}

n_i表示灰度i出现的次数, 这样图像中灰度为i的像素出现的概率为:

p_x(i)=p(x=i)=\frac{n_i}{n}, 0\leq i<L

L是图像中所有的灰度数(通常是255)

把对应于p_x的累积分布函数,定义为:

cdf_x(i)=\sum_{j=0}^i{p_x(j)}

是图像的累计归一化直方图

我们创建一个形式为y=T(x)的变换, 对于原始图像的每一个值它就产生一个y, 这样y的累计概率函数就可以在所有值范围内线性化, 转换公式定义为:

cdf_y(i)=iK

对于常数K, CDF的性质允许我们做这样的变换, 定义为:

cdf_y(y')=cdf_y(T(k))=cdf_x(k)

其中k\in [0,L), 注意$T$将不同的灰度级映射到(0,1), 为了将这些值映射到最初的域, 需要在结果上应用下面的简单变换:

y' = y*(max\{x\}-min\{x\})+min\{x\}

给出部分结果:

Alt text
Alt text
Alt text
Alt text
Alt text
Alt text

给出关键代码:

代码语言:txt
复制
m = 255;
subplot(1,3,3);
H = histeq(I,m);
imshow(H,[]);
title('直方图均衡后的图像');

类似地, 我们可以对rgb图像进行直方图均衡, 这里直接给出结果

Alt text
Alt text
Alt text
Alt text
Alt text
Alt text
代码语言:txt
复制
[M,N,G]=size(I1);
result=zeros(M,N,3);
%获得每一层每一个点的RGB值,并判断其值等于多少
for g=1:3
    A=zeros(1,256);
    %每处理完一层,参数要重新初始化为0
    average=0;
    for k=1:256
        count=0;
        for i=1:M
            for j=1:N
                value=I1(i,j,g);
                if value==k
                    count=count+1;
                end
            end
        end
        count=count/(M*N*1.0);
        average=average+count;
        A(k)=average;
    end
    A=uint8(255.*A+0.5);
    for i=1:M
        for j=1:N
            I1(i,j,g)=A(I1(i,j,g)+0.5);
        end
    end  
end
%展示处理效果
subplot(1,3,3);
imshow(I1);

3. 同态滤波

同态滤波利用去除乘性噪声(multiplicative noise),可以同时增加对比度以及标准化亮度,借此达到图像增强的目的。

一副图像可以表示为其照度(illumination)分量和反射(reflectance)分量的乘积,虽然在时域上这两者是不可分离的,但是经由傅立叶转换两者在频域中可以线性分离。由于照度可视为环境中的照明,相对变化很小,可以看作是图像的低频成分;而反射率相对变化较大,则可视为高频成分。通过分别处理照度和反射率对像元灰度值的影响,通常是借由高通滤波器(high-pass filter),让图像的照明更加均匀,达到增强阴影区细节特征的目的。

做法是:

对于一幅图像, 可以表示成照射分量和反射分量的乘积, 也就是:

m(x,y)=i(x,y)\cdot r(x,y)

其中, m是图像, i是为照度分量, r是反射分量

为了在频域中使用高通滤波器, 我们必须进行傅里叶变换, 但是由于上式是一个乘积式, 不能直接对照度分量和反射分量进行操作, 因此对上式取对数

ln(m(x,y))=ln(i(x,y))+ln(r(x,y))

然后对上式进行傅里叶转换

\mathcal{F}\{ln(m(x,y))\}=\mathcal{F} \{ ln(i(x,y))\}+ \mathcal{F}\{ln(r(x,y))\}

我们将\mathcal{F}\{ln(m(x,y))\}定义为M(u,v)

接下来对图像进行高通滤波, 如此可以使图像的照明更均匀, 高频分量增加且低频分量减少

N(u,v)=H(u,v)\cdot M(u,v)

其中H是高通滤波器

为了将图像从频域转回时域,我们对N做傅立叶逆转换

n(x,y)=\mathcal{F}^{-1}\{N(x,y)\}

最后使用指数函数来复原我们一开始取的对数

m'(x,y)=exp\{n(x,y)\}

给出处理结果

Alt text
Alt text
Alt text
Alt text
Alt text
Alt text

给出部分关键代码

代码语言:txt
复制
I=double(I);
[M,N]=size(I);
rL=0.5;
rH=4.7;%可根据需要效果调整参数
c=2;
d0=10;
I1=log(I+1);%取对数
FI=fft2(I1);%傅里叶变换
n1=floor(M/2);
n2=floor(N/2);
H = ones(M, N);
for i=1:M
    for j=1:N
        D(i,j)=((i-n1).^2+(j-n2).^2);
        H(i,j)=(rH-rL).*(exp(c*(-D(i,j)./(d0^2))))+rL;%高斯同态滤波
    end
end
I2=ifft2(H.*FI);%傅里叶逆变换
I3=real(exp(I2));
subplot(1,3,3),imshow(I3,[]);title('同态滤波增强后');

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 灰度线性变换
  • 2. 直方图均衡变换
  • 3. 同态滤波
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档