關於紋理合成最經典的論文應該就數Efros的Texture Synthesis by Non-parametric Sampling這篇論文了,引用量近2000。
這里的合成是基於樣例的,就是先有一個小的紋理圖像,然后合成一個大的。
我個人的理解是,先產生一個大的隨機圖像,然后對隨機圖像中每個像素及其鄰域像素和小的紋理圖像做對比,找出隨機圖像當前鄰域和小的紋理圖像最接近的鄰域,然后將小的紋理圖像最接近的像素賦值給大的隨機圖像。這樣每處理一個隨機圖像中的像素,就需要遍歷小的紋理圖像的所有像素,所以運行時間是很慢的。
先看下效果:
小的紋理圖像:

合成的紋理圖像:

matlab代碼如下:
clear all; close all; clc; mask=mat2gray(imread('wen.jpg')); %小的紋理圖像 [m n]=size(mask); imgn=mat2gray(rand(256,256)); %最終需要的大的紋理圖像,現在是隨機圖像 w=2; %L鄰域長的半徑 I=[1 1 1 1 1; 1 1 1 1 1; 1 1 0 0 0]; %L鄰域,這里是5*3的,當然也可以是7*4或9*5的 for i=1+w:256 for j=1+w:256-w mi=inf; for p=1+w:m for q=1+w:n-w tmp=mean2(abs(imgn(i-w:i,j-w:j+w).*I-mask(p-w:p,q-w:q+w).*I)); if tmp<mi %取差別最小的像素 mi=tmp; ii=p; jj=q; end end end imgn(i,j)=mask(ii,jj); end end figure; imshow(imgn,[]);
