计算机视觉学习小练习2(MATLAB)
理论基础:
1.数字形态学
以图像的形态特征为研究对象,通过设计一套独特的数字图像处理方法和理论来描述图像的基本特征和结构通过引入集合的概念来描述图像中元素与元素、部分与部分的关系运算。因此,数学形态学的运算由基础的集合运算(并、交、补等来)定义,并且所有的图像矩阵能够方便地转换为集合。
2.图像去噪方法
数字图像在获取、传输过程中都可能会受到噪声的污染,常见的噪声主要有高斯噪声和椒盐噪声。其中,高斯噪声主要由摄像机传感器元器件内部产生的,椒盐噪声主要是由图像切割所产生的黑白相间的亮暗点噪声,“椒” 表示和黑色噪声,“盐”表示白色噪声。
数字图像去噪也可以分为空域和频域来完成。空域图像去噪常用的由均值滤波算法和中值滤波算法,主要是针对图像像素领域的运算来达到去噪效果。频域图像去噪首先是对数字图像进行某种变换,将其从空域转换到频域(傅里叶变换、小波变换等),然后对频域中的变换系数进行处理,最后对图像进行反变换,将其从频域转换到空域来达到去噪效果。`
数学形态学原理参考《数字图像处理》。
为了简化算法实现步骤,具体实现过程可以选择将串联处理结果与原始图像进行差异值计算的方式来作为权值向量,在通过对串联结果加权求和的方式来进行计算。对其进行数学形态学滤波器级联滤波去噪的仿真,选区一副人脸图像,加入泊松噪声,通过构建不同的串联滤波器、并联滤波器来进行滤波去噪实验,最后在计算绘制PSNR值曲线(峰值信噪比)来显示去噪效果。主函数代码如下:
clc;clear all; close all
filename = fullfile(pwd, 'images/im.jpg');
Img = imread(filename);
if ndims(Img) == 3 %ndims是matlab中求一个数组维数的函数。
I = rgb2gray(Img);
else
I = Img:
end
Ig = imnoise(I,'poisson');
%获取算子
s = GetStrelList();
%串联去噪
e = ErodeList(Ig, s);
%计算权重
f = GetRateList(Ig, e);
%并联
Igo = GetRemoveResult(f, e);
%显示结果
figure;
subplot(1, 2 ,1); imshow(I, []); title('原图像'); %用空矩阵([])用于[低-高],imshow将使用[最小(i(:))最大(i(:)];即i中的最小值显示为黑色,最大值显示为白色。中间值为中间灰度。
subplot(1, 2 ,2); imshow(I, []); title('噪声图像');
figure;
subplot(2, 2 ,1); imshow(e.eroded_co12, []); title('串联1处理结果');
subplot(2, 2 ,2); imshow(e.eroded_co22, []); title('串联2处理结果');
subplot(2, 2 ,3); imshow(e.eroded_co32, []); title('串联3处理结果');
subplot(2, 2 ,4); imshow(e.eroded_col4, []); title('串联4处理结果');
figure;
subplot(1, 2 ,1); imshow(Ig, []); title('噪声图像');
subplot(1, 2 ,2); imshow(Igo, []); title('并联去噪图像');
获取算子函数GetStrelList将返回指定的线型算子,具体代码如下:
function s = GetStrelList()
%获取算子
%输出参数
%s ——算子结构体
%生成四种不同的串联算子来对比结果
%Strel函数主要用来构建形态学运算中的结构元素,语法为strel(shape,parameters)。shape为形状参数,即设置什么样的结构元素;parameters为控制形状参数大小方向的参数
s.co11 = strel('line',5,-45);
s.co12 = strel('line',7,-45); %为构造的线性结构元素,7为长度(size),-45为角度
%%生成串联算子
s.co21 = strel('line',5,45);
s.co22 = strel('line',7,45);
%生成串联算子
s.co31 = strel('line',3,90);
s.co32 = strel('line',5,90);
%生成串联算子
s.co41 = strel('line',3,0);
s.co42 = strel('line',5,0);
串联去噪函数ErodeList根据输入的滤波算子,通过imerode逐个处理,在进行串联处理。imdilate or imerode函数需要两个基本输入参数,即待处理的输入图像和结构元素对象。具体代码如下:
function e = ErodeList(Ig,s)
%串联去噪
%input param:Ig—图像矩阵;s—算子
%output param:e—处理结果
e.eroded_co12 = imerode(imerode(Ig,s.co11),s.co12);
e.eroded_co22 = imerode(imerode(Ig,s.co21),s.co22);
e.eroded_co32 = imerode(imerode(Ig,s.co31),s.co32);
e.eroded_co42 = imerode(imerode(Ig,s.co41),s.co42);
权值计算函数GetRateList将根据串联结果与原始图像的差异程度进行计算,求出每个处理后的差异图像矩阵的总和,最后四个矩阵总和相加得到总值。代码如下:
function f = GetRateList(Ig, e)
%计算权重
%输入参数:Ig = 图像矩阵,e = 串联结果
%输出参数:f = 结果
f.df1 = sum(sum(abs(double(e.eroded_co12)-double(Ig))));
f.df2 = sum(sum(abs(double(e.eroded_co22)-double(Ig))));
f.df3 = sum(sum(abs(double(e.eroded_co32)-double(Ig))));
f.df4 = sum(sum(abs(double(e.eroded_co42)-double(Ig))));
f.df = sum = ([f.df1 f.df2 f.df3 f.df4]);
上一步求的权值,各个矩阵的元素总和除以四个矩阵的元素总和得到权值,并联去噪函数GetRemoveResult将根据输入的权值向量、串联结果,通过加权求和的方式进行处理。
function Igo = GetRemoveResult(f,e)
%并联去噪
%输入两个参量,f—权值向量
Igo = f.df1/f.df*double(e.eroded_co12)+f.df2/f.df*double(e.eroded_co22)+f.df3/f.df*double(e.eroded_co32)+f.df4/f.df*double(e.eroded_co42);
Igo = mat2gray(Igo);
最终处理结果:明显并联去噪效果更好。