图像纹理合成的matlab例程
关于图像纹理合成的 Matlab 例程纹理是普遍存在的视觉现象,其可以描述地形、植物、矿石、纤维和皮肤等等物体的表面特征。纹理结构在图像中反映其图像像素取值的空间变化情况,这种变化具有某中统计规律,在纹理区域内的各部分具有大致相同的结构。纹理合成是利用计算机产生纹理的一种,其可以合成任意尺寸、大小、避免视觉重复性,也可以限定边界条件产生重复的瓦砖状的重复纹理,在图像压缩、多维物体纹理生成、图像降噪、图像修补、图像镶嵌等方面具有广泛的应用。纹理合成的方法如下:给定一个纹理样图,合成一个新的纹理图像,其由人眼观察,该结果产生遵循一定的随机过程。其中需要解决两个关键问题,一是根据有限的纹理样图如果确定随机过程的模型,二是确定模型后如何寻找一种有效的方法产生新的纹理。前者决定产生纹理的准确性,后者决定合成过程的速度。利用 Markov Random Fields(MRF,马尔克夫随机场)建立的纹理模型被证明使用于许多有用的纹理类型,其将纹理的合成看作具有局部性与稳定性的随机处理过程,即纹理图像中的每个像素由具有一定大小的空间邻域像素集来特征化(局部性),这种特征对所有像素又是相同的(稳定性)。换句话说就是,纹理图像中由一个窗口去观察,不同的位置的窗口图像相似,但每个像素仅取决于局部区域而于区域外的像素无关。下面介绍的纹理合成程序就是按照上述原理编写的。其任务是给定一幅较小的纹理样图(64×64)和一幅较大的随机噪声图像(256×256),通过纹理合成,使噪声图像具有和样图类似的纹理。见图。SS00=imread( sample.bmp );mn=64;SS=SS00(1:mn,1:mn,:);subplot(881);image(SS); %读取并显示纹理样图mn=256;nois1=rand(256,256).*255;nois2=rand(256,256).*255;nois3=rand(256,256).*255;NI=zeros(1:mn,1:mn,:);NI(:,:,1)=nois1;NI(:,:,2)=nois2;NI(:,:,3)=nois3;subplot(222);image(NI); %产生取值 0~255 随机噪声图像并显示Nei=[1 1 1 1 1; 1 1 1 1 1; 1 1 0 0 0 ]; %确定邻域 Neighborhood,其大小是 5×5,也可是是 7×7、9×9 等NI_t=double(NI);SS_t=double(SS);th=0; %阈值for i=3:253 %进行邻域匹配,确定新纹理像素的取值for j=3:253wi=NI_t(i-2:i,j-2:j+2).*Nei;dewi_th=100000;for ii=3:64-2for jj=3:64-2wi_s=SS_t(ii-2:ii,jj-2:jj+2).*Nei;dewi=mean2(abs(wi_s-wi));if dewidewi_th=dewi;iii=ii;jjj=jj;endif dewi_th==thbreak;endendif dewi_th==thbreak;endendNI_t(i,j,:)=SS_t(iii,jjj,:);endendsubplot(224);image(uint8(NI_t));可以看出,该程序运行需要相当多的时间,速度很慢很慢。可以从两个方面来改进:一是把阈值 th 调大,但这样会牺牲纹理的准确性;一是寻找快速的匹配算法,因为对每个像素来说,都需要阈纹理样图对应窗口的像素进行一轮匹配,这实际上是一个多维空间最近邻点的搜索问题,这样可以利用树结构矢量量化(TSVQ)方法等来优化匹配过程,提高纹理合成的速度。