分形学习

来源:互联网 发布:网上商城源码 java 编辑:程序博客网 时间:2024/06/06 20:26

昨天的时候终于从零构建起了一个OpenCV+VS的基本环境,同时制作出了第一个分形的图形。
今天经过一个小时的学习,了解了OpenCV下的颜色控制,修改后的代码如下:

#include "stdafx.h"#include<iostream>#include<opencv\cv.h>#include<opencv2\core\core.hpp>#include<opencv2\opencv.hpp>#include<opencv\highgui.h>#include<vector>using namespace std;using namespace cv;double log2(double x){    return (log(x)*(1.0 / log(2.0)));}int taoyizhijisuan(double x, double y){    double x0, y0, x1, y1;    double x_a, y_a;    x_a = -1;    y_a = 0;    x0 = x;    y0 = y;    long int i;    for (i = 1; i<1000; i++)    {        x1 = x0*x0 - y0*y0 + x_a;        y1 = x0*y0 * 2 + y_a;        if ((x1*x1 + y1*y1) > 4)            break;        x0 = x1;        y0 = y1;    }    //if (i >= 1000)        return i;    //else    //  return (i + 1 - log2(x1*x1 + y1*y1));}long sinColor(double input){    return (long)((sin(input * 2 * 3.1415926 / 510 - 3.141596*0.5) + 1)*0.5 * 255);}int main(){    //Mat pic=Mat::zeros(600,600,CV_8UC3);    Mat pic(600, 600, CV_8UC3);    for (double i = 1; i<600; i ++)    {        for (double j = 1; j<600; j ++)        {            if (taoyizhijisuan((i - 300) / 100, (j - 300) / 100) >= 1000)            {                pic.at<Vec3b>(i, j)[0] = sinColor((taoyizhijisuan((i - 300) / 100, (j - 300) / 100))) ;            }            else if(taoyizhijisuan((i - 300) / 100, (j - 300) / 100) <500)                pic.at<Vec3b>(i, j)[1] = sinColor((taoyizhijisuan((i - 300) / 100, (j - 300) / 100) *20));            else                pic.at<Vec3b>(i, j)[2] = sinColor(taoyizhijisuan((i - 300) / 100, (j - 300) / 100) *30);        }    }    pic.at<Vec3b>(120, 220) = 0;    namedWindow("output", CV_WINDOW_AUTOSIZE);    imshow("output", pic);    waitKey();    return 0;}

图形输出如下:
这里写图片描述
其中OpenCV的颜色控制如下:

pic.at<Vec3b>(i, j)[0] =Bpic.at<Vec3b>(i, j)[1] =Gpic.at<Vec3b>(i, j)[2] =R

这里和之前的记忆有些出入,我之前记得OpenCV是通过在一个点的位置横向放三个点的方式来对颜色进行控制的(注:即为(x(0,1,2),y(0))表示一个点,其中如果只有x(0)有值,该点颜色即为蓝色,若只有x(1)有值,则该点颜色为绿色),创建一个x=300,y=300的图像,输出后为一个长宽比3:1的矩形),不过现在最优先目的是制作出来一个能够创建出让我满意的分形图案的程序,所以对于机理暂时放下不进行研究。
目前上面的取色逻辑是使用sin函数对图案的颜色进行平滑计算,但是效果一般;

今日学到的内容:
1、OpenCV的颜色修改方式。
2、如果想要尝试多种算法的优劣,将不同的算法分别单独建立为函数,然后在主程序中调用是一个比较方便的做法。