matlab練習程序(生成希爾伯特曲線)


能夠使用這樣一條線遍歷圖像中所有的像素,不過這里沒有這樣做,而只是生成了這樣一條曲線。

程序中h,w是最終圖像的高和寬,n為希爾伯特曲線階數。

這里如果n等於log2(h)或log2(w),則圖像就全為白了,也算是正好遍歷所有像素了。

當然,n很大的話,圖像也是全為白的,不過,那樣不算正好遍歷吧。

代碼中生成曲線的核心函數可以在這里找到

生成圖像如下:

matlab代碼如下:

main.m

clear all;close all;clc;

h=256;
w=256;
n=5;   
imgn=zeros(h,w);
[x,y]=hilbert(n);       
x=floor((x+0.5)*w)+1;
y=floor((y+0.5)*h)+1;

l=length(x);
for i=1:l-1
    imgn=drawline(imgn,x(i),y(i),x(i+1),y(i+1));  
end

imshow(imgn)

hilbert.m

function [x,y] = hilbert(n)
%HILBERT Hilbert curve.
%
% [x,y]=hilbert(n) gives the vector coordinates of points
%   in n-th order Hilbert curve of area 1.
%
% Example: plot of 5-th order curve
%
% [x,y]=hilbert(5);line(x,y)
%

%   Copyright (c) by Federico Forte
%   Date: 2000/10/06 

if n<=0
  x=0;
  y=0;
else
  [xo,yo]=hilbert(n-1);
  x=.5*[-.5+yo -.5+xo .5+xo  .5-yo];
  y=.5*[-.5+xo  .5+yo .5+yo -.5-xo];
end

drawline.m

function img=drawline(img,x1,y1,x2,y2)   %因為圖像坐標和數學函數坐標y軸朝向相反,所以這里所有y變量取相反數
    y1=-y1;
    y2=-y2;
    
    if x1~=x2
        k=(y2-y1)/(x2-x1);
        b=y1-k*x1;

        mi=min(x1,x2);
        ma=max(x1,x2);
        for i=mi:ma
            img(-round(i*k+b),i)=1; 
        end
    end
    
    if y1~=y2
        k=(x2-x1)/(y2-y1);
        b=x1-k*y1;  
        mi=min(y1,y2);
        ma=max(y1,y2);
        for i=mi:ma
            img(-i,round(i*k+b))=1; 
        end        
    end
 
end

 


免責聲明!

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



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