本实例展示如何创建和实施对于图片外围像素具有快速滤波效果的滤波器。
读取并展示一张图片。
I = imread('peppers.png');
%译者注:因为matlab中多数图片处理函数以double型图像数据为输入对象,
%所以这里使用im2double将图片数据转化为double类型(范围为[0 1])。有些
%真彩图片的类型原本就是double类型,数据可能超过范围[0 1],
%我们在处理前要先用rescale函数将其转换到范围[0 1]。
I = im2double(I);
figure,imshow(I);
通过使用标准差2的高斯滤波器创建一个该图片的模糊副本。
Iblurred = imgaussfilt(I,2);
figure,imshow(Iblurred)
使用fspecial来创建一个尺寸和图片一般大的高斯滤波权值矩阵。如需提升图片清晰部分的范围,增大filterStrength的值即可。
filterStrength = 50;
weights = fspecial('gaussian',[size(I,1) size(I,2)],filterStrength);
figure,imshow(weights,[])
使用rescale函数将滤波权值矩阵归一化到范围[0 1]。
weights = rescale(weights);
通过将权值滤波后的图片和模糊图片相加的方法,生成权值模糊图片。MATLAB自动复制权值矩阵weights作用于R,G,B三个通道。
IweightedBlurred = I.*weights + Iblurred.*(1-weights);
画出结果图。可见图片在中间位置保持原先的清晰度,但其四周是模糊的。
figure,imshow(IweightedBlurred)
先求得图片的尺寸。
sizex = size(I,2);
sizey = size(I,1);
确定晕影的中心。
xcenter = size(I,2)/2;
ycenter = size(I,1)/2;
确定网格点。
[X,Y] = meshgrid((1:sizex)-xcenter,(1:sizey)-ycenter);
确定每一个点(x,y)距中心点的半径。
R2 = X.^2 + Y.^2;
设定R的倒数作为晕影权值(译者注:此处存疑,因为下面他使用的是1-R而不是1/R),并将其归一化到区间[0 1]。
R2 = rescale(R2);
weights = (1-R2);
figure,imshow(weights)
I2 = I.*weights;
figure,imshow(I2)