草祭祀 发表于 2016-10-3 03:00:06

给女神画一张一笔肖像画!

本帖最后由 草祭祀 于 2016-10-3 08:27 编辑

小草觊觎女神已久,一直想给女神送一份精致的创意礼物。
于是灵光一现,决定要做一张一笔肖像画!
待处理图片:

先扔掉颜色信息黑白化:

IplImage* origin0=cvLoadImage("pp.jpg",0);
cvSaveImage("D:\\gray.jpg", origin0);
直接载入一张黑白图片就可以了。
然后我们对图片进行摆动矩阵二值化:

double ratio=origin0->width>origin0->height?origin0->width/(double)(1<<(bits-2)):origin0->height/(double)(1<<(bits-2));
        IplImage* origin=cvCreateImage(cvSize(origin0->width/ratio,origin0->height/ratio),8,1);
        cvResize(origin0,origin);
        IplImage* tempi=cvCloneImage(origin);
        IplImage* tempi2=cvCloneImage(origin);
        int c=3;
        double gray=256/(double)(1<<(2*c));
        for (int x=0;x<origin->width;x++)
        {
                for (int y=0;y<origin->height;y++)
                {
                        unsigned char g=origin->imageData;
                        tempi->imageData=g/gray>ditherMatrix(x%(1<<(c-1)),y%(1<<(c-1)),c-1)?(char)(unsigned char)255:(char)(unsigned char)0;
                }
        }
什么叫做摆动矩阵呢,简单说就是一种打印时候用的二值化算法。一些打印机的颜色是由色点的密度组成的,白点越密,就看上去越亮,黑点越密,看上去越暗。
摆动矩阵代码:
int dither={0,2,3,1};
int ditherMatrix(unsigned int x,unsigned int y,int c)
{
        if(c>0)
                return 4*ditherMatrix(x,y,c-1)+dither[(x>>(c))%2+(y>>(c))%2*2];
        else
                return dither[(x>>(c))%2+(y>>(c))%2*2];
}
摆动矩阵使用的一种自相似的矩阵结构,要处理的图像每个像素的灰度如果大于摆动矩阵对应的值,则输出白点,如果小于则输出黑点。
一阶阵只有四个数字。
0 3
2 1
二阶阵有16个。
0 12 3 15
8 4 11 7
2 14 1 13
10 6 9 5
二阶阵是在一阶阵边长扩展一倍之后,四角的四方块加上一阶阵的四倍。
三阶阵就有64个了,以此类推。
09624 120   6 10230 126
6432885670389462
16 112   8 10422 11814 110
8048724086547846
4 10028 124   29826 122
6836926066349058
20 11612 10818 11410 106
8452764482507442
三阶阵四角每4*4的块是由二阶阵加常数得到的的。
摆动矩阵尽可能利用黑和白两种颜色还原了图像的亮感和边缘,阶数小的时候,还原边缘比较锋利,阶数大的时候,还原亮感比较好。
一般取3阶或者4阶。

下面我要开始介绍希尔伯特曲线了。
希尔伯特曲线是一种分形曲线,可以一条线遍历一个空间。、

生成希尔伯特曲线:

CvPoint2D32f hil={cvPoint2D32f(-0.5,-0.5),cvPoint2D32f(-0.5,0.5),cvPoint2D32f(0.5,0.5),cvPoint2D32f(0.5,-0.5)};
vector<CvPoint> vP;

void hilbert(IplImage* img,CvPoint c,int order,int character,bool z)
{
        if(order==2)
        {
                vP.push_back(cvPoint(c.x,c.y));
        }
        else
        {
                if(order==4)
                {
                        int x=c.x/order+img->width/2;
                        int y=c.y/order+img->height/2;
                        if(x>=0&&x<img->width&&y>=0&&y<img->height)
                        {
                                if(img->imageData[(int)(y*img->widthStep+x)]==(char)(unsigned char)(z?255:0))
                                {
                                        switch(character)
                                        {
                                        case 0:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                                break;
                                        case 1:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                                break;
                                        case 2:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                                break;
                                        case 3:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                                break;
                                        }
                                }
                                else
                                {
                                        switch(character)
                                        {
                                        case 0:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                                break;
                                        case 1:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                                break;
                                        case 2:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                                break;
                                        case 3:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                                break;
                                        }
                                }
                        }
                        else
                        {
                                switch(character)
                                {
                                case 0:
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                        break;
                                case 1:
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                        break;
                                case 2:
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                        break;
                                case 3:
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                        break;
                                }
                        }
                }
                else
                {
                        switch(character)
                        {
                        case 0:
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                break;
                        case 1:
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                break;
                        case 2:
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                break;
                        case 3:
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                break;
                        }
                }
        }
}
IplImage* image2;
void hilbertD(IplImage* ori,IplImage* image,int order)
{
        image2=cvCloneImage(image);
        vP.clear();
        hilbert(ori,cvPoint(0,0),order,0,0);
        for (int i=0;i<vP.size()-1;i++)
        {
                cvLine(image2,cvPoint(vP.x+image->width/2,vP.y+image->height/2),cvPoint(vP.x+image->width/2,vP.y+image->height/2),cvScalarAll(255),1);
        }
        cvSaveImage("reverse.jpg",image2);
        cvZero(image);
        vP.clear();
        hilbert(ori,cvPoint(0,0),order,0,1);
        for (int i=0;i<vP.size()-1;i++)
        {
                cvLine(image,cvPoint(vP.x+image->width/2,vP.y+image->height/2),cvPoint(vP.x+image->width/2,vP.y+image->height/2),cvScalarAll(255),1);
        }
}
这里我们把曲线改一下,对于白点,我们让曲线象元走三条边,对于黑点,让曲线只走一条边。
注意啦!

请点开图片,并且用实际效果浏览!否则失真会相当严重。
最好离远点看,会很有效果。
于是得到效果:

大功告成!

下面放个高清无码的...女神照...



下面放送所有源码:
// maze.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "JHCap.h"
#include "opencv/cv.h"
#include "opencv/cxcore.h"
#include "opencv/highgui.h"
#include <math.h>
#include <iostream>
#include <vector>
#include <random>
#include <time.h>
extern "C"{
#include "kdtree.h"
};
#pragma comment(lib,"cv210.lib")
#pragma comment(lib,"cxcore210.lib")
#pragma comment(lib,"highgui210.lib")
#pragma comment(lib,"JHCap2.lib")
using namespace std;
#include <stdio.h>
#include <time.h>
IplImage* img;
int block=1;
#define bits 10
#define WIDTH (1<<(bits-1))
#define HEIGHT (1<<(bits-1))

enum {N=1,E=4,S=2,W=8};
int DX;
int DY;
int OPPOSITE;
int grid;
int shuffle_array(int *array, int size)
{
        int i;

        for( i=0; i<(size - 1); i++) {
                int r = i + (rand() % (size - i));
                int temp = array;
                array = array;
                array = temp;
        }
        return 1;
}
bool check_valid(int x,int y, int grid)
{
        if(x>=0&&x<WIDTH&&y>=0&&y<HEIGHT)
                return grid;
        else
                return 1;
}
int carve_passage_from(int cx, int cy, int grid)
{

        int dx, dy, nx, ny;
        int directions = {N, E, S, W};

        //shuffle the direction array
        shuffle_array(directions, 4);
        int i;
        /*
        for(i = 0; i < 4; i++) {
                printf("Direction: %d\n", directions);
        }*/
        //iterates through the direction then test if the cell in that direction is valid and
        //within the bounds of the maze
        for(i = 0; i < 4; i++) {
                dx = DX];
                dy = DY];
        //        printf("Check direction=x:y - %d=%d:%d\n", directions, dx, dy);
                // check if the cell is valid
                nx = cx + dx;
                ny = cy + dy;
                // check if we are on valid grid
                if ( ((nx < WIDTH) & (nx >= 0)) & ((ny < HEIGHT) & (ny >= 0)) ) {
                        //check if grid is not visited
                        if (grid == 0) {
                                grid = (int)((int)grid | (int)directions);
                                grid = (int)((int)grid | (int)OPPOSITE]);
                                carve_passage_from(nx, ny, grid);
                        }
                }

        }
        return 1;
}
void block_a(IplImage* image,int i, int j,bool b,CvScalar c=cvScalarAll(255))
{
        cvRectangle(image,cvPoint(i*block,j*block),cvPoint(i*block+block-1,j*block+block-1),cvScalar(b?c.val:0,b?c.val:0,b?c.val:0),-1);
}
bool search4(IplImage* image,int cx,int cy,IplImage* temp)
{
        int xP=temp->width-cx,xM=cx,yP=temp->height-cy,yM=cy;
        for (int x=cx;x<temp->width;x++)
        {
                if(temp->imageData==(char)(unsigned char)255&&image->imageData==(char)(unsigned char)0)
                {
                        xP=x-cx;
                        break;
                }
        }
        for (int x=cx;x>=0;x--)
        {
                if(temp->imageData==(char)(unsigned char)255&&image->imageData==(char)(unsigned char)0)
                {
                        xM=cx-x;
                        break;
                }
        }
        for (int y=cy;y<temp->height;y++)
        {
                if(temp->imageData==(char)(unsigned char)255&&image->imageData==(char)(unsigned char)0)
                {
                        yP=y-cy;
                        break;
                }
        }
        for (int y=cy;y>=0;y--)
        {
                if(temp->imageData==(char)(unsigned char)255&&image->imageData==(char)(unsigned char)0)
                {
                        yM=cy-y;
                        break;
                }
        }
        return xP%2&&xM%2&&yP%2&&yM%2;
}
bool mark_path(IplImage* image,int cx,int cy,int targetx,int targety,bool grid2,bool temp)
{
        int dx, dy, nx, ny;
        int directions = {N, E, S, W};
        for(int i = 0; i < 4; i++) {
                dx = DX];
                dy = DY];
                nx = cx + dx;
                ny = cy + dy;
                if(temp==0&&grid2==1)
                {
                        temp=1;
                        if(nx==targetx&&ny==targety)
                        {
                                block_a(image,nx,ny,1,cvScalar(0,255,0));
                                return 1;
                        }
                        if(mark_path(image,nx,ny,targetx,targety,grid2,temp))
                        {
                                block_a(image,nx,ny,1,cvScalar(0,255,0));
                                return 1;
                        }
                }
        }
        return 0;
}
CvPoint main_role;
void init()
{
        OPPOSITE = S;
        OPPOSITE = W;
        OPPOSITE = N;
        OPPOSITE = E;

        DX = 0;
        DX = 1;
        DX = 0;
        DX = -1;

        DY = -1;
        DY = 0;
        DY = 1;
        DY = 0;
        memset(&grid, 0, sizeof(grid));
}
IplImage* maze,*maze_origin;
int generate(IplImage* image=0) {
        int x,y;
        /** Seed the random generator **/
        srand((unsigned int)time((time_t *)NULL));


        if(!image)
                carve_passage_from(0,0,grid);
        /** Display the grid **/
        /*
        printf(" ");
        for(x = 0; x < (WIDTH * 2); x++) {
                printf("_");
        }
        printf("\n");

        for(y = 0; y < HEIGHT; y++) {
                printf("|");
                for(x = 0; x < WIDTH; x++) {
                        printf( ((grid & S) !=0)?" ":"_");
                        if((grid & E) != 0){
                                printf((( (grid | grid) & S) != 0) ?" ":"_");
                        } else {
                                printf("|");
                        }
                }
                printf("\n");
        }*/
        bool grid2;
        bool temp;
        memset(&temp, 0, sizeof(temp));
        for (int i=0;i<WIDTH*2+1;i++)
        {
                block_a(img,i,0,0);
                grid2=0;
        }
        for (int j=0;j<HEIGHT;j++)
        {
                block_a(img,0,j*2+1,0);
                block_a(img,0,j*2+2,0);
                grid2=0;
                for (int i=0;i<WIDTH;i++)
                {
                        if((grid&E)!=0&&(grid&S)==0)
                        {
                                block_a(img,i*2+1,j*2+1,1);
                                block_a(img,i*2+1,j*2+2,0);
                                block_a(img,i*2+2,j*2+1,1);
                                block_a(img,i*2+2,j*2+2,0);
                                grid2=1;
                                grid2=0;
                                grid2=1;
                                grid2=0;
                        }
                        else if((grid&E)==0&&(grid&S)!=0)
                        {
                                block_a(img,i*2+1,j*2+1,1);
                                block_a(img,i*2+1,j*2+2,1);
                                block_a(img,i*2+2,j*2+1,0);
                                block_a(img,i*2+2,j*2+2,0);
                                grid2=1;
                                grid2=1;
                                grid2=0;
                                grid2=0;
                        }
                        else if((grid&E)!=0&&(grid&S)!=0)
                        {
                                block_a(img,i*2+1,j*2+1,1);
                                block_a(img,i*2+1,j*2+2,1);
                                block_a(img,i*2+2,j*2+1,1);
                                block_a(img,i*2+2,j*2+2,0);
                                grid2=1;
                                grid2=1;
                                grid2=1;
                                grid2=0;
                        }
                        else
                        {
                                block_a(img,i*2+1,j*2+1,1);
                                block_a(img,i*2+1,j*2+2,0);
                                block_a(img,i*2+2,j*2+1,0);
                                block_a(img,i*2+2,j*2+2,0);
                                grid2=1;
                                grid2=0;
                                grid2=0;
                                grid2=0;
                        }
                }
        }
        for (int i=0;i<HEIGHT*2+1;i++)
        {
                block_a(img,WIDTH*2,i,0);
        }
        block_a(img,1,0,1);
        grid2=1;
        block_a(img,WIDTH*2-1,0,1);
        grid2=1;
        IplImage* img2=cvCloneImage(img);
        main_role=cvPoint(1,0);
        cvSaveImage("maze_origin.bmp",img);
        maze_origin=cvCloneImage(img);
        if(!image)
                mark_path(img,1,0,WIDTH*2-1,0,grid2,temp);
        else
        {
                for (int i=0;i<image->width;i++)
                {
                        for (int j=0;j<image->height;j++)
                        {
                                unsigned char z=image->imageData;
                                if(z==255)
                                {
                                        block_a(img,i,j,1,cvScalar(255));
                                }
                        }
                }
                block_a(img,1,0,1,cvScalar(255));
                block_a(img,WIDTH*2-1,0,1,cvScalar(255));
        }
        if(!image)
        {
                while(1)       
                {
                        cvCopyImage(img,img2);
                        cvRectangle(img2,cvPoint(main_role.x*block,main_role.y*block),cvPoint(main_role.x*block+block-1,main_role.y*block+block-1),cvScalar(0,0,255),-1);
                        cvRectangle(img,cvPoint(main_role.x*block,main_role.y*block),cvPoint(main_role.x*block+block-1,main_role.y*block+block-1),cvScalar(255,0,0),-1);
                        cvShowImage("maze",img2);
                        char c=cvWaitKey(0);
                        switch(c)
                        {
                        case 'a':
                                if(grid2&&main_role.x>0)
                                        main_role.x--;
                                break;
                        case 'd':
                                if(grid2&&main_role.x<WIDTH*2+1)
                                        main_role.x++;
                                break;
                        case 's':
                                if(grid2&&main_role.y<HEIGHT*2+1)
                                        main_role.y++;
                                break;
                        case 'w':
                                if(grid2&&main_role.y>0)
                                        main_role.y--;
                                break;
                        }
                        if(c=='q')
                                break;
                }
        }
        else
        {
                cvSaveImage("maze.bmp",img);
                maze=cvCloneImage(img);
        }
        return 1;
}
int dither={0,2,3,1};
int ditherMatrix(unsigned int x,unsigned int y,int c)
{
        if(c>0)
                return 4*ditherMatrix(x,y,c-1)+dither[(x>>(c))%2+(y>>(c))%2*2];
        else
                return dither[(x>>(c))%2+(y>>(c))%2*2];
}
CvPoint2D32f hil={cvPoint2D32f(-0.5,-0.5),cvPoint2D32f(-0.5,0.5),cvPoint2D32f(0.5,0.5),cvPoint2D32f(0.5,-0.5)};
vector<CvPoint> vP;

void hilbert(IplImage* img,CvPoint c,int order,int character,bool z)
{
        if(order==2)
        {
                vP.push_back(cvPoint(c.x,c.y));
        }
        else
        {
                if(order==4)
                {
                        int x=c.x/order+img->width/2;
                        int y=c.y/order+img->height/2;
                        if(x>=0&&x<img->width&&y>=0&&y<img->height)
                        {
                                if(img->imageData[(int)(y*img->widthStep+x)]==(char)(unsigned char)(z?255:0))
                                {
                                        switch(character)
                                        {
                                        case 0:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                                break;
                                        case 1:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                                break;
                                        case 2:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                                break;
                                        case 3:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                                break;
                                        }
                                }
                                else
                                {
                                        switch(character)
                                        {
                                        case 0:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                                break;
                                        case 1:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                                break;
                                        case 2:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                                break;
                                        case 3:
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                                break;
                                        }
                                }
                        }
                        else
                        {
                                switch(character)
                                {
                                case 0:
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                        break;
                                case 1:
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                        break;
                                case 2:
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                        break;
                                case 3:
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                        hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                        break;
                                }
                        }
                }
                else
                {
                        switch(character)
                        {
                        case 0:
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                break;
                        case 1:
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                break;
                        case 2:
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,1,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                break;
                        case 3:
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,0,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,3,z);
                                hilbert(img,cvPoint(hil.x*order/2+c.x,hil.y*order/2+c.y),order/2,2,z);
                                break;
                        }
                }
        }
       
}
bool check_va(IplImage* image, int x,int y)
{
        return x>=0&&x<image->width&&y>=0&&y<image->height;
}
unsigned char check_value(IplImage* image,int x,int y)
{
        return image->imageData;
}
/*
int check_in(IplImage* image,int x,int y)
{
        int now=-1,left=-1,right=-1,up=-1,down=-1;
        if(check_va(image,x,y))
        {
                now=check_value(image,x,y);
        }
        if(check_va(image,x-1,y))
        {
                left=check_value(image,x-1,y);
        }
        if(check_va(image,x+1,y))
        {
                right=check_value(image,x+1,y);
        }
        if(check_va(image,x,y-1))
        {
                up=check_value(image,x,y-1);
        }
        if(check_va(image,x,y+1))
        {
                down=check_value(image,x,y+1);
        }
        int r=0;
        if(left==255)
        {
                r=r|W;
        }
        if(right)
        {
                r=r|E;
        }
        if(up==255)
        {
                r=r|N;
        }
        if(down==255)
        {
                r=r|S;
        }
        if(now==255)
                return r;
        else
                return 0;
}*/
IplImage* image2;
void hilbertD(IplImage* ori,IplImage* image,int order)//,int grid)
{
        image2=cvCloneImage(image);
        vP.clear();
        hilbert(ori,cvPoint(0,0),order,0,0);
        for (int i=0;i<vP.size()-1;i++)
        {
                cvLine(image2,cvPoint(vP.x+image->width/2,vP.y+image->height/2),cvPoint(vP.x+image->width/2,vP.y+image->height/2),cvScalarAll(255),1);
        }
        cvSaveImage("reverse.jpg",image2);
        cvZero(image);
        vP.clear();
        hilbert(ori,cvPoint(0,0),order,0,1);
        for (int i=0;i<vP.size()-1;i++)
        {
                cvLine(image,cvPoint(vP.x+image->width/2,vP.y+image->height/2),cvPoint(vP.x+image->width/2,vP.y+image->height/2),cvScalarAll(255),1);
        }
        /*
        for (int i=0;i<WIDTH;i++)
        {
                for (int j=0;j<HEIGHT;j++)
                {
                        int x=i*2+1;
                        int y=j*2+1;
                        grid=check_in(image,x,y);
                        if(grid!=0)
                                carve_passage_from(i,j,grid);
                }
        }*/
}
/*
void merge(IplImage* image,char* name)
{
        IplImage** imag=new IplImage*;
        IplImage* total=cvCreateImage(cvSize(256*(bits-7),256),8,image->nChannels);
        imag=cvCreateImage(cvSize(image->width/2,image->height/2),8,image->nChannels);
        cvResize(image,imag);
        for (int i=1;i<bits-8;i++)
        {
                imag=cvCreateImage(cvSize(imag->width/2,imag->height/2),8,image->nChannels);
                cvResize(imag,imag);
        }
        for (int x=-128;x<128;x++)
        {
                for (int y=-128;y<128;y++)
                {
                        int x0=x+image->width/2;
                        int y0=y+image->height/2;
                        int xt=x+128;
                        int yt=y+128;
                        for(int k=0;k<3;k++)
                                total->imageData=image->imageData;
                }
        }
        for (int i=0;i<bits-8;i++)
        {
                for (int x=-128;x<128;x++)
                {
                        for (int y=-128;y<128;y++)
                        {
                                int x0=x+imag->width/2;
                                int y0=y+imag->height/2;
                                int xt=x+i*256+128+256;
                                int yt=y+128;
                                for(int k=0;k<3;k++)
                                        total->imageData=imag->imageData->widthStep*y0+x0*image->nChannels+k];
                        }
                }
        }
        cvSaveImage(name,total);
        cvReleaseImage(&total);
        for (int i=0;i<bits-8;i++)
        {
                cvReleaseImage(&imag);
        }
}*/
int _tmain(int argc, _TCHAR* argv[])
{
        init();
        IplImage* hill=cvCreateImage(cvSize((1<<bits),(1<<bits)),8,1);
        IplImage* origin0=cvLoadImage("m.bmp",0);
        cvSaveImage("D:\\gray.jpg", origin0);
        double ratio=origin0->width>origin0->height?origin0->width/(double)(1<<(bits-2)):origin0->height/(double)(1<<(bits-2));
        IplImage* origin=cvCreateImage(cvSize(origin0->width/ratio,origin0->height/ratio),8,1);
        cvResize(origin0,origin);
        IplImage* tempi=cvCloneImage(origin);
        IplImage* tempi2=cvCloneImage(origin);
        int c=3;
        double gray=256/(double)(1<<(2*c));
        for (int x=0;x<origin->width;x++)
        {
                for (int y=0;y<origin->height;y++)
                {
                        unsigned char g=origin->imageData;
                        tempi->imageData=g/gray>ditherMatrix(x%(1<<(c-1)),y%(1<<(c-1)),c-1)?(char)(unsigned char)255:(char)(unsigned char)0;
                }
        }
        cvSaveImage("D:\\bw.jpg", tempi);
        cvShowImage("origin",origin);
        cvShowImage("origin",tempi);
        hilbertD(tempi,hill,(1<<bits));
        cvSaveImage("D:\\hilbert.png", hill);
        cvShowImage("hilbert",hill);
//        cvSaveImage("hilbert.bmp",hill);
        cvWaitKey(0);
        /*
        img=cvCreateImage(cvSize(block*(WIDTH*2+1),block*(HEIGHT*2+1)),8,3);
        generate(hill);
        merge(image2,"hibertD.jpg");
        merge(maze,"mazeD.jpg");
        merge(maze_origin,"maze_originD.jpg");
       
        */
        return 0;
}




顺便提一句...

论坛的图片分辨率还是小垃圾一个...无法看清分形图案的全貌,所以有任何朋友需要高清女神图像...q我。
qq:1174686650
验证问题忽略掉。


原创帖,转载请注明出处。

maxims 发表于 2016-10-3 08:23:48

好神奇的东西…先收了!

血阳 发表于 2016-10-3 14:29:50

果然女神是进步的动力源泉233333

沧海笑1122 发表于 2016-10-3 21:19:58

太厉害了吧!点开实际效果,方识庐山真面目!!!赞,期待后续帖子和应用。
顺便说一句,有python版的吗:lol

小猪会轮滑 发表于 2016-10-3 21:53:03

:lol求系列教程 让小白长知识

darkorigin 发表于 2016-10-9 15:51:51

高手,流弊啊

csgtli 发表于 2016-10-20 14:11:24

太主深了!!!!!

野子yz 发表于 2016-11-25 20:13:31

嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿

suoma 发表于 2017-5-13 12:03:49

硬件是什么?
页: [1]
查看完整版本: 给女神画一张一笔肖像画!