二值图像查找边界,并对边界进行搜索,剔除小边界
来源:互联网 发布:优化食物品质的添加剂 编辑:程序博客网 时间:2024/05/22 00:11
通过二值图像查找边界
代码:
//pImgData为输入的二值图像void TrackBoundary(unsigned char *pImgData, int nImgWidth, int nImgHeight){ //存储外边界 unsigned char *pBoudary = new unsigned char[nImgWidth * nImgHeight]; memset(pBoudary, 0, nImgWidth * nImgHeight * sizeof(unsigned char)); int i, j, k; int direction[8][2] = {-1, -1, 0, -1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, -1, 0}; //从左上角像素开始,逆时针判断 for(i = 1; i < nImgHeight - 1; i++) { for(j = 1; j < nImgWidth - 1; j++) { if(pImgData[i * nImgWidth + j] > 0) { for(k = 0; k < 8; k++) { int ii = i + direction[k][0]; int jj = j + direction[k][1]; if(pImgData[ii * nImgWidth + jj] == 0) pBoudary[ii * nImgWidth + jj] = 255;//通过查找白色区域周围是否有黑色区域来确定是否为边界 } } } } //存储去除小边界后的边界图像 unsigned char *pFinalBoundary = new unsigned char[nImgWidth * nImgHeight]; memset(pFinalBoundary, 0, nImgWidth * nImgHeight * sizeof(unsigned char)); //存储搜寻标识 unsigned char *pSearchFlag = new unsigned char[nImgWidth * nImgHeight]; memset(pSearchFlag, 0, nImgWidth * nImgHeight * sizeof(unsigned char)); for(i = 1; i < nImgHeight - 1; i++) { for(j = 1; j < nImgWidth - 1; j++) { if(pBoudary[i * nImgWidth + j] > 0 && pSearchFlag[i * nImgWidth + j] == 0) Search(pBoudary, pFinalBoundary, pSearchFlag, nImgWidth, nImgHeight, i, j); } } memcpy(pImgData, pFinalBoundary, nImgWidth * nImgHeight * sizeof(unsigned char)); if(pBoudary != NULL) { delete[] pBoudary; pBoudary = NULL; } if(pFinalBoundary != NULL) { delete[] pFinalBoundary; pFinalBoundary = NULL; } if(pSearchFlag != NULL) { delete[] pSearchFlag; pSearchFlag = NULL; }}
对边界进行搜索,剔除小的边界
代码:
//其中vector<BoundaryPoint> BounVector;在全局中定义,BounVector是一个全局变量void Search(unsigned char *pImgData, unsigned char *pFinalBoundary, unsigned char *pSearchFlag, int nImgWidth, int nImgHeight, int row, int col){ BoundaryPoint BPoint; BPoint.x = col; BPoint.y = row; BounVector.push_back(BPoint); pSearchFlag[row * nImgWidth + col] = 1; int direction[8][2] = {-1, -1, 0, -1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, -1, 0}; //从左上角像素开始,逆时针判断 bool bIsStop = false; for(int k = 0; k < 8; k++) { int ii = row + direction[k][0]; int jj = col + direction[k][1]; if((ii < 0) || (jj < 0) || (ii > nImgHeight - 1) || (jj > nImgWidth - 1)) continue; if(pImgData[ii * nImgWidth + jj] > 0 && pSearchFlag[ii * nImgWidth + jj] == 0) { Search(pImgData, pFinalBoundary, pSearchFlag, nImgWidth, nImgHeight, ii, jj); bIsStop = true; } } if(bIsStop == false) return; if(!BounVector.empty()) { if(BounVector.size() < 50) { BounVector.clear(); return; } for(int z = 0; z < BounVector.size(); z++) { pFinalBoundary[BounVector[z].y * nImgWidth + BounVector[z].x] = 255; } BounVector.clear(); }}
0 0
- 二值图像查找边界,并对边界进行搜索,剔除小边界
- 边界
- 二分查找边界值
- 查找边界
- 边界,边界,还是边界
- 边界值
- 边界值
- 边界值
- matlab图像处理之二值图像内外边界跟踪
- 图像处理中边界搜索的陷阱
- ArcGIS中python对图层固定边界字段进行插值、渲染并输出图片
- 利用opencv逼近二值图像的边界点,并过滤不需要的边界,达到寻边效果。(转载请说明出处)
- 图片移动并进行边界判断
- 二值图像形态学处理之边界检测
- matlab练习程序(二值图像内外边界跟踪)
- 图像分割(二)边界跟踪法
- 跨越边界:对 Rails 进行扩展
- 对二维数据进行边界拓展
- Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具
- 当我开始读大学时,我谈些什么
- PL\SQL 打开时出现"动态执行表不可访问,本会话的自动统计被禁止"
- JavaScript常用内置对象(window、document、form对象)
- 第五周项目10求两个数的正差值
- 二值图像查找边界,并对边界进行搜索,剔除小边界
- 前端之旅
- easyui datagrid表格数据为空美化
- HDU5898数位DP
- Android面试经验 -- 乐视
- 如何做SEO项目管理?
- 第五周-项目2-3发工资
- C语言小知识点 汇总4 指针及指针与数组
- 耳切法处理多边形三角划分