• 大小: 12KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-11
  • 语言: C/C++
  • 标签: C语言  

资源简介

这是分水岭算法的纯C实现,针对8位灰度图做处理。结果和Matlab自带分水岭算法效果类似。

资源截图

代码片段和文件信息

#include “waterthreshold.h“
#include “malloc.h“
#include “stdio.h“
#include “FIFO.H“
#include “math.h“
#include “filter.h“
#include “debug.h“

#define INIT -1
#define MASK -2
#define ENFIFOED -3 //表示该像素标号是MASK,并且已经被加入到队列当中了
#define WSHED 0
#define FICTITIOUS 0xFFFF
const QElemType BREAKPOINT={FICTITIOUSFICTITIOUS};

int * PixLabel=0;
PixInfor * SortedPixTable=0;
GrayStartPosition PixGrayStartPosition[256]={0};
#define PixAmount(x) (PixGrayStartPosition[x].amount)  //灰度为x的像素的总个数
#define PixStart(x) (PixGrayStartPosition[x].start)  //SortedPixTable中第一个灰度为x的像素所处位置
#define PixSet(x) (SortedPixTable+PixStart(x))  //灰度为x的像素集合
#define PixRow(x) ((x).row)
#define PixColumn(x) ((x).column)

/*******私有变量申明,仅用于本文件内私有函数间参数传递,以减少参数个数*********/
static Uint16 ImgWidth;
static Uint16 ImgHeight;
static FIFO queue;
static int CurLabel;
static int ErrorCode;

/*******私有函数申明,这些函数仅用于本文件内*************************/
static void SortPixs(Uint8 * inImgUint16 WidthUint16 Height);
static int GetNumberOfNeighbourWithPositiveLabel(Uint16 rowUint16 column);
static int doLabelPix(QElemType Pix);
static void ShowResult(Uint8 * outImgUint8 * inImgUint16 WidthUint16 Height);
static void WaterThreshold(Uint8 * inImg Uint16 WidthUint16 Height);
static void WTInit(Uint16 WidthUint16 Height);
static int CreateNewBasin(QElemType CurrentPix);
static int Grad(Uint8 * inImgint columnint row);
static void QuantizeImage(Uint8 * inImgUint8 * outImgUint16 WidthUint16 HeightUint8 Qsize);
static void ReverseImage(Uint8 * inImgUint8 * outImgUint16 WidthUint16 Height);

void ReverseImage(Uint8 * inImgUint8 * outImgUint16 WidthUint16 Height)
{
int i=0;
int imgsize = Width*Height;
for(i=0;i {
outImg[i] = 255-inImg[i];
}
}




void QuantizeImage(Uint8 * inImgUint8 * outImgUint16 WidthUint16 HeightUint8 QSize)
{
int i=0;
int imgsize = Height*Width;
for(i=0;i {
outImg[i] = (inImg[i]/QSize)*QSize;
}
}



void WTInit(Uint16 WidthUint16 Height)
{
int * ptr;
int ij;

SortedPixTable = (PixInfor*)malloc(sizeof(PixInfor)*((Width-2)*(Height-2)));

PixLabel = (int*)malloc(sizeof(int)*Width*Height);

ptr = PixLabel;
for(i=0;i {
for(j=0;j {
if( i==0 || j==0 || i==Height-1 || j==Width-1 )
{
*ptr = WSHED ; //将图像边缘像素的标号设为WSHED
}
else
{
*ptr = INIT;
}
ptr++;
}
}
}

void WTDeInit()
{
free(SortedPixTable);
free(PixLabel);
}


void WaterThrdMain(Uint8 * inImg Uint8 * outImgUint16 WidthUint16 Height)
{
WTInit(WidthHeight);
// ReverseImage(inImginImgWidthHeight);
// SmoothImage(inImgWidthHeight);
// FiltNoise(inImgWidthHeight);
// FiltNoise(inImgWidthHeight);

QuantizeImage(inImginImgWidthHeight6);

WaterThreshold(inImg WidthHeight);
ShowResult(outImginImgWidthHeight);
WTDeInit();
}

void ShowResult(Uint8 * outImgUint8 * inIm

评论

共有 条评论