(1)直方图均衡化及直方图匹配;
(2)空间滤波(均值滤波及中值滤波),并计算信噪比。
1.直方图均衡化
图1 直方图均衡化
2.直方图匹配
图2 直方图匹配
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.