本帖最后由 草祭祀 于 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[y*origin->widthStep+x];
- tempi->imageData[y*tempi->widthStep+x]=g/gray>ditherMatrix(x%(1<<(c-1)),y%(1<<(c-1)),c-1)?(char)(unsigned char)255:(char)(unsigned char)0;
- }
- }
复制代码
什么叫做摆动矩阵呢,简单说就是一种打印时候用的二值化算法。一些打印机的颜色是由色点的密度组成的,白点越密,就看上去越亮,黑点越密,看上去越暗。
摆动矩阵代码: - int dither[4]={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个了,以此类推。
0 96 24 120 6 102 30 126
64 32 88 56 70 38 94 62
16 112 8 104 22 118 14 110
80 48 72 40 86 54 78 46
4 100 28 124 2 98 26 122
68 36 92 60 66 34 90 58
20 116 12 108 18 114 10 106
84 52 76 44 82 50 74 42
三阶阵四角每4*4的块是由二阶阵加常数得到的的。
摆动矩阵尽可能利用黑和白两种颜色还原了图像的亮感和边缘,阶数小的时候,还原边缘比较锋利,阶数大的时候,还原亮感比较好。
一般取3阶或者4阶。
下面我要开始介绍希尔伯特曲线了。
希尔伯特曲线是一种分形曲线,可以一条线遍历一个空间。、
生成希尔伯特曲线: - CvPoint2D32f hil[4]={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[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,1,z);
- break;
- case 1:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,0,z);
- break;
- case 2:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,3,z);
- break;
- case 3:
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,2,z);
- break;
- }
- }
- else
- {
- switch(character)
- {
- case 0:
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,1,z);
- break;
- case 1:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,0,z);
- break;
- case 2:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,3,z);
- break;
- case 3:
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,2,z);
- break;
- }
- }
- }
- else
- {
- switch(character)
- {
- case 0:
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,1,z);
- break;
- case 1:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,0,z);
- break;
- case 2:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,3,z);
- break;
- case 3:
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,2,z);
- break;
- }
- }
- }
- else
- {
- switch(character)
- {
- case 0:
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,1,z);
- break;
- case 1:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,0,z);
- break;
- case 2:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,3,z);
- break;
- case 3:
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].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[i].x+image->width/2,vP[i].y+image->height/2),cvPoint(vP[i+1].x+image->width/2,vP[i+1].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[i].x+image->width/2,vP[i].y+image->height/2),cvPoint(vP[i+1].x+image->width/2,vP[i+1].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[9];
- int DY[9];
- int OPPOSITE[9];
- int grid[WIDTH][HEIGHT];
- 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[i];
- array[i] = array[r];
- array[r] = temp;
- }
- return 1;
- }
- bool check_valid(int x,int y, int grid[WIDTH][HEIGHT])
- {
- if(x>=0&&x<WIDTH&&y>=0&&y<HEIGHT)
- return grid[x][y];
- else
- return 1;
- }
- int carve_passage_from(int cx, int cy, int grid[WIDTH][HEIGHT])
- {
- int dx, dy, nx, ny;
- int directions[4] = {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[i]);
- }*/
- //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[directions[i]];
- dy = DY[directions[i]];
- // printf("Check direction=x:y - %d=%d:%d\n", directions[i], 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[nx][ny] == 0) {
- grid[cx][cy] = (int)((int)grid[cx][cy] | (int)directions[i]);
- grid[nx][ny] = (int)((int)grid[nx][ny] | (int)OPPOSITE[directions[i]]);
- 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]:0,b?c.val[1]:0,b?c.val[2]: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[cy*temp->widthStep+x]==(char)(unsigned char)255&&image->imageData[cy*image->widthStep+x]==(char)(unsigned char)0)
- {
- xP=x-cx;
- break;
- }
- }
- for (int x=cx;x>=0;x--)
- {
- if(temp->imageData[cy*temp->widthStep+x]==(char)(unsigned char)255&&image->imageData[cy*image->widthStep+x]==(char)(unsigned char)0)
- {
- xM=cx-x;
- break;
- }
- }
- for (int y=cy;y<temp->height;y++)
- {
- if(temp->imageData[y*temp->widthStep+cx]==(char)(unsigned char)255&&image->imageData[y*image->widthStep+cx]==(char)(unsigned char)0)
- {
- yP=y-cy;
- break;
- }
- }
- for (int y=cy;y>=0;y--)
- {
- if(temp->imageData[y*temp->widthStep+cx]==(char)(unsigned char)255&&image->imageData[y*image->widthStep+cx]==(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[WIDTH*2+1][HEIGHT*2+1],bool temp[WIDTH*2+1][HEIGHT*2+1])
- {
- int dx, dy, nx, ny;
- int directions[4] = {N, E, S, W};
- for(int i = 0; i < 4; i++) {
- dx = DX[directions[i]];
- dy = DY[directions[i]];
- nx = cx + dx;
- ny = cy + dy;
- if(temp[nx][ny]==0&&grid2[nx][ny]==1)
- {
- temp[nx][ny]=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[N] = S;
- OPPOSITE[E] = W;
- OPPOSITE[S] = N;
- OPPOSITE[W] = E;
- DX[N] = 0;
- DX[E] = 1;
- DX[S] = 0;
- DX[W] = -1;
- DY[N] = -1;
- DY[E] = 0;
- DY[S] = 1;
- DY[W] = 0;
- memset(&grid[0], 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[x][y] & S) != 0)?" ":"_");
- if((grid[x][y] & E) != 0){
- printf((( (grid[x][y] | grid[x + 1][y]) & S) != 0) ?" ":"_");
- } else {
- printf("|");
- }
- }
- printf("\n");
- }*/
- bool grid2[WIDTH*2+1][HEIGHT*2+1];
- bool temp[WIDTH*2+1][HEIGHT*2+1];
- memset(&temp[0], 0, sizeof(temp));
- for (int i=0;i<WIDTH*2+1;i++)
- {
- block_a(img,i,0,0);
- grid2[i][0]=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][j*2+1]=0;
- for (int i=0;i<WIDTH;i++)
- {
- if((grid[i][j]&E)!=0&&(grid[i][j]&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[i*2+1][j*2+1]=1;
- grid2[i*2+1][j*2+2]=0;
- grid2[i*2+2][j*2+1]=1;
- grid2[i*2+2][j*2+2]=0;
- }
- else if((grid[i][j]&E)==0&&(grid[i][j]&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[i*2+1][j*2+1]=1;
- grid2[i*2+1][j*2+2]=1;
- grid2[i*2+2][j*2+1]=0;
- grid2[i*2+2][j*2+2]=0;
- }
- else if((grid[i][j]&E)!=0&&(grid[i][j]&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[i*2+1][j*2+1]=1;
- grid2[i*2+1][j*2+2]=1;
- grid2[i*2+2][j*2+1]=1;
- grid2[i*2+2][j*2+2]=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[i*2+1][j*2+1]=1;
- grid2[i*2+1][j*2+2]=0;
- grid2[i*2+2][j*2+1]=0;
- grid2[i*2+2][j*2+2]=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][0]=1;
- block_a(img,WIDTH*2-1,0,1);
- grid2[WIDTH*2-1][HEIGHT*2]=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[j*image->widthStep+i];
- 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-1][main_role.y]&&main_role.x>0)
- main_role.x--;
- break;
- case 'd':
- if(grid2[main_role.x+1][main_role.y]&&main_role.x<WIDTH*2+1)
- main_role.x++;
- break;
- case 's':
- if(grid2[main_role.x][main_role.y+1]&&main_role.y<HEIGHT*2+1)
- main_role.y++;
- break;
- case 'w':
- if(grid2[main_role.x][main_role.y-1]&&main_role.y>0)
- main_role.y--;
- break;
- }
- if(c=='q')
- break;
- }
- }
- else
- {
- cvSaveImage("maze.bmp",img);
- maze=cvCloneImage(img);
- }
- return 1;
- }
- int dither[4]={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[4]={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[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,1,z);
- break;
- case 1:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,0,z);
- break;
- case 2:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,3,z);
- break;
- case 3:
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,2,z);
- break;
- }
- }
- else
- {
- switch(character)
- {
- case 0:
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,1,z);
- break;
- case 1:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,0,z);
- break;
- case 2:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,3,z);
- break;
- case 3:
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,2,z);
- break;
- }
- }
- }
- else
- {
- switch(character)
- {
- case 0:
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,1,z);
- break;
- case 1:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,0,z);
- break;
- case 2:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,3,z);
- break;
- case 3:
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,2,z);
- break;
- }
- }
- }
- else
- {
- switch(character)
- {
- case 0:
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,1,z);
- break;
- case 1:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,0,z);
- break;
- case 2:
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,1,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,2,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].y*order/2+c.y),order/2,3,z);
- break;
- case 3:
- hilbert(img,cvPoint(hil[0].x*order/2+c.x,hil[0].y*order/2+c.y),order/2,0,z);
- hilbert(img,cvPoint(hil[3].x*order/2+c.x,hil[3].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[2].x*order/2+c.x,hil[2].y*order/2+c.y),order/2,3,z);
- hilbert(img,cvPoint(hil[1].x*order/2+c.x,hil[1].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[y*image->widthStep+x];
- }
- /*
- 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[WIDTH][HEIGHT])
- {
- 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[i].x+image->width/2,vP[i].y+image->height/2),cvPoint(vP[i+1].x+image->width/2,vP[i+1].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[i].x+image->width/2,vP[i].y+image->height/2),cvPoint(vP[i+1].x+image->width/2,vP[i+1].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[i][j]=check_in(image,x,y);
- if(grid[i][j]!=0)
- carve_passage_from(i,j,grid);
- }
- }*/
- }
- /*
- void merge(IplImage* image,char* name)
- {
- IplImage** imag=new IplImage*[bits-8];
- IplImage* total=cvCreateImage(cvSize(256*(bits-7),256),8,image->nChannels);
- imag[0]=cvCreateImage(cvSize(image->width/2,image->height/2),8,image->nChannels);
- cvResize(image,imag[0]);
- for (int i=1;i<bits-8;i++)
- {
- imag[i]=cvCreateImage(cvSize(imag[i-1]->width/2,imag[i-1]->height/2),8,image->nChannels);
- cvResize(imag[i-1],imag[i]);
- }
- 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[yt*total->widthStep+xt*image->nChannels+k]=image->imageData[image->widthStep*y0+x0*image->nChannels+k];
- }
- }
- 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[i]->width/2;
- int y0=y+imag[i]->height/2;
- int xt=x+i*256+128+256;
- int yt=y+128;
- for(int k=0;k<3;k++)
- total->imageData[yt*total->widthStep+xt*image->nChannels+k]=imag[i]->imageData[imag[i]->widthStep*y0+x0*image->nChannels+k];
- }
- }
- }
- cvSaveImage(name,total);
- cvReleaseImage(&total);
- for (int i=0;i<bits-8;i++)
- {
- cvReleaseImage(&imag[i]);
- }
- }*/
- 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[y*origin->widthStep+x];
- tempi->imageData[y*tempi->widthStep+x]=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
验证问题忽略掉。
原创帖,转载请注明出处。 |