?? figure.cpp
字號:
/****************************************************************************
* File name :figure.c *
* Author : Peng Chun Ping and Ai Hao Jun *
* Date : December 24,1995 *
* Function: This file is an included file in p.c, in which we provide the *
* seven module of mathmatic Morphics' processes. *
* Collector:jiang ** 4/96 *
****************************************************************************/
#include "stdafx.h"
#include <math.h>
#include <stdlib.h>
#define Bright 255
#define Dark 0
#define Green 32
#define TempleteValue 1
int TempleteSize=7;
#define TempleteValue1 1
#define TempleteValue2 2
//#include "comapi.h"
/************* fspace_2d ***************************************/
/* To allocation a 2_dimension dynamic array */
void **fspace_2d(int row,int col,int lenth);
/******************************* ffree_2d ****************************/
/* To free a 2_dimension dynamic array */
void ffree_2d(void **a,int row);
/* bivalue the image */
void bivalue(unsigned char **array,int row,int col)
{
int r,c;
for(r=0;r<row;r++)
for(c=0;c<col;c++)
{
if(array[r][c]!=0)
array[r][c]=255;
}
return;
}
void Expand(unsigned char **Image, unsigned char **BufferImage,
unsigned char Templete[7][7], int row,int col)
{
// unsigned char **BufferImage;
int r,c,i,j;
/* create the buffer image */
// BufferImage=(unsigned char **)fspace_2d(row,col,sizeof(unsigned char));
// for(r=0;r<row;r++)
// for(c=0;c<col;c++)
// BufferImage[r][c]=0;
/* expand the image and put the result in buffer image */
for(r=TempleteSize/2;r<row-TempleteSize/2;r++)
for(c=TempleteSize/2;c<col-TempleteSize/2;c++)
// if(*(*(Image+r)+c)!=Dark){
if(Image[r][c]!=Dark){
for(i=0;i<TempleteSize;i++)
for(j=0;j<TempleteSize;j++){
if(Templete[i][j]==TempleteValue)
BufferImage[i+r-TempleteSize/2][c+j-TempleteSize/2]=Bright;
}
/* else
*(*(BufferImage+i+r-TempleteSize/2)+c+j-TempleteSize/2)
=*(*(Image+i+r-TempleteSize/2)+c+j-TempleteSize/2);*/
}
// for(r=TempleteSize/2;r<row-TempleteSize/2;r++)
// for(c=TempleteSize/2;c<col-TempleteSize/2;c++)
// {
///* if(*(*(Image+r)+c)==Dark&&BufferImage[r][c]!=Dark)
// *(*(Image+r)+c)=Green;
// else*/
// Image[r][c]=*(*(BufferImage+r)+c);
// }
// ffree_2d((void **)BufferImage,row);/* release the buffer image */
// return ;
}
/* reflect the templete */
void Reflect(unsigned char Templete[7][7])
{
int r,c;
int TempleteSize=7;
unsigned char **temp;
/* create temporary memory for templete */
temp=(unsigned char **)fspace_2d(TempleteSize,TempleteSize,1);
for(r=0;r<TempleteSize;r++)
for(c=0;c<TempleteSize;c++)
temp[r][c]=0;
for(r=0;r<TempleteSize;r++)
for(c=0;c<TempleteSize;c++)
temp[r][c]=Templete[TempleteSize-1-r][TempleteSize-1-c];
for(r=0;r<TempleteSize;r++)
for(c=0;c<TempleteSize;c++)
Templete[r][c]=temp[r][c];
ffree_2d((void **)temp,TempleteSize);/* release the temporary memory */
return ;
}
/* put the image into contray value */
void Contrary(unsigned char **Image,int row,int col)
{
int r,c;
for(r=0;r<row;r++)
for(c=0;c<col;c++){
if(Image[r][c]==Dark)
Image[r][c]=Bright;
else
Image[r][c]=Dark;
}
}
/* rot the image */
void Rot(unsigned char **Image, unsigned char **OutImage,
unsigned char Templete[7][7], int row,int col )
{
// int r,c;
unsigned char **temp;
temp=(unsigned char **)fspace_2d(row,col,1);
for(int i=0;i<row;i++)
for(int j=0;j</*/row/*/col;j++)
temp[i][j]=Image[i][j];
Contrary(temp,row,col);/* put the image into contray value */
Reflect(Templete);/* reflect the templete */
Expand(temp,OutImage,Templete,row,col);/* expand the image */
bivalue(OutImage,row,col);
Contrary(OutImage,row,col);/* put the image into contray value */
ffree_2d((void **)temp,row);/* release the buffer image */
}
void Open(unsigned char **Image, unsigned char **OutImage,
unsigned char Templete[7][7], int row,int col)
{
/* create the buffer image */
unsigned char **BufferImage;
BufferImage=(unsigned char **)fspace_2d(row,col,sizeof(unsigned char));
Rot(Image,BufferImage,Templete,row,col);/* rot the image */
Expand(BufferImage,OutImage,Templete,row,col);/* expand the image */
bivalue(OutImage,row,col);
ffree_2d((void **)BufferImage,row);/* release the buffer image */
}
void Close(unsigned char **Image, unsigned char **OutImage,
unsigned char Templete[7][7], int row,int col)
{
unsigned char **BufferImage;
BufferImage=(unsigned char **)fspace_2d(row,col,sizeof(unsigned char));
Expand(Image,BufferImage,Templete,row,col);/* expand the image */
bivalue(BufferImage,row,col);
Rot(BufferImage,OutImage,Templete,row,col);/* rot the image */
ffree_2d((void **)BufferImage,row);/* release the buffer image */
}
void Hit(unsigned char **Image, unsigned char **OutImage,
unsigned char Templete[7][7], int row,int col)
{
unsigned char Templete1[7][7],Templete2[7][7];
unsigned char **BufferImage;
int r,c;
/* assign value to the separate templete */
// Templete1=(unsigned char **)fspace_2d(TempleteSize,TempleteSize,sizeof(unsigned char));
// Templete2=(unsigned char **)fspace_2d(TempleteSize,TempleteSize,sizeof(unsigned char));
for(r=0;r<TempleteSize;r++)
for(c=0;c<TempleteSize;c++)
if(Templete[r][c]==TempleteValue1)
Templete1[r][c]=TempleteValue;
else if(Templete[r][c]==TempleteValue2)
Templete2[r][c]=TempleteValue;
else{
Templete1[r][c]=0;
Templete2[r][c]=0;
}
/* create the buffer image */
BufferImage=(unsigned char **)fspace_2d(row,col,sizeof(unsigned char));
/* for(r=0;r<row;r++)
for(c=0;c<col;c++)
*(*(BufferImage+r)+c)=*(*(Image+r)+c);
*/
Rot(Image,BufferImage,Templete1,row,col); /* rot the image with No.1 templete */
Reflect(Templete2);/* reflect the No.2 templete */
Expand(BufferImage,OutImage,Templete2,row,col);/* expand the buffer image */
bivalue(OutImage,row,col);/* bivalue the image */
for(r=0;r<row;r++)/* substract the buffer image out of image */
for(c=0;c<col;c++){
if(Image[r][c]==BufferImage[r][c]&&Image[r][c]!=Dark)
OutImage[r][c]=Dark;
}
/* release the meory */
ffree_2d((void **)BufferImage,row);
// ffree_2d((void **)Templete1,TempleteSize);
// ffree_2d((void **)Templete2,TempleteSize);
}
/* slim the image */
void Slim(unsigned char **Image, unsigned char **OutImage,
unsigned char Templete[7][7], int row,int col)
{
int r,c;
/* hit the Original image */
Hit(Image,OutImage,Templete,row,col);
/* substract the hit image from original image */
for(r=0;r<row;r++)
for(c=0;c<col;c++)
if(OutImage[r][c]==Image[r][c])
OutImage[r][c]=Dark;
}
void Fat(unsigned char **Image, unsigned char **OutImage,
unsigned char Templete[7][7], int row,int col)
{
int r,c;
/* hit the Original image */
Hit(Image,OutImage,Templete,row,col);
/* add the hit image to original image */
for(r=0;r<row;r++)
for(c=0;c<col;c++)
if(OutImage[r][c]!=0 && Image[r][c]==0)
;
else
OutImage[r][c]=Image[r][c];
}
/********************END OF FIGURE.C*************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -