Matlab直方图均衡化及直方图匹配, 空间滤波(均值滤波及中值滤波),并计算信噪比

一.内容

(1)直方图均衡化及直方图匹配;

(2)空间滤波(均值滤波及中值滤波),并计算信噪比。

二.结果

1.直方图均衡化

 

 Matlab直方图均衡化及直方图匹配, 空间滤波(均值滤波及中值滤波),并计算信噪比_第1张图片

1 直方图均衡化

 

2.直方图匹配

 Matlab直方图均衡化及直方图匹配, 空间滤波(均值滤波及中值滤波),并计算信噪比_第2张图片

2 直方图匹配

3.空间滤波

 Matlab直方图均衡化及直方图匹配, 空间滤波(均值滤波及中值滤波),并计算信噪比_第3张图片

3 空间滤波


三.程序完整代码

主程序:

%第一部分:直方图均衡及直方图匹配
%直方图均衡化    
clear;  
L = 256;%灰度级
I = imread('pic.jpg');   
x = rgb2gray(I);
y = x;
z = x;
[height,width] = size(x);    
figure    
subplot(221)    
imshow(x)%显示原始图像 
title('原始图像')
subplot(222)    
h = imhist(x)/(height*width);%显示原始图像直方图 
bar(0:1/(L-1):1,h);
axis([0 1 0 0.02]),grid;
title('原始图像直方图')  
 
%进行像素灰度统计;    
n = zeros(1,L);%统计各灰度数目,共L个灰度级    
for i = 1:height    %开始扫描统计
    for j = 1: width    
        n(x(i,j) + 1) = n(x(i,j) + 1) + 1;%扫描出一个灰度值,对应灰度值像素点数量增加一    
    end    
end    
%计算灰度分布密度    
p = zeros(1,L);    
for i = 1:L    
    p(i) = n(i) / (height * width * 1.0); %p=n/M*N   
end    
%计算累计直方图分布,即求s(k)    
s = zeros(1,L);    
s(1) = p(1);  
for i = 2:L     
        s(i) = s(i - 1) + p(i);    
end    
%累计分布取整,将其数值归一化为1~L的c(均衡化后的直方图的值)   
c = int16((L-1) * s + 0.5); %此处+0.5防止去整前有低于0.5的值(会被记为0,无效)   
%对图像进行均衡化  
for i = 1:height    
    for j = 1:width    
        y(i,j) = c(x(i,j) + 1);    
    end    
end    
 
subplot(223)    
imshow(y)%显示均衡化后的图像
title('直方图均衡化后的图像')
subplot(224)    
h = imhist(y) / (height * width);%显示均衡化后的图像的直方图  
bar(0:1/(L-1):1,h);
axis([0 1 0 0.02]),grid;
title('均衡化后的直方图')
 
p = zeros(1,L);
d = 1 / (128 * 127);
for i = 1:128
    p(i) = (128 - i) * d;
end
for i = 129:L
    p(i) = (i - 129) * d;
end
 
%计算变换函数G的所有值    
G = zeros(1,L);    
G(1) = p(1);  
for i = 2:L     
        G(i) = G(i - 1) + p(i);    
end 
%对G取整,将其数值归一化为1~L的g 
g = int16((L-1) * G + 0.5); %此处+0.5防止去整前有低于0.5的值(会被记为0,无效)
 
%计算原图像与目标图像累计直方图数值差的绝对值?????
ScMin=zeros(L,L);
for i = 1:L
    for j = 1:L
        ScMin(i,j) = abs(c(i) - g(j));
    end
end
 
%建立映射?
HisM = zeros(1,L);
for i = 1:L
    min = 0; 
    minV = ScMin(1,i);
    for j = 1:L
        if(minV > ScMin(i,j))
            minV = ScMin(i,j);
            min = j;
        end
    end
    HisM(i) = min;
end
%图像规定化
for i = 1:height    
    for j = 1:width    
        z(i,j) = HisM(x(i,j));    
    end    
end  
figure
subplot(221)    
imshow(z)%显示规定化后的图像
title('直方图规定化后的图像')
subplot(223)
bar(0:1/(L-1):1,p)
axis([0 1 0 0.01]),grid;
title('规定的直方图')
subplot(224)    
h = imhist(z) / (height * width);%显示规定化后的图像的直方图  
bar(0:1/(L-1):1,h);
axis([0 1 0 0.02]),grid;
title('规定化后的直方图')
 
%第二部分:空间滤波
I1 = imnoise(y,'gaussian',0.1,0.002);%给均衡化后的图像添加高斯噪声
I2 = imnoise(x,'salt & pepper',0.02);%给规定化后的图像添加椒盐噪声,0.02是噪声强度,其值越大噪声越多
 
figure
subplot(321)
imshow(I1)
title('加入高斯噪声的直方图均衡化后的图像','fontsize',10); %显示加入噪声之后的图像 
 
subplot(322)
imshow(I2)
title('加入椒盐噪声的直方图规定化后的图像','fontsize',10); %显示加入噪声之后的图像
 
%用自己的编写的函数进行均值滤波  
Y1 = avg_filter(I1,3);     %调用自编函数进行均值滤波,模板大小为3  
PSNR = cal_psnr(I1,Y1);
subplot(323)
imshow(Y1)
title({'对均衡化直方图均值滤波之后的结果';['峰值信噪比为:' num2str(PSNR)]},'fontsize',10); %显示滤波后的图像
 
Y2 = avg_filter(I2,3);     %调用自编函数进行均值滤波,模板大小为3  
PSNR = cal_psnr(I2,Y2);
subplot(324)
imshow(Y2)
title({'对规定化直方图均值滤波之后的结果';['峰值信噪比为:' num2str(PSNR)]},'fontsize',10); %显示滤波后的图像
 
%用自己的编写的函数进行中值滤波  
Y3 = mid_filter(I1,3);      %调用自己编写的函数进行中值滤波,n为模板大小为3   
PSNR = cal_psnr(I1,Y3);
subplot(325)
imshow(Y3)
title({'对均衡化直方图中值滤波之后的结果';['峰值信噪比为:' num2str(PSNR)]},'fontsize',10); 
 
Y4 = mid_filter(I2,3);      %调用自己编写的函数进行中值滤波,n为模板大小为3   
PSNR = cal_psnr(I2,Y4);
subplot(326)
imshow(Y4)
title({'对规定化直方图中值滤波之后的结果';['峰值信噪比为:' num2str(PSNR)]},'fontsize',10); 


函数:

中值滤波器函数:

%自编的中值滤波函数。x是需要滤波的图像,n是模板大小(即n×n)
function d=mid_filter(x,n)   
[height, width]=size(x);   %输入图像是p×q的,且p>n,q>n
x1=double(x);
x2=x1;
for i=1:height-n+1
    for j=1:height-n+1
        c=x1(i:i+(n-1),j:j+(n-1)); %取出x1中从(i,j)开始的n行n列元素,即模板(n×n的)
        e=c(1,:);      %是c矩阵的第一行
        for u=2:n
            e=[e,c(u,:)];     %将c矩阵变为一个行矩阵    
        end
        mm=median(e);      %mm是中值
        x2(i+(n-1)/2,j+(n-1)/2)=mm;   %将模板各元素的中值赋给模板中心位置的元素
    end
end 
%未被赋值的元素取原值
d=uint8(x2);

均值滤波器函数:

%x是需要滤波的图像,n是模板大小(即n×n)  
function d=avg_filter(x,n)     
a(1:n,1:n)=1;   %a即n×n模板,元素全是1  
[height, width]=size(x);   %输入图像是hightxwidth的,且hight>n,width>n  
x1=double(x);  
x2=x1;  
for i=1:height-n+1  
    for j=1:width-n+1  
        c=x1(i:i+(n-1),j:j+(n-1)).*a; %取出x1中从(i,j)开始的n行n列元素与模板相乘  
        s=sum(sum(c));                 %求c矩阵中各元素之和  
        x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %将与模板运算后的各元素的均值赋给模板中心位置的元素  
    end  
end  
%未被赋值的元素取原值  
d=uint8(x2);  
 


信噪比计算函数:

function PSNR = cal_psnr(Matrix1,Matrix2) %计算MSE和PSNR(均方误差和峰值信噪比)
 
%***************************************************
 
Matrix1 = double(Matrix1);
Matrix2 = double(Matrix2);
%Matrix1 Matrix2分别代表原始的图像矩阵和处理后的图像矩阵,在matlab中图像是被离散成为矩阵形式的。
 
[height,width] = size(Matrix1);
%Matrix1 Matrix2的行数和列数,二者必须同样大小。?
 
Tmp_Matrix = 0;%设定的临时矩阵?
coef = 1/(height * width);
 
%图像像素的总数的倒数,用来平均两个图像的方差。
for m = 1:height %m为行数?
    for n = 1:width %n为列数?
    Temp = Matrix1(m,n) - Matrix2(m,n)
    %每个图像对应位置的像素值(或灰度)做差值处理。?
    Tmp_Matrix = Tmp_Matrix + Temp * Temp; 
    %差值的平方值?
    end
end
 
MSE = coef * Tmp_Matrix;
%处理后图像与原始图像的均方差?
PSNR = 10 * log10(L / MSE);
%峰值信噪比的公式,单位是分贝dB,max(Matrix2(:))一般取255.


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