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

简介: MATLAB数字图像处理 实验二:单像素空域图像增强

一、实验目的

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

二、实验环境

Matlab 2020B

三、实验内容

题目

1)对一幅低对比度分辨率的图像采用除直方图处理方法之外的灰度级变换方法实现图像增强。(图自选)

2)对一幅低对比度分辨率的图像采用直方图均衡化和规定化方法(单映射或组映射)实现图像增强,分别采用系统函数和自己编写函数实现相应用功能。(图自选)

3)写出实验报告。报告要求:实验目的、实验内容、实验过程、实验小结和较详细的图文说明。

相关知识

对于低分辨率的图像,可以用基于空域图像增强的方法。除了直方图处理方法,还可以使用灰度反转、对数变换、指数变换、对比度拉伸、灰度切片等。

image.png


直方图匹配(规定化)也使用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:w
    for j=1:h
        I_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 = c r γ 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:row
    for j=1:col
        if(A1(i,j)<0)
            A1(i,j)=0;
        end
        if A1(i,j)>1
            A1(i,j)=1;
        end
    end
end
imshow(A1)

image.png

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:w
    for j=1:h
        I_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 = 2 c=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:w
    for j=1:h
        I1(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:w
    for j=1:h
        histogram(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:255
    s(i)=s(i-1)+p(i);
end
newimg=zeros(w,h);%新图
for i=1:w
    for j=1:h
        newimg(i,j)=s(I(i,j)+1);%新图对应像素点值为原图对应像素点值*灰度级数。但在此代码中,使用double存图
    end
end
imshow(newimg)
newimg=im2uint8(newimg);
newhistogram=zeros(1,255);
for i=1:w
    for j=1:h
        newhistogram(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:w
    for j=1:h
        histogram(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:255
    s1(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:w2
    for j=1:h2
        histogram2(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:255
    s2(i)=s2(i-1)+p2(i);
end
map=zeros(1,255);%将灰度级i映射成j
for i=1:255
    for j=1:254
        if (s1(i)>=s2(j) && s1(i)<=s2(j+1))%将原图的灰度级与新图的灰度级匹配
            if (abs(s1(i)-s2(j))<abs(s1(i)-s2(j+1)))%匹配到概率密度最接近的点
                map(i)=j;
            else
                map(i)=j+1;
            end
            break
        end
    end
end
newimg=zeros(w,h);%新图
for i=1:w
    for j=1:h
        newimg(i,j)=map(I(i,j)+1);%按照匹配关系将原图像素点映射到新图
    end
end
newimg=newimg/255;
newimg=im2uint8(newimg);
newhistogram=zeros(1,255);
for i=1:w
    for j=1:h
        newhistogram(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:w
    for j=1:h
        histogram(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:255
    s1(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:w2
    for j=1:h2
        histogram2(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:255
    s2(i)=s2(i-1)+p2(i);
end
map=zeros(1,255);%将灰度级i映射成j
for j=1:255
    for i=1:254
        if (s2(j)>=s1(i) && s2(j)<=s1(i+1))%将新图的灰度级映射成原图的灰度级,组映射
            if (abs(s2(j)-s1(i))<abs(s2(j)-s1(i+1)))
                map(i)=j;
            else
                map(i)=j+1;
            end
            break
        end
    end
end
for i=2:255
    if (map(i)==0)
        map(i)=map(i-1);
    end
end
newimg=zeros(w,h);
for i=1:w
    for j=1:h
        newimg(i,j)=map(I(i,j)+1);
    end
end
newimg=newimg/255;
newimg=im2uint8(newimg);
newhistogram=zeros(1,255);
for i=1:w
    for j=1:h
        newhistogram(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 = c r γ s=cr^\gammas=crγγ < 1 \gamma<1γ<1

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

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

实现了灰度反转。

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

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

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

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

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

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

四、实验小结


目录
相关文章
|
1月前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
2月前
|
机器学习/深度学习 编解码 Android开发
MATLAB Mobile - 使用预训练网络对手机拍摄的图像进行分类
MATLAB Mobile - 使用预训练网络对手机拍摄的图像进行分类
41 0
|
3月前
|
算法
基于粒子群优化的图像融合算法matlab仿真
这是一个基于粒子群优化(PSO)的图像融合算法,旨在将彩色模糊图像与清晰灰度图像融合成彩色清晰图像。在MATLAB2022a中测试,算法通过PSO求解最优融合权值参数,经过多次迭代更新粒子速度和位置,以优化融合效果。核心代码展示了PSO的迭代过程及融合策略。最终,使用加权平均法融合图像,其中权重由PSO计算得出。该算法体现了PSO在图像融合领域的高效性和融合质量。
|
4月前
|
机器学习/深度学习 算法 固态存储
m基于深度学习的卫星遥感图像轮船检测系统matlab仿真,带GUI操作界面
在MATLAB 2022a中,使用GoogLeNet对卫星遥感图像进行轮船检测,展示了高效的目标识别。GoogLeNet的Inception架构结合全局平均池化增强模型泛化性。核心代码将图像切块并分类,预测为轮船的部分被突出显示,体现了深度学习在复杂场景检测中的应用。
391 8
|
4月前
|
算法 计算机视觉 异构计算
基于FPGA的图像一维FFT变换IFFT逆变换verilog实现,包含tb测试文件和MATLAB辅助验证
```markdown ## FPGA 仿真与 MATLAB 显示 - 图像处理的 FFT/IFFT FPGA 实现在 Vivado 2019.2 中仿真,结果通过 MATLAB 2022a 展示 - 核心代码片段:`Ddddddddddddddd` - 理论:FPGA 实现的一维 FFT/IFFT,加速数字信号处理,适用于高计算需求的图像应用,如压缩、滤波和识别 ```
|
4月前
|
算法 计算机视觉
基于Chan-Vese算法的图像边缘提取matlab仿真
**算法预览展示了4幅图像,从边缘检测到最终分割,体现了在matlab2022a中应用的Chan-Vese水平集迭代过程。核心代码段用于更新水平集并显示迭代效果,最后生成分割结果及误差曲线。Chan-Vese模型(2001)是图像分割的经典方法,通过最小化能量函数自动检测平滑区域和清晰边界的图像分割,适用于复杂环境,广泛应用于医学影像和机器视觉。**
|
5月前
|
算法 数据安全/隐私保护 C++
基于二维CS-SCHT变换和扩频方法的彩色图像水印嵌入和提取算法matlab仿真
该内容是关于一个图像水印算法的描述。在MATLAB2022a中运行,算法包括水印的嵌入和提取。首先,RGB图像转换为YUV格式,然后水印通过特定规则嵌入到Y分量中,并经过Arnold置乱增强安全性。水印提取时,经过逆过程恢复,使用了二维CS-SCHT变换和噪声对比度(NC)计算来评估水印的鲁棒性。代码中展示了从RGB到YUV的转换、水印嵌入、JPEG压缩攻击模拟以及水印提取的步骤。
|
4月前
|
算法 计算机视觉 异构计算
基于FPGA的图像直方图均衡化处理verilog实现,包含tb测试文件和MATLAB辅助验证
摘要: 在FPGA上实现了图像直方图均衡化算法,通过MATLAB2022a与Vivado2019.2进行仿真和验证。核心程序涉及灰度直方图计算、累积分布及映射变换。算法旨在提升图像全局对比度,尤其适合低对比度图像。FPGA利用可编程增益器和查表技术加速硬件处理,实现像素灰度的均匀重分布,提升视觉效果。![image preview](https://ucc.alicdn.com/pic/developer-ecology/3tnl7rfrqv6tw_a075525027db4afbb9c0529921fd0152.png)
|
5月前
|
算法 异构计算
基于直方图的图像曝光量分析FPGA实现,包含tb测试文件和MATLAB辅助验证
该内容包括了算法的运行效果展示、软件版本信息、理论概述和核心程序代码。在正常图像中,`checkb`位于`f192b`和`f250b`之间,而多度曝光图像中`checkb`超出此范围,判断为曝光过度。使用的软件为Vivado 2019.2和MATLAB 2022a。理论依据未详细给出,但提及主要方法。提供的Verilog代码段用于处理图像数据,包括读取文件、时钟控制及图像histogram计算等,其中模块`im_hist`似乎是关键部分。
|
5月前
|
存储 算法 数据可视化
基于harris角点和RANSAC算法的图像拼接matlab仿真
本文介绍了使用MATLAB2022a进行图像拼接的流程,涉及Harris角点检测和RANSAC算法。Harris角点检测寻找图像中局部曲率变化显著的点,RANSAC则用于排除噪声和异常点,找到最佳匹配。核心程序包括自定义的Harris角点计算函数,RANSAC参数设置,以及匹配点的可视化和仿射变换矩阵计算,最终生成全景图像。

热门文章

最新文章

下一篇
无影云桌面