目录

  • 一、实验目的
  • 二、实验环境
  • 三、实验内容
    • 题目
    • 相关知识
    • 部分核心代码
    • 实验结果
  • 四、实验小结

一、实验目的

1、熟悉基于基于单像素空域图像增强方法,理解并掌握直方图均衡化和规定化实现图像增强

二、实验环境

Matlab 2020B

三、实验内容

题目

1)对一幅低对比度分辨率的图像采用除直方图处理方法之外的灰度级变换方法实现图像增强。(图自选)
2)对一幅低对比度分辨率的图像采用直方图均衡化和规定化方法(单映射或组映射)实现图像增强,分别采用系统函数和自己编写函数实现相应用功能。(图自选)
3)写出实验报告。报告要求:实验目的、实验内容、实验过程、实验小结和较详细的图文说明。

相关知识

对于低分辨率的图像,可以用基于空域图像增强的方法。除了直方图处理方法,还可以使用灰度反转、对数变换、指数变换、对比度拉伸、灰度切片等。
使用指数变换,对于每个像素点都使用公式s=crγs=cr^{\gamma}s=crγ,其中ccc为常数且c=1c=1c=1,γ\gammaγ为参数,γ>1\gamma>1γ>1时图像变暗,γ<1\gamma<1γ<1时图像变亮,rrr为原图中的灰度值,取值范围为r∈[0,1]r\in[0,1]r∈[0,1],sss为新图中的灰度值,若s>1s>1s>1则取s=1s=1s=1。
灰度反转的实现较为简单。对每个像素点使用公式s=L−1−rs=L-1-rs=L−1−r。LLL为灰度级数,在uint8的图像中,L=256L=256L=256。rrr为原图中的灰度值,sss为新图中的灰度值。
使用对数变换时,使用公式s=clog⁡(r+1)s=c\log(r+1)s=clog(r+1),其中ccc为参数且ccc可以不为1,rrr为原图中的灰度值且r≥0r\ge 0r≥0。
对比度拉伸可以使用matlab自带的函数imadjust实现,imadjust可以带三个参数,分别为原图、输入的灰度值范围、输出的灰度值范围。也可以自行编写函数实现。在本次实验中,自行用线性变换实现对比度拉伸的效果。取原图中灰度值最低点的灰度值为a0a_0a0​,取b0=0.5b_0=0.5b0​=0.5。取新灰度值最小为anewa_{new}anew​,新灰度值最大为bnewb_{new}bnew​。则对于每个像素点,s=anew+bnew−anewb0−a0∗(r−a0)s=a_{new}+\frac{b_{new}-a_{new}}{b_0-a_0}*(r-a_0)s=anew​+b0​−a0​bnew​−anew​​∗(r−a0​)。其中,rrr为原图中的灰度值且0≤r≤10\le r\le 10≤r≤1,sss为新图中的灰度值且0≤s≤10\le s\le 10≤s≤1。对于计算结果≤0\le 0≤0的点需要置成0,对于计算结果≥1\ge 1≥1的点需要置成1。
直方图均衡化可以使用matlab自带的函数histeq实现,histeq带两个参数,分别为原图、图像的灰度级数。调用imhist函数,还可以得到并输出该图像的直方图。也可以自行编写函数实现。
在编写函数实现直方图均衡化时,首先处理出原图的直方图。记h(rk)=nkh(r_k)=n_kh(rk​)=nk​,rkr_krk​为原图中的某一灰度级,nkn_knk​为图像中灰度级同为rkr_krk​的像素点的数量。取p(rk)=h(rk)n=nknp(r_k)=\frac{h(r_k)}{n}=\frac{n_k}{n}p(rk​)=nh(rk​)​=nnk​​,其中nnn为图中像素的总数量,则p(rk)p(r_k)p(rk​)为灰度级rkr_krk​出现的概率的概率密度。对于第kkk个灰度级,sk=T(rk)=∑j=0kpr(rj)=∑j=0knjns_k=T(r_k)=\sum_{j=0}^kp_r(r_j)=\sum_{j=0}^k\frac{n_j}nsk​=T(rk​)=∑j=0k​pr​(rj​)=∑j=0k​nnj​​为其累计分布函数。接下来,处理出第kkk个灰度级在新图像中被映射成的灰度级S(k)=int[(max⁡(rk)−min⁡(rk))∗sk+0.5]S(k)=\rm int \it[(\max (r_k)-\min(r_k))*s_k+\rm 0.5]S(k)=int[(max(rk​)−min(rk​))∗sk​+0.5]。最后,将原图中的每个像素点的灰度级映射成新图中对应的像素点的灰度级。
直方图匹配(规定化)也使用histeq实现。histeq的两个参数分别为原图、被匹配图像的直方图。
在编写函数实现直方图规定化(直方图匹配)时,同样的,首先处理出原图的直方图和被匹配图像的直方图。直方图匹配可以使用单映射实现,也可以使用组映射实现。在实现单映射时,把原图中的相应灰度值按累积概率密度映射成被匹配图像的累积概率密度对应的灰度值。在实现组映射时,把被匹配图像的相应灰度值按累积概率密度映射成原图相应累积概率密度时对应的灰度值,并且需要填补空缺值。

部分核心代码

I_0=imread("Couple.bmp");
I_0=im2double(I_0);
c=1;
gamma=0.40;
[w,h]=size(I_0);
I_1=zeros(w,h);
for i=1:wfor j=1:hI_1(i,j)=I_0(i,j).^gamma;end
end
title("实验1-1")
subplot(1,2,1);imshow(I_0);title('原图')
subplot(1,2,2);imshow(I_1);title('新图')

完成了指数变换,使用了公式s=crγs=cr^\gammas=crγ,γ=0.4\gamma=0.4γ=0.4,成功使得图像变得更亮。

I_0=imread("Couple.bmp");
I_0=im2double(I_0);
c=1;
gamma=0.40;
[w,h]=size(I_0);
I_1=imadjust(I_0,[0.1 0.5],[0 1]);
title("实验2-3")
subplot(1,2,1);imshow(I_0);title('原图')
subplot(1,2,2);imshow(I_1);title('imadjust')

完成了图像的对比度拉伸,使用matlab自带的imadjust函数实现,使得图像变亮。

I=im2double(I);
anew=0;
bnew=1;
a0=min(min(min(I)));
b0=0.5;
A1=anew+(bnew-anew)/(b0-a0)*(I-a0);
[row,col]=size(I);
for i=1:rowfor j=1:colif(A1(i,j)<0)A1(i,j)=0;endif A1(i,j)>1A1(i,j)=1;endend
end
imshow(A1)

完成了图像的对比度拉伸,使用自行编写的程序实现。新灰度值最小为anewa_{new}anew​,新灰度值最大为bnewb_{new}bnew​。则对于每个像素点,s=anew+bnew−anewb0−a0∗(r−a0)s=a_{new}+\frac{b_{new}-a_{new}}{b_0-a_0}*(r-a_0)s=anew​+b0​−a0​bnew​−anew​​∗(r−a0​)。最后,处理s>1s>1s>1或s<0s<0s<0的情况。

I_0=imread("Couple.bmp");
I_0=im2double(I_0);
c=2;
[w,h]=size(I_0);
I_1=zeros(w,h);
for i=1:wfor j=1:hI_1(i,j)=c*log(I_0(i,j)+1);end
end
title("实验1-1")
subplot(1,2,1);imshow(I_0);title('原图')
subplot(1,2,2);imshow(I_1);title('新图')

完成了图像的对数变换,取c=2c=2c=2,成功地使得图像变亮。

I=imread("Couple.bmp");
I=im2double(I);
subplot(1,2,1);imshow(I);title('原图')
[w,h]=size(I);
I1=ones(w,h);
for i=1:wfor j=1:hI1(i,j)=1-I(i,j);end
end
subplot(1,2,2);imshow(I1);title('新图')

完成了图像的灰度反转,使得暗处变亮,亮处变暗。

I=imread("Couple.bmp");
subplot(2,2,1)
imshow(I);title("原图")
subplot(2,2,2)
imhist(I);title("原直方图")
ylim('auto')
g=histeq(I,256);
subplot(2,2,3)
imshow(g);title("新图")
subplot(2,2,4)
imhist(g);title("新直方图")
ylim('auto')

调用系统函数实现直方图均衡化

I=imread("Couple.bmp");
histogram=zeros(1,255);
[w,h]=size(I);
for i=1:wfor j=1:hhistogram(I(i,j)+1)=histogram(I(i,j)+1)+1;%处理出每个灰度级的像素点数量end
end
%bar(zhifangtu)
n=w*h;%图上像素点总数
p=histogram/n;%概率密度函数
s=zeros(1,255);%累积概率密度
s(1)=p(1);
for i=2:255s(i)=s(i-1)+p(i);
end
newimg=zeros(w,h);%新图
for i=1:wfor j=1:hnewimg(i,j)=s(I(i,j)+1);%新图对应像素点值为原图对应像素点值*灰度级数。但在此代码中,使用double存图end
end
imshow(newimg)
newimg=im2uint8(newimg);
newhistogram=zeros(1,255);
for i=1:wfor j=1:hnewhistogram(newimg(i,j)+1)=newhistogram(newimg(i,j)+1)+1;%新图中每个灰度级的像素点数量end
end
title("实验2-8")
subplot(2,2,1);imshow(I);title('原图')
subplot(2,2,2);bar(histogram);title('原直方图')
subplot(2,2,3);imshow(newimg);title('直方图均衡化后图像')
subplot(2,2,4);bar(newhistogram);title('直方图均衡化后直方图')

自行编写函数实现了图像的直方图均衡化。先处理出原图每个灰度级出现的概率密度,再求解每个灰度级

I=imread("Couple.bmp");
Imatch=imread("match.png");
Imatch=rgb2gray(Imatch);
[histogram,x]=imhist(Imatch);
Inew=histeq(I,histogram);
subplot(3,2,1),imshow(I);title("原图")
subplot(3,2,2);imhist(I);title("原直方图")
subplot(3,2,3);imshow(Imatch);title("被匹配图")
subplot(3,2,4);imhist(Imatch);title("被匹配直方图")
subplot(3,2,5);imshow(Inew);title("新图")
subplot(3,2,6);imhist(Inew);title("新直方图")

使用matlab自带的函数实现了直方图匹配(直方图规定化)。

I=imread("Couple.bmp");
histogram=zeros(1,255);
[w,h]=size(I);
for i=1:wfor j=1:hhistogram(I(i,j)+1)=histogram(I(i,j)+1)+1;%处理出每个灰度级的像素点数量end
end
%bar(zhifangtu)
n=w*h;
p=histogram/n;
s1=zeros(1,255);
s1(1)=p(1);
for i=2:255s1(i)=s1(i-1)+p(i);
end
I2=imread("match.png");%被匹配图像
histogram2=zeros(1,255);
I2=im2gray(I2);
[w2,h2]=size(I2);
for i=1:w2for j=1:h2histogram2(I2(i,j)+1)=histogram2(I2(i,j)+1)+1;%处理出每个灰度级的像素点数量end
end
n2=w2*h2;
p2=histogram2/n2;
s2=zeros(1,255);
s2(1)=p2(1);
for i=2:255s2(i)=s2(i-1)+p2(i);
end
map=zeros(1,255);%将灰度级i映射成j
for i=1:255for j=1:254if (s1(i)>=s2(j) && s1(i)<=s2(j+1))%将原图的灰度级与新图的灰度级匹配if (abs(s1(i)-s2(j))<abs(s1(i)-s2(j+1)))%匹配到概率密度最接近的点map(i)=j;elsemap(i)=j+1;endbreakendend
end
newimg=zeros(w,h);%新图
for i=1:wfor j=1:hnewimg(i,j)=map(I(i,j)+1);%按照匹配关系将原图像素点映射到新图end
end
newimg=newimg/255;
newimg=im2uint8(newimg);
newhistogram=zeros(1,255);
for i=1:wfor j=1:hnewhistogram(newimg(i,j)+1)=newhistogram(newimg(i,j)+1)+1;%新图的直方图end
end
subplot(3,2,1),imshow(I);title("原图")
subplot(3,2,2);bar(histogram);title("原直方图")
subplot(3,2,3);imshow(Imatch);title("被匹配图")
subplot(3,2,4);bar(histogram2);title("被匹配直方图")
subplot(3,2,5);imshow(newimg);title("新图")
subplot(3,2,6);bar(newhistogram);title("新直方图")

自行编写函数实现了直方图匹配,实现了单映射。先处理出原图每个灰度级出现的概率密度和累积概率密度,再处理被匹配图像每个灰度级的概率密度和累积概率密度。最后,将原图像的灰度级按照累积概率密度映射成被匹配图像的灰度级。得到原图的灰度级和其被映射成的灰度级的关系后,创建新图并将原图像的对应像素的灰度级的映射值填入。

I=imread("Couple.bmp");
histogram=zeros(1,255);
[w,h]=size(I);
for i=1:wfor j=1:hhistogram(I(i,j)+1)=histogram(I(i,j)+1)+1;%处理出每个灰度级的像素点数量end
end
%bar(zhifangtu)
n=w*h;
p=histogram/n;
s1=zeros(1,255);
s1(1)=p(1);
for i=2:255s1(i)=s1(i-1)+p(i);
endI2=imread("match.png");%被匹配图像
histogram2=zeros(1,255);
I2=im2gray(I2);
[w2,h2]=size(I2);
for i=1:w2for j=1:h2histogram2(I2(i,j)+1)=histogram2(I2(i,j)+1)+1;%处理出每个灰度级的像素点数量end
end
n2=w2*h2;
p2=histogram2/n2;
s2=zeros(1,255);
s2(1)=p2(1);
for i=2:255s2(i)=s2(i-1)+p2(i);
end
map=zeros(1,255);%将灰度级i映射成j
for j=1:255for i=1:254if (s2(j)>=s1(i) && s2(j)<=s1(i+1))%将新图的灰度级映射成原图的灰度级,组映射if (abs(s2(j)-s1(i))<abs(s2(j)-s1(i+1)))map(i)=j;elsemap(i)=j+1;endbreakendend
end
for i=2:255if (map(i)==0)map(i)=map(i-1);end
endnewimg=zeros(w,h);
for i=1:wfor j=1:hnewimg(i,j)=map(I(i,j)+1);end
end
newimg=newimg/255;
newimg=im2uint8(newimg);
newhistogram=zeros(1,255);
for i=1:wfor j=1:hnewhistogram(newimg(i,j)+1)=newhistogram(newimg(i,j)+1)+1;end
end
subplot(3,2,1),imshow(I);title("原图")
subplot(3,2,2);bar(histogram);title("原直方图")
subplot(3,2,3);imshow(Imatch);title("被匹配图")
subplot(3,2,4);bar(histogram2);title("被匹配直方图")
subplot(3,2,5);imshow(newimg);title("新图")
subplot(3,2,6);bar(newhistogram);title("新直方图")

自行编写函数实现了直方图匹配,实现了组映射。同样的,先处理出原图每个灰度级出现的概率密度和累积概率密度,再处理被匹配图像每个灰度级的概率密度和累积概率密度。将被匹配的灰度级按照累积概率密度映射成被原图的灰度级。之后,若存在缺失值,即原图中某个灰度级被映射成的新图灰度级未知,则需要填补缺失值。得到原图的灰度级和其被映射成的灰度级的关系后,创建新图并将原图像的对应像素的灰度级的映射值填入。

实验结果


成功地实现了指数变换,可以看到新图明显地比原图更亮、对比度更高,因为s=crγs=cr^\gammas=crγ的γ<1\gamma<1γ<1。

成功地实现了对比度拉伸,使用matlab自带的imadjust函数。由于参数的选择,可以看到,部分点明显变亮,而部分像素点颜色仍然没有变化。

实现了对数变换,取参数c>1c>1c>1。可以明显地看到部分点变亮。

实现了灰度反转。

编写函数实现的函数类似于imadjust的效果,将[0,0.5][0,0.5][0,0.5]的灰度值映射到[0,1][0,1][0,1]。可以明显地看到图像变亮了。

使用系统自带的直方图均衡化函数,实现了直方图均衡化。可以看到,图像明显变亮。原本图像的灰度值分布在大约0150的范围内,在被直方图均衡化后,灰度值分布的更“均衡”了,分布在0255的范围。与前文不基于直方图的变换相比,此方法更好的保存了图像的一些细节,看起来更自然、真实。

使用自行编写的程序,实现了直方图均衡化。可以看到,自行编写的程序很好地还原了系统自带的直方图均衡化的程序的实现效果。不仅在图像上与系统自带的函数的处理结果类似,而且这一点能够在直方图的图像上体现出来。

调用了系统自带的函数,实现了直方图匹配。可以看到,被匹配的直方图在200~230的灰度级上的分布存在一个明显的高峰,所以这一高峰也体现在了直方图匹配处理后的图像上,也在200~230的灰度级上出现高峰。所以,图片明显变亮了。但是,由于被匹配图选取得过于亮,所以新图也显得过于亮了。

自行实现了直方图匹配,利用单映射的方法。可以看到,在处理的整体效果上较为还原了系统自带的函数的效果。

自行实现了直方图匹配,利用组映射的方法。虽然实现组映射的程序与单映射的程序略有区别,但是实现的效果还是类似的,殊途同归,都与调用系统自带的函数实现的效果大同小异。

四、实验小结

MATLAB数字图像处理 实验二:单像素空域图像增强相关推荐

  1. 图像处理边缘增强matlab,数字图像处理实验 matlab 图像增强 边缘检测 图像操作.doc...

    数字图像处理实验 matlab 图像增强 边缘检测 图像操作 实验1 点运算和直方图处理 实验目的 1. 掌握利用Matlab图像工具箱显示直方图的方法 2. 掌握运用点操作进行图像处理的基本原理. ...

  2. MATLAB说明图像增强,MATLAB数字图像处理(二)图像增强

    1         图像增强 1.1            直方图均衡化 对于灰度图像,可以使用直方图均衡化的方法使得原图像的灰度直方图修正为均匀的直方图. 代码如下: 1 2 3I2=histeq( ...

  3. Matlab数字图像处理 实验1、数字图像的傅里叶变换

    子曰:桃李不言,下自成蹊. 数字图像的傅里叶变换数字图像的傅里叶变换数字图像的傅里叶变换 Part.0实验目的仅限于学习交流Part.0 实验目的^{仅限于学习交流}Part.0实验目的仅限于学习交流 ...

  4. Matlab数字图像处理 实验3、图像边缘检测的计算机实现

    子曰:桃李不言,下自成蹊. 图 像 边 缘 检 测 的 计 算 机 实 现 图像边缘检测的计算机实现 图像边缘检测的计算机实现 P a r t . 0 实 验 目 的 仅 限 于 学 习 交 流 Pa ...

  5. 计算压缩比的程序matlab,数字图像处理实验5 图像压缩

    实验5 图像压缩 一.实验目的: 1.掌握图像压缩的原理--编码冗余,压缩比C R的计算等. 2.了解并掌握霍夫曼编码的原理.实现步骤. 3.掌握JPEG标准--通用的图像压缩/解压缩编码标准. 二. ...

  6. 数字图像处理实验(二)

    实验目的 实验一:图像增强 了解图像增强的目的及意义,加深对图像增强的感性认知 1. 掌握直接灰度变换的图像增强方法 2. 掌握灰度直方图的概念及其计算方法 3. 掌握直方图均衡化合直方图规定化得计算 ...

  7. 数字图像处理 实验二:图像的平滑滤波

    基于Matlab的图像的平滑滤波 DIP实验2:图像的平滑滤波 实验目的 实验内容 参考代码 实验结果 DIP实验2:图像的平滑滤波 实验目的 平滑的目的是减少噪声对图像的影响.掌握线性滤波和中值滤波 ...

  8. 使用 matlab 数字图像处理(二)—— 直方图均衡化(极简实现)

    直方图均衡化(Histogram Equalization)是一种实用性极高的直方图修正技术. 直方图均衡化又称为灰度均衡化,是指通过某种灰度映射使输入图像转换为在每一灰度级上都有近似相同的像素点数的 ...

  9. 数字图像处理实验二 图像变换

    一.实验目的 (1)了解图像变换的意义和手段. (2)熟悉傅立叶变换的基本性质. (3)通过实验了解二维频谱的分布特点. (4)了解余弦变换或Walsh-Hadamard变换 二.实验内容 任意选择几 ...

最新文章

  1. Python图像处理,cv2模块,OpenCV实现目标跟踪
  2. linux存储--共享内存机制shm(十四)
  3. 玩转Eclipse — 自动生成setter和getter方法
  4. JavaScript-面向对象详解
  5. 香草 jboss 工具_如何为JBoss Developer Studio 8设置BPM和规则工具
  6. Petapoco使用SQLite的异常问题
  7. IIS安装2个SSL_顶级域名0元撸-免费注册2个腾讯云域名 免费SSL证书
  8. 2014蓝桥杯:地宫取宝(DFS详解)
  9. Python Turtle绘图[难度2星]:横切的橙子(配色优化——邻近色/反差色)
  10. MAVEN工具篇——maven打包跳过测试
  11. Ubuntu下安装LXDE+XRDP实现远程桌面访问(最轻量级桌面)
  12. Flutter HellowWord
  13. 史上最全Java学习路线
  14. python cvxpy 报错 The solver GLPK_MI is not installed
  15. 请求报错Required String parameter 'id' is not present
  16. 服务器关闭微软小娜,win10小娜总是自动弹出怎么禁止-禁止win10小娜自动弹出的方法 - 河东软件园...
  17. Autodesk Maya 2018.6 中文特别版 Mac 顶级三维动画制作工具
  18. IIC总线协议基本原理以及GPIO虚拟IIC接口
  19. 华硕FL5900U如何关闭ahci_实战华硕B360主板RX580显卡安装苹果macOS 10.14 Mojave
  20. 个人站长创业失败的原因总结

热门文章

  1. java实验3 判断二维坐标系中2个圆的位置关系
  2. 如何套牢ceRNA研究套路
  3. How to develop a window mobile application
  4. 中文拼写纠错_中文文本纠错算法--错别字纠正的二三事
  5. 2006.9 软件俱乐部成立
  6. 儿童感染新冠后怎么用药?什么情况需要就医?
  7. 蓄电池分级分段维护方案
  8. 麻省理工学院最新研究,可穿戴传感器帮助渐冻人患者交流-1
  9. tp5分页显示的html代码,tp5分页问题
  10. HBuilder常用快捷键总结