用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:253
wi=NI_t(i-2:i,j-2:j+2).*Nei;
dewi_th=100000;
for ii=3:64-2
for jj=3:64-2
wi_s=SS_t(ii-2:ii,jj-2:jj+2).*Nei;
dewi=mean2(abs(wi_s-wi));
if dewi
dewi_th=dewi;
iii=ii;jjj=jj;
end
if dewi_th==th
break;
end
end
if dewi_th==th
break;
end
end
NI_t(i,j,:)=SS_t(iii,jjj,:);
end
end
subplot(224);image(uint8(NI_t));
可以看出,該程序運行需要相當多的時間,速度很慢很慢。可以從兩個方面來改進:一是把閾值th調大,但這樣會犧牲紋理的準確性;一是尋找快速的匹配算法,因為對每個像素來說,都需要閾紋理樣圖對應窗口的像素進行一輪匹配,這實際上是一個多維空間最近鄰點的搜索問題,這樣可以利用樹結構矢量量化(TSVQ)方法等來優化匹配過程,提高紋理合成的速度。
總結
以上是生活随笔為你收集整理的用matlab做纹理合成,关于图像纹理合成的Matlab例程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SK海力士在2023闪存峰会上展示全球最
- 下一篇: matlab评估边缘检测性能,【模糊推理