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
复制代码

 

posted @   Dsp Tian  阅读(9813)  评论(4编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示