资源简介
这是分水岭算法的纯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
- 上一篇:班级通讯录管理系统C语言课程设计
- 下一篇:语音信号处理与提取.zip
相关资源
- 班级通讯录管理系统C语言课程设计
- c语言实现json的创建及解析
- 51单片机c语言电子钟(已加入调时、
- 如何将字符转换成ASCII
- 基于AT89C52单片机的语音录放系统的
- c语言奔跑的火柴人游戏源码
- C语言实现PID控制直流电机调速含pro
- 基于C语言的 跨平台 zip unzip
- 蜂群算法C语言实现
- c语言实现iir滤波器
- 学生成绩管理系统含二叉树内容
- C语言实现的SM2数字签名验证
- 系统循环码C语言实现
- 利用TCP协议实现文件传输C语言
- TDMA算法 C语言编写
- linux C语言 socket通信聊天小程序
- MAX485两个单片机半双工通信
- c51单片机24C01-24C16读写程序含PROTEUS仿
- 一个基于DSP的软件无线电的c语言设计
- C语言龙贝格求积算法
- pic18系列单片机C语言程序例程
- c语言宿舍管理查询软件源代码数据结
- C语言实现 多线程文件传输
- 人工智能之动物识别C语言
- 串口接受和发送数据--C语言代码,非
- C语言课程设计记事本
- 操作系统C语言实现银行家算法,键盘
- 《数据结构》C语言版 实验报告 基础
- 飞行弹道计算C语言
- 多目标粒子群算法C代码
评论
共有 条评论