给女神画一张一笔肖像画!
本帖最后由 草祭祀 于 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
验证问题忽略掉。
原创帖,转载请注明出处。 好神奇的东西…先收了! 果然女神是进步的动力源泉233333 太厉害了吧!点开实际效果,方识庐山真面目!!!赞,期待后续帖子和应用。
顺便说一句,有python版的吗:lol :lol求系列教程 让小白长知识 高手,流弊啊 太主深了!!!!! 嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿 硬件是什么?
页:
[1]