神奇的分形图像(一)-Fractal Image-Mandelbrot And Julia

article/2025/9/15 18:03:09
  • 分析学原理不做过多阐述:这里以举例子的方式加以阐述,更能通俗的理解其概念。

分形几何学是一门以不规则几何形态为研究对象的几何学

从上图,你能很清晰的回答出它们是直线、矩形、长方体、维度分别是1、2、3维

但是如下图形呢我们通常引入豪斯多夫维度来衡量该图像的维度

这张图像来源是:https://www.zhihu.com/question/19931652

可能你不好理解为什么是n^3 = 4,其实你可以想象成Ⅰ图变成Ⅱ图是

一、首先分割成均等的三分

二、将中间(1/3长度的直线)变成尖角(总长度2/3长度的直线)

所以3 * length(Ⅱ) = 4 * length(Ⅰ)

D = log_{3}(4) = 1.261 维度

  • 今天要介绍的是Mandelbrot And Julia 曼德勃罗集 和 朱丽叶集 的代码实现

曼德勃罗集 和 朱丽叶集  都是利用 公式Z_{n+1}= Z_{n}^2+c迭代

相同的是迭代初值均为Z_{0} 而不同的迭代的参数

曼德勃罗集选用Z_{n+1}继续迭代,而朱丽叶集采用固定参数迭代

其次需要理解一个知识点、迭代的条件是必须要收敛,否则结果无意义

这里参与迭代的参数是复数,如果对复数不了解请自行百度,复数表达方式为Z = a+b*i

定义迭代结束的条件是\left | Z \right | <2 等价于sqrt(a^2 + b^2) < 2

其中flag = 0实现曼德勃罗集 flag = 1实现 朱丽叶集,参数c由滑条TrackBar调节。

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
const int trackbar_val_max = 200;class CMandelbrot
{
public:CMandelbrot(): x1(0), y1(), ScaleX(), ScaleY(),image(Mat()){}/*explicit CMandelbrot(int) : x1(0), y1(0), ScaleX(0), ScaleY(0){}*/CMandelbrot(float x1,float y1,float ScaleX,float ScaleY, Mat image){this->x1 = x1;this->y1 = y1;this->ScaleX = ScaleX;this->ScaleY = ScaleY;this->image = image;}
public:Mat   getImage(){return image;}float getX1(){return x1;}float getY1(){return y1;}float getScaleX(){return ScaleX;}float getScaleY(){return ScaleY;}
private:float x1;float y1;float ScaleX;float ScaleY;Mat image;
};
//逃逸时间算法实现
int mandelbrot(const complex<float> &z0, const int max,const complex<float> &z1)
{complex<float> z = z0;for(int t = 0; t < max; t++){if(z.real() * z.real() + z.imag() * z.imag()> 4.0f) return t;z = z * z + z1;}return max;
}
int mandelbrotFormula(const complex<float> &z0,const complex<float> &z1, const int maxIter=255) {int value = mandelbrot(z0, maxIter, z1);if(maxIter - value == 0)//if value == maxIter, set pixel = 0{return 0;}return cvRound(sqrt(value / (float) maxIter) * 255);// in order to overcome linear scaling is make no sense to change of gray
}
void sequentialManelbrot(Mat &img, const float x1, const float y1, const float scaleX, const float scaleY, complex<float> & c = complex<float>(0, 0) ,int flag = 0)
{if(flag == 0){if(img.channels() == 1){for(int i = 0; i < img.rows; i++){for(int j = 0; j < img.cols; j++){float x0 = j / scaleX + x1;//img x point convert to Mandelbrot setfloat y0 = i / scaleY + y1;//img y point convert to Mandelbrot setcomplex<float> z0(x0,y0);uchar value = (uchar)mandelbrotFormula(z0,z0);img.ptr<uchar>(i)[j] = value;}}}else{for(int i = 0; i < img.rows; i++){for(int j = 0; j < img.cols; j++){float x0 = j / scaleX + x1;//img x point convert to Mandelbrot setfloat y0 = i / scaleY + y1;//img y point convert to Mandelbrot setcomplex<float> z0(x0,y0);uchar value = (uchar)mandelbrotFormula(z0,z0);if(value > 150)img.at<Vec3b>(i, j) = Vec3b(0, 0, value);else if(value > 75)img.at<Vec3b>(i, j) = Vec3b(0, saturate_cast<uchar>(value + 75), saturate_cast<uchar>(value+150));else if(value > 50)img.at<Vec3b>(i, j) = Vec3b(0, value+50, 100);else if(value > 10)img.at<Vec3b>(i, j) = Vec3b(value+25, value+50, 100);else if(value > 0)img.at<Vec3b>(i, j) = Vec3b(value+25, 0, 100);elseimg.at<Vec3b>(i, j) = Vec3b(0, 0, 0);}}}}else{if(img.channels() == 1){for(int i = 0; i < img.rows; i++){for(int j = 0; j < img.cols; j++){float x0 = j / scaleX + x1;//img x point convert to Mandelbrot setfloat y0 = i / scaleY + y1;//img y point convert to Mandelbrot setcomplex<float> z0(x0,y0);uchar value = (uchar)mandelbrotFormula(z0,c);img.ptr<uchar>(i)[j] = value;}}}else{for(int i = 0; i < img.rows; i++){for(int j = 0; j < img.cols; j++){float x0 = j / scaleX + x1;//img x point convert to Mandelbrot setfloat y0 = i / scaleY + y1;//img y point convert to Mandelbrot setcomplex<float> z0(x0,y0);uchar value = (uchar)mandelbrotFormula(z0,c);if(value > 150)img.at<Vec3b>(i, j) = Vec3b(0, 0, value);else if(value > 75)img.at<Vec3b>(i, j) = Vec3b(0, value, saturate_cast<uchar>(value+150));else if(value > 50)img.at<Vec3b>(i, j) = Vec3b(0, value, 50);else if(value > 10)img.at<Vec3b>(i, j) = Vec3b(value+25, value, 50);else if(value > 0)img.at<Vec3b>(i, j) = Vec3b(value+25, 0, 50);elseimg.at<Vec3b>(i, j) = Vec3b(0, 0, 0);}}}}}
static float CalibrateRate(int pos)
{float rate = pos * 1.0f /  trackbar_val_max;if(rate < 0.5)rate = -2 * rate;elserate = 2 * rate;return rate;
}
static void on_trackbar_Real(int pos, void * userdata)
{int im_pos = getTrackbarPos("imaginary", "fractal");CMandelbrot *mm = (CMandelbrot *)userdata;float re_rate = CalibrateRate(pos);float im_rate = CalibrateRate(im_pos);
#ifdef _DEBUGcout << "re_rate" << re_rate << endl;cout << "im_rate" << im_rate << endl;
#endifsequentialManelbrot(mm->getImage(),mm->getX1(),mm->getY1(),mm->getScaleX(),mm->getScaleY(),complex<float>(re_rate,im_rate),1);imshow("fractal",mm->getImage());
}
static void on_trackbar_Imaginary(int pos , void * userdata)
{int re_pos = getTrackbarPos("real", "fractal");CMandelbrot *mm = (CMandelbrot *)userdata;float re_rate = CalibrateRate(re_pos);float im_rate = CalibrateRate(pos);
#ifdef _DEBUGcout << "re_rate" << re_rate << endl;cout << "im_rate" << im_rate << endl;
#endifsequentialManelbrot(mm->getImage(),mm->getX1(),mm->getY1(),mm->getScaleX(),mm->getScaleY(),complex<float>(re_rate,im_rate),1);imshow("fractal",mm->getImage());
}
int main()
{namedWindow("fractal",1);Mat mandelbrotImg2(800,600,CV_8UC3);float x1 = -1.4f, x2 = 1.16f;float y1 = -1.2f, y2 = 1.2f;float scaleX = mandelbrotImg2.cols / (x2 - x1);float scaleY = mandelbrotImg2.rows / (y2 - y1);CMandelbrot mm(x1,y1,scaleX,scaleY,mandelbrotImg2);int re = 40,im = 40;createTrackbar("real","fractal",&re,trackbar_val_max,on_trackbar_Real,&mm);createTrackbar("imaginary","fractal",&im,trackbar_val_max,on_trackbar_Imaginary,&mm);waitKey();
}

实现结果

Re =  -0.4  Im = 0.65

调的颜色有点丑,大家请见谅。


http://chatgpt.dhexx.cn/article/0Cq2B3To.shtml

相关文章

先睹为快_Mandelbrot集

本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载&#xff0c;但需要注明原作者"海洋饼干叔 叔"&#xff1b;本文不允许以纸质及电子出版为目的进行抄摘或改编。 1.《Python编程基础及应用》&#xff0c;陈波&#xff0c;刘慧君&#…

用Python画Mandelbrot集

Mandelbrot Set&#xff08;曼德勃罗集&#xff09;可能是分形 图形中最有名的图形&#xff0c;关于它的介绍我就不多写了&#xff0c;有兴趣的可以参考这个链接 。下面是关于如何使用Python来画这个图形的尝试。 由于Python标准库中还没有对图形处理的支持&#xff0c;在此我使…

Mandelbrot Set (曼德布洛特集) VC 源代码

关于 Mandelbrot Set (曼德布洛特集) 的介绍什么的我就不多说了&#xff0c;网上一大堆。唯独清晰的代码不好找&#xff0c;所以我就贴代码吧&#xff1a; // 需要安装 EasyX 库&#xff0c;Visual C 6.0 下编译通过 #include <graphics.h> #include <conio.h> / /…

Bellman-ford算法详解

什么是Bellman-ford算法 贝尔曼-福特算法&#xff08;Bellman-Ford&#xff09;是由理查德贝尔曼&#xff08;Richard Bellman&#xff09;和莱斯特福特创立的&#xff0c;求解单源最短路径问题的一种算法。其优于Dijkstra的方面是边的权值可以为负数、实现简单&#xff0c;缺…

分形(Fractal)及分形维数(Fractal dimension)

文章目录 1. 分形介绍2. 分形的定义3. 分形维数介绍4. 历史5. 缩放的作用&#xff08;Role of scaling&#xff09;6. D 不是唯一描述符7. 分形表面结构8. 例子8.8 Hausdorff dimension8.8.1 直观概念8.8.2 正式定义8.8.2.1 Hausdorff dimension8.8.2.2 Hausdorff content 8.8.…

Mandelbrot集的最新变化形态一览——MandelBox,Mandelbulb,Burning Ship,NebulaBrot

二维Mandelbrot集——Burning Ship 采用以下迭代公式 (x4-6*x2*y2y4, 4*|x|3*|y|-4*|y|3*|x|) 看不懂的&#xff0c;可以去学习深造了。。。 Mandelbulb 这个3D的Mandelbrot集采用的是以下公式&#xff0c;这应该算是超复数的一种&#xff0c;人称“triplex”&#xff0c;三…

Mandelbrot集Julia集分形的MATLAB实现(分形艺术)

Mandelbrot集Julia集分形的MATLAB实现&#xff08;分形艺术&#xff09; 1 简单Julia集的实现1.1 如何实现更光滑的展示效果&#xff1f; 2 Mandelbrot集的实现3 永恒的细节 本文首发于 matlab爱好者 微信公众号&#xff0c;欢迎关注。 惯例声明&#xff1a;本人没有相关的工程…

神奇的分形艺术: Mandelbrot集和Julia集

前言 这段时间看了一个关于维度的视频介绍&#xff0c;叹于其惊艳的多维几何体和分形的视觉动画效果。其实关于分形&#xff0c;已经有很成熟的分形软件和应用场景&#xff0c;可以参看目前流行的分形软件一览&#xff0c;不过没有及时更新&#xff0c;有些链接已经进不了&…

MATLAB | 分形的艺术——(Mandelbrot)曼德勃罗特集合

PART.0 Mandelbrot 介绍 “无规则的碎片” “魔鬼的聚合物” “上帝的指纹” Mandelbrot集合有着多种称谓&#xff0c;那么什么是曼德勃罗特集&#xff1f;Mandelbrot集合可以用复二次多项式&#xff1a; f c ( z ) z 2 c f_c(z)z^2c fc​(z)z2c 来表示&#xff0c;其中c是…

神奇的Python-实现曼德布洛特(Mandelbrot)集合(一行代码,matplotlib numpy,tensorflow)分别实现

神奇的Python-实现曼德布洛特(Mandelbrot)集合(一行代码&#xff0c;matplotlib numpy&#xff0c;tensorflow)分别实现 Mandelbrot图实际上是由Mandelbrot集合构成的图像。 Mandelbrot集合的定义如下&#xff1a; z n 1 z n 2 c z_{n1}z^2_nc zn1​zn2​c 其中&#xff…

曼德勃罗集(Mandelbrot Set)

先来膜拜一下大神&#xff01; 曼德勃罗(Benoit B. Mandelbrot)&#xff0c;数学家、经济学家&#xff0c;分形理论的创始人。1924年生于波兰华沙&#xff1b;1936年随全家移居法国巴黎&#xff0c;在那里经历了动荡的二战时期&#xff1b;1948年在帕萨迪纳获得航空硕士学位&am…

用matlab画Mandelbrot(曼德布罗特)图

Mandelbrot图实际上是由Mandelbrot集合构成的图像。 Mandelbrot集合的定义如下&#xff1a; zn1z2nc 其中&#xff0c;c是一个复数。加入给定一个复数 z0 &#xff0c;比如 z00 &#xff0c;那么这个递推式会生成一个序列&#xff1a; [z0,z1,z2,z3,...] 。如果这个序列收敛…

Mandelbrot 并行实现

最近要交并行计算的作业了,这周终于把作业写了个大概,这期间感觉学了不少东西,总结一下。 Mandelbrot Set 背景 前几天逛维基百科的时候看到了如下的消息:著名数学家、分形之父Benot B. Mandelbrot(中文名本华曼德博)美国时间10月15日辞世,享年85岁。 “1979年,在哈…

Mastering Qt 5 学习笔记-Mandelbrot

是一个 Mandelbrot 分形的多线程计算。 用户将看到分形&#xff0c;并能够在该窗口中平移和缩放。Mandelbrot 分形是一个处理复数 (a bi) 的数值集&#xff0c;该图像中的每个黑色像素都趋向于发散到一个无限值&#xff0c;&#xff0c;而绿色像素则有界于一个有限值。绿色像素…

Mandelbrot集合及其渲染

什么是Mandelbrot集合&#xff1f; Mandelbrot集合是在复数平面上组成分形的点的集合&#xff0c;它正是以数学家Mandelbrot命名。 Mandelbrot集合可以用复二次多项式\[ f_c(z)z^2c \] 来定义 其中c是一个复数。对于每一个c&#xff0c;从\(z 0\),开始对\(f_c(z)\)进行迭代。 …

分形之父 Mandelbrot

著名数学家&#xff0c;被誉为分形之父的Mandelbrot先生&#xff0c;美国时间10月15日在马萨诸塞州剑桥辞世&#xff0c;享年85岁。他用“美丽”改变了我们的世界观&#xff0c;他被认为是20世纪后半叶少有的影响深远而且广泛的科学伟人之一&#xff0c;1993年他获得沃尔夫物理…

Ettercap系列 II:基于命令行界面(结合driftnet截获目标机器正在浏览的图片)

相信跟着这个系列走&#xff0c;一直看到这篇文章的读者已经了解了基于图形化Ettercap的操作&#xff0c;并对Arp欺骗和Ettercap相关的术语有所了解。本篇就如何在命令行界面下操作ettercap&#xff0c;以实现与图形化界面相同的效果展开讨论。可能你会不解&#xff1a;既然我已…

无线局域网的嗅探攻击和防御——ettercap+driftnet

&#xfeff;&#xfeff; 无线局域网的嗅探攻击和防御 -----ettercapdriftnet 1 实验要求和目的 ●了解局域网转发数据的规则与协议 ●了解抓包软件的原理与操作流程 ●对网络中数据传输的协议有更深层次的认识 2 实验原理和背景知识 2.1 抓包软件与分析软件 本次嗅探试验所…

python实现图片嗅探工具——自编driftnet

python实现图片嗅探工具——自编driftnet 前言一、数据包嗅探二、图片捕获三、图片显示及主函数写在最后 前言 想必尝试过中间人攻击&#xff08;MITM)的小伙伴&#xff0c;大概率是知道driftnet的。这是一款简单使用的图片捕获工具&#xff0c;可以很方便的从网络数据包中抓取…

kali中 arpspoof、driftnet、流量转发的图片抓取

1、开启内核转发模式&#xff08;echo 1为转发 echo 0为拦截&#xff09; echo 1 /proc/sys/net/ipv4/ip_forward 配置完成使用命令查看cat /proc/sys/net/ipv4/ip_forward 2、使用 Arpspoof 开始攻击 命令:Arpspoof -i (自己网卡) -t 目标IP 网关 3、打开另一个终端 查看dri…