⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 figure.cpp

📁 图像处理源代码VC
💻 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 + -