图像合成
邻域处理与模板运算
邻点及邻域
图像是由像素构成的。图像中相邻的像素构成邻域,邻域中的像素点互为邻点。以某个像素点(z,2)为中心,处于其上、下、左、右4个方向上的像素点称为它的4 邻点,再加上左上、右上、左下、右下4个方向的点就称为它的8邻点。像素的4 邻点和8 邻点由于与像素直接邻接,因此在邻域处理中较为常用。像素邻点的集合构成了一个像素的邻域。有时,在图像处理中也将中心像素和它的特定邻点合称为邻域。邻域的位置由中心像素决定,大小一般用边长表示。如图给出了包含中心像素在内的3×3邻域和5×5 邻域。
2.邻域处理与模板运算
在图像处理中,邻域处理通常是以包含中心像素在内的邻域为分析对象的。经过邻域处理后得到的像素结果灰度值来源于对邻域内像素的灰度的计算结果。邻域处理能够将像素关联起水,因此广泛应用于图像处理当中。模板,通常也称滤波器(filters)、核(kernels)、掩膜 (templates)或窗口(windows),用-个小的二维阵列来表示(如3×3)。通常把对应的模板上的值称为加权系数模板操作实现了一种邻域运算,即某个像素点的结果不仅和本像素灰度值有关,而且和其邻点的值有关模板运算的数学含义是卷积(或互相关)运算,模板就是卷积运中的卷积核。图像的卷积运算实际是通过模板在图像上的移动完成的,在图像处理中,不断在图像上移动模板的位置,每当模板的中心对准一个像素 ,此像素所在邻域内的每个像素分别与模板中的每-加权系数相乘,乘积求和所得结果即为该像素的滤波输出结果,这样,对图像中的每个邻域依次重复上述过程,直到模板遍历图像中所有可能位置。
但是,对一幅图像进行邻域模板运算的过程中,当模板中心与图像外围像素点重合时•模板的部分行和列可能会处于图像平面之外,没有相应的像素值与模板数据进行运算。对手这种问题,需要采用一定的措施来解决。
假设模板是大小为1Xn 的方形模板,对于图像中行和列方向上距离边缘小于(n-1)/2个像素的形成区城,采用的方法是:
(1)保留该区域中原始像素灰度值不变.
(2)在图像边缘以外再补上(n-1)/2行和(n-1)/2列,对应的灰度值可以补零,也可以将边缘像素灰度值进行复制过来。补充在边缘以外的 这(n-1)/2行和(n-1)/2列在进行模板运算处理后要去除掉
有一幅蝴蝶的图片和一幅风景图片,试基于 MATLAB 编程,基于几何、代数和色彩通道运算,实现漫天蝴蝶飞舞的合成图像。
解:设计思路如下:
对蝴蝶图片进行随机变换后叠加到风景图片上,依次进行的随机变换为三种几何变换、交换两个色彩通道、叠加到风景图片随机位置上。
程序如下:
clear,clc,close all;
Image=imread('butterfly.bmp');
Back=imread('IMG3_13.jpg');
subplot(131),imshow(Image),title('蝴蝶');
subplot(132),imshow(Back),title('背景');
[h w c]=size(Back);
population=20; %随机产生20只蝴蝶
num=3; %拟进行几何变化的种类数
for k=1:population
type=randi(6,1,num); %在缩小、旋转、三种镜像及错切六种几何变化中随机选择三种
NewImage=Image;
for n=1:num
switch type(n)
case 1 %scale 比例变化
scale=rand(); %缩小比例随机生成
NewImage=imresize(NewImage,scale,'bilinear'); %缩小变化,双线性插值
case 2 %rotate 旋转变换
angle=round(rand()*100); %逆时针旋转角度随机生成
NewImage=imrotate(NewImage,angle,'bilinear'); %旋转变换,双线性插值
case 3 %shear 错切变换
shear=rand()/2; %错切系数:0-0.5
tform1=maketform('affine',[1 0 0;shear 1 0; 0 0 1]);
%maketform()创建一个多维空间变换结构;‘affine’:二维或 N 维仿射变换;‘projective’:二维或 N 维投影变换
%‘custom’;用户自定义变换;‘box’:各维独立进行变换的仿射变换;‘composite’:两种或多种变换的复合变换
tform2=maketform('affine',[1 shear 0;0 1 0; 0 0 1]);
NewImage=imtransform(NewImage,tform1);
%根据二维空间变换结构tform1对图像NewImage进行二维空间变换。
%‘bicubic’:双立方插值;‘bilinear’:默认值,双线性插值;‘nearest’:最近邻差值
%如果NewImage的维数大于 2 (如真彩色图像),则将空间变换结构应用到NewImage中所有的二维矩阵(NewImage(:,:,i))中。
NewImage=imtransform(NewImage,tform2);
case 4 %mirroring H 水平镜像
NewImage=flipdim(NewImage,2);
case 5 %mirroring V 垂直镜像
NewImage=flipdim(NewImage,1);
case 6 %mirroring C 对角镜像
NewImage=flipdim(NewImage,2);
NewImage=flipdim(NewImage,1);
% flipdim(X,dim)矩阵翻转变换的函数,其中X表示一个矩阵,dim指定翻转方式,dim为1,表示每一列进行逆序排列,2表示每一行进行逆序排列
end
end
[newh neww newc]=size(NewImage);
positionx=randi(w-2*neww,1,1); %randi 生成均匀分布的伪随机整数
%andi(iMax,m,n)在闭区间[1,iMax]生成mXn型随机矩阵
positiony=randi(h-2*newh,1,1); %叠加位置
temp=Back(positiony:positiony+newh-1,positionx:positionx+neww-1,:);
colorchange=randi(3,1,2);
if colorchange(1)~=colorchange(2) % 颜色变化
color=NewImage(:,:,colorchange(1));
NewImage(:,:,colorchange(1))=NewImage(:,:,colorchange(2));
NewImage(:,:,colorchange(2))=color;
end %色彩通道交换
c=NewImage(:,:,1)&NewImage(:,:,2)&NewImage(:,:,3);
pos=find(c(:)==0); % 找c中值为0的元素位置
NewImage(pos)=temp(pos);
NewImage(pos+newh*neww)=temp(pos+newh*neww);
NewImage(pos+2*newh*neww)=temp(pos+2*newh*neww); %去除几何变换中产生的背景黑色点
temp=NewImage;
Back(positiony:positiony+newh-1,positionx:positionx+neww-1,:)=temp; %叠加
end
subplot(133),imshow(Back),title('合成图');
imwrite(Back,'hecheng.jpg');
运行结果: