资源简介
图像处理连通域算法 c++ ,vc 6.0
代码片段和文件信息
/* Copyright (c) 2001 C. Grigorescu */
#include
#include
#include “ByteImage.h“
#include “IntImage.h“
#include “ConnectedComponents.h“
int ConnectedComponents(IntImage &img CONN_TYPE connectivity IntImage &out)
{
out = img;
int nr_comp = ConnectedComponents(out connectivity);
return (nr_comp);
}
int ConnectedComponents(ByteImage &img CONN_TYPE connectivity IntImage &out)
{
out.makeImage(img.getWidth() img.getHeight());
for (int i=0;i for (int j=0;j out[i][j] = img[i][j];
int nr_comp = ConnectedComponents(out connectivity);
return (nr_comp);
}
int ConnectedComponents(IntImage &img CONN_TYPE connectivity = FOUR)
{
/*
Computes “Connected Components“ using Tarjan‘s Union-Find algorithm;
the result is returned in the same buffer as gray_level image with values
equal to the label of the component.
Returns: the number of connected components */
int l p r curlab=1;
int i j n_up n_left n_right;
int lab[img.getSize()];
int *pixels = img.getPixels();
/* Start Tarjan‘s algorithm */
int w = img.getWidth();
int h = img.getHeight();
for (i=0; i for (j=0; j if (pixels[i*w+j] >= 0) {
p = pixels[i*w+j];
l = i*w+j;
lab[l] = l;
n_up = i-1;
if ((n_up >= 0) && (pixels[n_up*w+j] == p))
Union(l n_up*w+j lab);
n_left = j-1;
if ((n_left >= 0) && (pixels[i*w+n_left] == p))
Union(l i*w+n_left lab);
n_right = j+1;
if (connectivity == EIGHT) {
if ((n_right < w) && (n_up >= 0) &&
(pixels[n_up*w+n_right] == p))
Union(l n_up*w+n_right lab);
if ((n_left >= 0) && (n_up >= 0) &&
(pixels[n_up*w+n_left] == p))
Union(l n_up*w+n_left lab);
}
}
else
lab[i*w+j] = 0;
}
for (i=0; i for (j=0; j r = lab[i*w+j];
if (r == i*w+j) {
pixels[i*w+j] = curlab;
lab[i*w+j] = curlab++;
} else {
lab[i*w+j] = lab[r];
pixels[i*w+j] = lab[r];
}
}
return (curlab-1);
}
int Root(int r int *lab int size_x int size_y)
{
int p;
p = lab[(r/size_x)*size_x+(r%size_x)];
while (p != r) {
r = p;
p = lab[(r/size_x)*size_x+(r%size_x)];
}
return p;
}
int FindRoot(int r int *lab)
{
if ( r != lab[r] )
lab[r] = FindRoot(lab[r] lab);
return lab[r];
}
void Union(int x int y int *lab)
{
int r0 r1;
r0 = FindRoot(x lab);
r1 = FindRoot(y lab);
if (r0 > r1)
lab[r0] = r1;
else
lab[r1] = r0;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2508 2001-08-08 23:53 ConnectedComponents.h
文件 679 2004-03-25 09:35 EightConnectedSE.hpp
文件 671 2004-03-25 09:35 FourConnectedSE.hpp
文件 2619 2001-07-17 19:15 ConnectedComponents.cpp
文件 886 2004-03-25 09:35 EightConnectedSE.cpp
文件 755 2004-03-25 09:35 FourConnectedSE.cpp
----------- --------- ---------- ----- ----
8118 6
- 上一篇:单片机c头文件at89X51/AT89X52
- 下一篇:IP流量检测
相关资源
- DDA画线算法
- C++局域网文件传输
- 防火墙C++源码,测试可以运行
- 用c++自编的GPS单点定位程序源码
- 四叉树定义实现C++代码
- vc++简易图形编辑器MFC
- C++实现字符串求交集、并集、差集
- c++ 栈应用 使用标准库函数 源代码 原
- c++线性方程组求解源代码 原创
- 一个简单的C++抽签程序
- 《The c++ programming language 》的习题答案
- sha256-512加密算法
- NTFS数据恢复的c++类代码
- 矩阵连乘问题C++代码
- 用Socket 实现http协议
- RC4在C++中运行的代码
- c++primerplus第六版源码
- VC++ 串口实现双机互联 包含视窗加代
- C++面向对象程序设计第6版美Walter Sa
- Visual C++ MFC Web 浏览器
- 宇视科技2017C/C++开发笔试题
- c++字典列表
- linux下的C语言POSIX正则表达式头文件和
- C++源代码飞机订票系统
- VC++ MFC 如何用 CZip CUnzip类压缩解压缩
- C++课程设计选课系统
- 遗传算法C++实现若干
- Oracle 84%安装报错compat-libstdc++-33-3.2.
- c++实现的双向通信的socket小程序
- 旅店管理系统-课程作业
评论
共有 条评论