for pointIter = 1:pointNumber
%floor函数表示对小数进行向下取值
row = floor(height * rowLocation(pointIter)); %获得每个雪花团的真正行坐标
col = floor(width * colLocation(pointIter));%获得每个雪花团的真正列坐标
xsize = floor(pointSize * rsize(pointIter));%获得每个雪花团的真正半长
%防止行列坐标下溢
if (row <= 0)
row = 1;
end
if (col <= 0)
col = 1;
end
%防止雪花团的大小为0
if (xsize <= 0)
xsize = 1;
end
%确定当前雪花团所占有的区域
startRow = row - xsize;
stopRow = row + xsize;
startCol = col - xsize;
stopCol = col + xsize;
%进行边界处理,防止雪花团所占有的区域越出图像区域
startRow = max(startRow,1);%防止行上溢
stopRow = min(stopRow,height);%防止行下溢
startCol = max(startCol,1);%防止列左溢
stopCol = min(stopCol,width);%防止列右溢
%对雪花团所占有的区域设定最高值255,以表示白色的雪花团
maskImage(startRow:stopRow,startCol:stopCol) = 255;
end
%---------------------------------------------------------------------------------------------------------------------------------------
代码段1仅仅是对雪花团的位置和大小进行确定,所获得的雪花团都是一个个小正方块,不能直接用于和原始图像进行合成,而必须借助于静态模糊和动态模糊技术,才能获得比较真实的雪花团效果。代码段2采用了Matlab的两个函数fspecial和imfilter,其中前者指定模糊算子,而后者用模糊算子对初始雪花团图像进行滤波处理。关于两者的详细说明,可参考Matlab在线帮助文档。
%---------------------------------------------------------------------------------------------------------------------------------------
%代码段2
function [outputMaskImage] = sub_constructSnowEffect(maskImage,style,hsize,sigma,len,theta)
%函数功能:
% 对随机雪花团的初始图像进行模糊处理
%参数说明:
% 输入参数:
% maskImage:sub_makeRandPoints的输出结果图像
% style:决定是使用高斯模糊还是使用圆盘模糊,style为1为高斯模糊,否则为圆盘模糊
% hsize:用于控制高斯/圆盘模糊的模糊半径,该值越大,雪花团越模糊
% sigma:用于控制高斯/圆盘模糊的模糊方差,该值越大,雪花团越模糊
% len:用于控制动态模糊的程度,该值越大,雪花团动态模糊效果越明显
% theta:用于控制雪花团动态运动方向,该值以逆时针方向为正方向
% 输出参数:
% outputMaskImage:保存随机雪花团的动态模糊结果图像
%--------------------------------------------------------------------------
if (nargin <= 1)%如果输入参数个数小于等于1,提示用户参数参数太少并返回主程序
errordlg('Not enough input arguments!');
return;
end
if (style == 1)
h = fspecial('gaussian',hsize,sigma);%指定高斯模糊算子
maskImage = imfilter(maskImage,h);%进行模糊滤波处理
%figure,imshow(maskImage,[]);
else
h = fspecial('disk',hsize);%指定圆盘模糊算子
maskImage = imfilter(maskImage,h);%进行模糊滤波处理
end
|