matlab練習程序(紋理合成)


關於紋理合成最經典的論文應該就數EfrosTexture 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*5for 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,[]);

參考博客:http://blog.sina.com.cn/s/blog_50a6faf801009fry.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM