matlab练习程序(生成希尔伯特曲线)

时间:2023-03-08 17:32:02
matlab练习程序(生成希尔伯特曲线)

能够使用这样一条线遍历图像中所有的像素,不过这里没有这样做,而只是生成了这样一条曲线。

程序中h,w是最终图像的高和宽,n为希尔伯特曲线阶数。

这里如果n等于log2(h)或log2(w),则图像就全为白了,也算是正好遍历所有像素了。

当然,n很大的话,图像也是全为白的,不过,那样不算正好遍历吧。

代码中生成曲线的核心函数可以在这里找到

生成图像如下:

matlab练习程序(生成希尔伯特曲线)

matlab代码如下:

main.m

clear all;close all;clc;

h=;
w=;
n=;
imgn=zeros(h,w);
[x,y]=hilbert(n);
x=floor((x+0.5)*w)+;
y=floor((y+0.5)*h)+; l=length(x);
for i=:l-
imgn=drawline(imgn,x(i),y(i),x(i+),y(i+));
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 .
%
% Example: plot of -th order curve
%
% [x,y]=hilbert();line(x,y)
% % Copyright (c) by Federico Forte
% Date: // if n<=
x=;
y=;
else
[xo,yo]=hilbert(n-);
x=.*[-.+yo -.+xo .+xo .-yo];
y=.*[-.+xo .+yo .+yo -.-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)=;
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))=;
end
end end