matlab 直方图均衡化、规定化 ,线性灰度级变换实现图像增强

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

二、实验环境
Matlab

三、实验内容
(一)、题目
1、对一幅低对比度分辨率的图像采用除直方图处理方法之外的灰度级变换方法实现图像增强。

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

(二)、相关知识

1、灰度级变换方法

灰度变换是基于点操作的增强方法,它将每一个像素的灰度值按照一定的数学变换公式转换为一个新的灰度值,如增强处理中的对比度增强。对比度增强可以采用线性拉伸和非线性拉伸。

线性拉伸可以将原始输入图像中的灰度值不加区别地扩展。如果要求对局部扩展拉伸某一范围的灰度值,或对不同范围的灰度值进行不同的拉伸处理时,采用分段线性拉伸。非线性拉伸常采用对数扩展和指数扩展。对数扩展拉伸低亮度区,压缩高亮度区;指数扩展拉伸了高亮区,压缩了低亮度区。

灰度变换函数描述了输入灰度值和输出灰度值之间变换关系,一旦灰度变换函数确定下来了,那么其输出的灰度值也就确定了。用于图像灰度变换的函数主要有以下三种:线性函数、对数函数和幂律函数。

2、线性变换原理解释

图像的灰度集中在较亮的区域而导致图像偏亮,这个时候可以对图像的每一个像素灰度作线性拉伸。

原图像f(i,j)的灰度范围为[a,b],线性变换后图像g(i,j)的范围为[a1,b1],关系式为:g( i , j ) = a1 + ( b1 - a1)/( b - a )*[ f( i ,j ) - a ]
3、直方图均衡化

直方图均衡化是通过灰度变换将一幅图像转换为另一幅具有均衡直方图的图像,即在每个灰度级上都具有相同的象素点数的过程。处理后的图像直方图分布更均匀,图像在每个灰度级上都有像素点。从处理前后的图像可以看出,许多在原始图像中看不清楚的细节在直方图均衡化处理后所得到的图像中都变得十分清晰。

均衡化:建立映射表s,再根据映射表对各个像素进行映射变换。
在这里插入图片描述

4、规定化方法

直方图规定化就是通过一个灰度映像函数,将原灰度直方图改造成所希望的直方图,其关键是灰度映像函数。

5、系统自带函数

imhist(f):画出直方图函数,参数为要处理的图像
histeq(f):直方图均衡化函数,参数为要处理的图像
histeq(f,g2):直方图规定化函数,第一个参数为要处理的图像,第二个参数可为目标直方图或灰度级个数

(三)、代码

线性变化以及直方图均衡化和规定化系统函数调用 源文件

close all;clear all;clc;

%获取灰度图像的直方图
I=imread('girl.jpg');
row=size(I,1);  %图像的行
col=size(I,2);  %图像的列
N=zeros(1,256);  %创建1256列的零矩阵
for i=1:row
    for j=1:col
        k=I(i,j);
        N(k+1)=N(k+1)+1;  %统计各个灰度值的像素数 灰度值范围0-255
    end
end
figure,
subplot(221),imshow(I);title("原图像");
subplot(222),bar(N);title("原图像直方图");  %绘制直方图
axis tight;  %设置坐标轴

%利用直方图增强图像
%图像的灰度值主要集中在150-255之间,需要将小于150的灰度值设置为0
%原图像的灰度值设为x,增强图像的灰度值设为y,(x-150)/(255-x)=(y-0)/(255-y),化简得y=255(x-150)/105


%调整灰度图像的灰度范围去增强图像
%I=imread('girl.jpg');
I=double(I);
J=(I-150)*255/105;  %具体调整方案
% row=size(I,1);  %图像的行
% col=size(I,2);  %图像的列
for i=1:row
    for j=1:col
        if(J(i,j)<0)  %灰度小于0像素的直接赋值为0
            J(i,j)=0;
        end
        if J(i,j)>255;  %计算后,灰度大于255的像素直接赋值为最大的255
            J(i,j)=255;
        end
    end
end
figure;
subplot(221),imshow(uint8(I));title("原图像");%原图  显示时,修改图像的数据格式为uint8类型
subplot(222),imhist(uint8(I));title("原图像直方图");%查看灰度直方图
subplot(223),imshow(uint8(J));title("线性变换增强图像");  %显示线性增强结果图像 显示时,修改图像的数据格式为uint8类型
subplot(224),imhist(uint8(J));title("线性变换增强图像直方图");%查看灰度直方图


%线性变换
%I= imread('girl.jpg');
a1 = 0;
b1 = 255;%线性变换后的范围
a = 150;
b = 255;%原图像范围
A1 = a1+(b1-a1)/(b-a)*(I-a);
for i=1:row
    for j=1:col
        if(A1(i,j)<0)  %灰度小于0像素的直接赋值为0
            A1(i,j)=0;
        end
        if A1(i,j)>255;  %计算后,灰度大于255的像素直接赋值为最大的255
            A1(i,j)=255;
        end
    end
end
figure;
subplot(221),imshow(uint8(I));title("原图像");%原图
subplot(222),imhist(uint8(I));title("原图像直方图");%查看灰度直方图
subplot(223),imshow(uint8(A1));title("线性变换增强图像");  %显示线性增强结果图像 显示时,修改图像的数据格式为uint8类型
subplot(224),imhist(uint8(A1));title("线性变换增强图像直方图");%查看灰度直方图

I=imread('girl.jpg');
%直方图均衡化:将原图像的直方图通过变换函数修正为均匀的直方图,然后按均衡直方图修改原图像。
A2 = histeq(I,64);%histeq(),第一个参数为要处理的图像,第二个参数为处理后的灰度级个数。
%直方图规定化:使原图像灰度直方图变成规定形状的直方图来对图像作修正,直方图均衡化是直方图规定化的一个特例。
h=0:255;
h=1-h/255;%目标直方图
A3 = histeq(I,h);

figure;
subplot(321),imshow(uint8(I));title("原图像");%原图
subplot(322),imhist(uint8(I));title("原图像直方图");%查看直方图
subplot(323),imshow(A2);title("直方图均衡化系统函数增强图像");  %显示线性增强结果图像
subplot(324),imhist(A2);title("直方图均衡化系统函数增强图像直方图");%查看直方图
subplot(325),imshow(A3);title("直方图规定化系统函数增强图像");  %显示线性增强结果图像
subplot(326),imhist(A3);title("直方图规定化系统函数增强图像直方图");%查看直方图


figure;imhist(h);title("规定化系统函数  被匹配的直方图");%被匹配的直方图图像显示

自己编写函数实现直方图均衡化和规定化(匹配)

f=imread('girl.jpg');
f1=imread('tree.jpg');
%f=rgb2gray(f);
%f1=rgb2gray(f1);
g1=imhist(f);%画出直方图
g2=imhist(f1);

%均衡化
[M,N]=size(f);%返回数组每一维的大小
pr=g1/M/N;
s=[];
s2=0;
L=size(pr);
for i=1:L           %映射规则
    s1=(L-1)*pr(i);
    s2=s2+s1;
    s=[s;s2];
end
s=s(:,1);

f_1=zeros(size(f));%zeros(n)产生n×n的全0方阵

%for i=1:M*N        %映射图像
for i=1:M        %映射图像
    for j =1:N
    f_1(i,j)=s(f(i,j)+1)-1;
    end
end
figure;
subplot(2,2,1);imshow(f);title('原图像');
subplot(2,2,2);imhist(f);title('原图像直方图');
subplot(2,2,3);imshow(uint8(f_1));title('均衡化图像');
subplot(2,2,4);imhist(uint8(f_1));title('均衡化图像直方图');

%规定化
[M1,N1,R]=size(f1);  %匹配图像均衡化
pr1=g2/M1/N1;
s_1=[];
s2=0;
L=size(pr1,1);
for i=1:L            %映射规则
    s1=(L-1)*pr1(i);
    s2=s2+s1;
    s_1=[s_1;s2];
end
s_1=s_1(:,1);
f_11=zeros(size(f1));

for i=1:M1*N1*R      %被均衡化的匹配图像
    if(f1(i)==0)
        f_11(i)=s_1(1);
    else
        f_11(i)=s_1(f1(i));
    end   
end
figure
subplot(2,2,1);imshow(f1);title('匹配图像');
subplot(2,2,2);imhist(f1);title('匹配图像直方图');
subplot(2,2,3);imshow(uint8(f_11));title('均衡化图像');
subplot(2,2,4);imhist(uint8(f_11));title('均衡化图像直方图');

[M1,N1]=size(f1);  %规定化(映射)
s=uint8(round(s)); %四舍五入取整,原图像映射表
s_1=uint8(round(s_1));%匹配图像映射表
s_2=zeros([L,1]);  %最终映射表
j=1;
for i=1:L   %求最终映射表
    a=find(s_1==s(i));
    if(a)
        if((i>2)&&(a(j)==s_2(i)))   %if((i>1)&&(a(j)==s_2(i-1)))
            j=j+1;
            if (j>=length(a))
                j=length(a);
            end
        else
            j=1;
        end
        b=a(j);
    else
        b=zhidao_nearest(double(s_1),s(i));
    end 
    s_2(i)=b;
end

f_2=zeros(size(f)); %像素通过映射表匹配
% for i=1:M*N
%     f_2(i)=s_2(f(i));
% end
for i=1:M        %映射图像
    for j =1:N
    f_2(i,j)=s_2(f(i,j)+1)-1;
    end
end

figure
subplot(2,3,1);imhist(f);title('原图像直方图');
subplot(2,3,2);imhist(f1);title('匹配图像直方图');
subplot(2,3,3);imhist(uint8(f_2));title('匹配后图像直方图');
subplot(2,3,4);imshow(f);title('原图像');
subplot(2,3,5);imshow(f1);title('匹配图像');
subplot(2,3,6);imshow(uint8(f_2));title('匹配后图像');

function y=zhidao_nearest(A,b) %查最接近数的下标
[Asort,index]=sort(abs(A(:)-double(b)));
y=A(index(1));
end

(四)、实验结果

1、采用线性变换方法实现图像增强结果(图1)

matlab 直方图均衡化、规定化 ,线性灰度级变换实现图像增强_第1张图片

图1 线性变化结果
2、采用系统函数直方图均衡化和规定化方法(单映射或组映射)实现图像增强。
matlab 直方图均衡化、规定化 ,线性灰度级变换实现图像增强_第2张图片
图2 系统函数处理结果
matlab 直方图均衡化、规定化 ,线性灰度级变换实现图像增强_第3张图片

图3 直方图规定化目标直方图

3、利用直方图均衡化和规定化方法自己编写函数实现图像增强。
matlab 直方图均衡化、规定化 ,线性灰度级变换实现图像增强_第4张图片
图4 原图均衡化处理结果
matlab 直方图均衡化、规定化 ,线性灰度级变换实现图像增强_第5张图片

图5 匹配图像均衡化处理结果
matlab 直方图均衡化、规定化 ,线性灰度级变换实现图像增强_第6张图片
图6 自己编写函数图像增强处理结果

你可能感兴趣的:(图像处理matlab,matlab,图像处理)