关于纹理合成的Matlab教程

来源:互联网 发布:认证报名保存数据失败 编辑:程序博客网 时间:2024/06/05 02:19
       纹理是普遍存在的视觉现象,其可以描述物体的表面特征。纹理结构在图像中反映其图像像素取值的空间变化情况,这种变化具有某中统计规律
      纹理合成的方法如下:给定一个纹理样图,合成一个新的纹理图像,其由人眼观察,该结果产生遵循一定的随机过程。其中需要解决两个关键问题,一是根据有限的纹理样图如果确定随机过程的模型,二是确定模型后如何寻找一种有效的方法产生新的纹理。前者决定产生纹理的准确性,后者决定合成过程的速度。

     非参数采样纹理合成-先产生一个大的随机图像,然后对随机图像中每个像素及其邻域像素和小的纹理图像做对比,找出随机图像当前邻域和小的纹理图像最接近的邻域,然后将小的纹理图像最接近的像素赋值给大的随机图像。这样每处理一个随机图像中的像素,就需要遍历小的纹理图像的所有像素,所以运行时间是很慢的。

      下面的纹理合成程序就是按照上述原理编写的,给定一副较小的纹理样图(64*64)和一副较大的随机噪声图像(256*256),通过纹理合成,使噪声图像具有和样图类似的纹理。

clear all;
close all;
clc;

mask=mat2gray(imread('wen.jpg'));   %小的纹理图像;mat2gray是实现图像矩阵的归一化操作,使矩阵的每个元素的值都在0和1之间(0表示黑色,1表示白色),该函数在数字图像处理中经常用到。
[m n]=size(mask);

imgn=mat2gray(rand(256,256));   %最终需要的大的纹理图像,现在是随机图像

w=2;            %L邻域长的半径
I=[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,[]);

0 0
原创粉丝点击