Opencv——基于索引表的图像细化

图像细化针对的是二值图像  或者用阀值处理的二值图像。基于索引表的细化算法大致是遍历被二值化图像的边缘,根据边缘点的八连通域情况查找索引表以确定该边缘点是否能够被删除。根据一些细化规则我们可以建立索引表,因此我们的主要工作就是不断地遍历边缘进行是否删除判断,直至边缘的每一个点都不能再被细化(删除)。

(1):例子 左边为输入图像 右边为细化的效果图

(2)思想:

公式: y = p0*2^0 + p1*2^1+ p2*2^2 + p3*2^3 + p4*2^4 + p5*2^5 + p6*2^6 +p7*2^7

这八个点的取值范围为{0,1}   (1表示255)

对于这八个点的不同取值情况,按如下顺序表示的二进制的值也将有不同的取值

 P7 

 P6 

 P5 

 P4 

 P3 

 P2 

 P1 

 P0 

 Sum 

 Delete Enable 

 

 

 

 

 

 

 

 

 

 

其中Sum的取值从0~255,Delete Enable为1表示可以删除,为0表示不能删除,这样我们就建立了一个索引表deletemark[256]

         前辈们对此作出了总结,得出每个点周围8领域的256种情况,放在一个char data[256]的数组中,不可以删除用0来表示,能被删除的用1来表示。然后对图像进行处理得到二值图像<0和1>,扫描图像,根据公式得出y,依次用data[y]判断该点是否可以被删除,直到所有的点都不可以被删除为止。

(3)算法步骤:

(4)代码:

#include <stdlib.h>
#include <string.h>#include "cv.h"
#include "highgui.h"
#include "cxcore.h"//基于索引表的细化细化算法
//功能:对图象进行细化
//参数:lpDIBBits:代表图象的一维数组
//      lWidth:图象高度
//      lHeight:图象宽度
//      无返回值
bool ThiningDIBSkeleton (unsigned char* lpDIBBits, int lWidth, int lHeight)
{	//循环变量long i;long j;long lLength;unsigned char deletemark[256] = {      // 这个即为前人据8领域总结的是否可以被删除的256种情况0,0,0,0,0,0,0,1,	0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,	0,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,	1,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,	1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	1,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,	1,0,1,1,1,0,1,1,0,0,1,1,0,0,1,1,	0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,	0,0,0,1,0,0,1,1,1,1,0,1,0,0,0,1,	0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,1,	1,1,0,0,1,0,0,0,0,1,1,1,0,0,1,1,	0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,	0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,	1,1,0,0,1,1,0,0,1,1,1,1,0,0,1,1,	1,1,0,0,1,1,0,0};//索引表unsigned char p0, p1, p2, p3, p4, p5, p6, p7;unsigned char *pmid, *pmidtemp;    // pmid 用来指向二值图像  pmidtemp用来指向存放是否为边缘unsigned char sum;bool bStart = true;lLength = lWidth * lHeight;unsigned char *pTemp = new uchar[sizeof(unsigned char) * lWidth * lHeight]();  //动态创建数组 并且初始化//    P0 P1 P2//    P7    P3//    P6 P5 P4while(bStart){bStart = false;//首先求边缘点pmid = (unsigned char *)lpDIBBits + lWidth + 1;memset(pTemp,  0, lLength);pmidtemp = (unsigned char *)pTemp + lWidth + 1; //  如果是边缘点 则将其设为1for(i = 1; i < lHeight -1; i++)     {for(j = 1; j < lWidth - 1; j++){if( *pmid == 0)                   //是0 不是我们需要考虑的点{pmid++;pmidtemp++;continue;}p3 = *(pmid + 1);p2 = *(pmid + 1 - lWidth);p1 = *(pmid - lWidth);p0 = *(pmid - lWidth -1);p7 = *(pmid - 1);p6 = *(pmid + lWidth - 1);p5 = *(pmid + lWidth);p4 = *(pmid + lWidth + 1);				sum = p0 & p1 & p2 & p3 & p4 & p5 & p6 & p7;if(sum == 0){*pmidtemp = 1;       // 这样周围8个都是1的时候  pmidtemp==1 表明是边缘     					}pmid++;pmidtemp++;}pmid++;pmid++;pmidtemp++;pmidtemp++;}//现在开始删除pmid = (unsigned char *)lpDIBBits + lWidth + 1;pmidtemp = (unsigned char *)pTemp + lWidth + 1;for(i = 1; i < lHeight -1; i++)   // 不考虑图像第一行 第一列 最后一行 最后一列{for(j = 1; j < lWidth - 1; j++){if( *pmidtemp == 0)     //1表明是边缘 0--周围8个都是1 即为中间点暂不予考虑{pmid++;pmidtemp++;continue;}p3 = *(pmid + 1);p2 = *(pmid + 1 - lWidth);p1 = *(pmid - lWidth);p0 = *(pmid - lWidth -1);p7 = *(pmid - 1);p6 = *(pmid + lWidth - 1);p5 = *(pmid + lWidth);p4 = *(pmid + lWidth + 1);p1 *= 2;p2 *= 4;p3 *= 8;p4 *= 16;p5 *= 32;p6 *= 64;p7 *= 128;sum = p0 | p1 | p2 | p3 | p4 | p5 | p6 | p7;//	sum = p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7;if(deletemark[sum] == 1){*pmid = 0;bStart = true;      //  表明本次扫描进行了细化}pmid++;pmidtemp++;}pmid++;pmid++;pmidtemp++;pmidtemp++;}}delete []pTemp;return true;
}int main(int argc, char* argv[])
{IplImage* src = cvLoadImage("E:\\study_opencv_video\\testthin\\char2.png",0);cvThreshold(src,src,100,255,CV_THRESH_BINARY);unsigned char* imagedata ;cvNamedWindow("s",0);cvShowImage("s" , src);imagedata = new uchar[sizeof(char)*src->width*src->height]();int x , y;for(y=0;y<src->height;y++){unsigned char* ptr  = (unsigned char*)(src->imageData + y*src->widthStep);for(x=0;x<src->width;x++){imagedata[y*src->width+x] = ptr[x] > 0 ? 1 : 0;}}ThiningDIBSkeleton(imagedata,src->width,src->height);for(y=0;y<src->height;y++){unsigned char* ptr  = (unsigned char*)(src->imageData + y*src->widthStep);for(x=0;x<src->width;x++){ptr[x] = imagedata[y*src->width + x]>0? 255 : 0;}}cvNamedWindow("src",0);cvShowImage("src" , src);cvWaitKey(0);delete []imagedata;return 0;
}

//

 转载:https://blog.csdn.net/lu597203933/article/details/14397605

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepMind推出首个商业产品,30秒内准确诊断眼疾!

来源&#xff1a;Financial Times、智东西编译摘要&#xff1a;这个设备能像最好的医学专家一样&#xff0c;准确地诊断各种眼部疾病。4月1日&#xff0c;谷歌母公司Alphabet旗下位于伦敦的AI部门DeepMind已打造出了可诊断复杂眼部疾病的商业医疗设备原型&#xff0c;这将是Dee…

Opencv——Sobel边缘检测

1、代码如下&#xff1a; #include "stdafx.h" #include <opencv2/opencv.hpp>using namespace cv;int main() {Mat srcImage imread("lena.jpg");Mat dstImage_x, dstImage_y;Sobel(srcImage, dstImage_x, CV_8U, 1, 0);Sobel(srcImage, dstImag…

Head first servlet and jsp学习笔记

学习中遇到的问题&#xff1a;java基础不行&#xff0c;都忘光了。 主要是&#xff1a;继承&#xff0c;接口&#xff0c;多线程&#xff0c;IO。尤其是多线程&#xff0c;在分布式系统中应该使用的比较多 第一章&#xff1a;前言和体系结构 HTTP协议&#xff1a; TCP/IP的上层…

一文解析|首个上榜科创板的机器人企业,江苏北人“闯关记”

来源&#xff1a;机器人大讲堂摘要&#xff1a;随着上交所公布了科创板首批受理上市申请的企业名单&#xff0c;这九家企业的每一家都被拿到放大镜下细细观察&#xff0c;评头论足。而其中&#xff0c;江苏北人作为登上科创版的首家机器人企业似乎受到的关注最多。江苏北人是一…

Matlab——绘制基础曲线

1、代码如下&#xff1a; close all;clear all;clc; %关闭所有图形窗口&#xff0c;清除工作空间所有变量&#xff0c;清空命令行 x0:0.02:10; y1sin(x); y22*sin(x); plot(x,y1,b*:,x,y2,r-); %设置颜色、标记和线型 axis([0 pi 0 2]); %设置坐标轴 title(正弦曲…

2018年中美独角兽研究报告

来源&#xff1a;前瞻产业研究院截至2018年12月31日&#xff0c;中国共有205家独角兽企业&#xff0c;占全球独角兽总量的48%&#xff0c;美国共有149家独角兽企业&#xff0c;占全球独角兽总量的35%。中美独角兽行业估值结构差异明显&#xff0c; 但总体看来&#xff0c;对于中…

Matlab——高斯白噪声处理

1、代码如下&#xff1a; close all;clear all;clc; %关闭所有图形窗口&#xff0c;清除工作空间所有变量&#xff0c;清空命令行 Iimread(eight.tif); Aimnoise(I,gaussian,0,0.05); %加入高斯白噪声 JA; M3; %设置叠加次数 Jim2double(J); Iim2…

中国首份自动驾驶路测报告:自主车企全面落后

来源&#xff1a;车云摘要&#xff1a;首份中国自动驾驶路测报告&#xff0c;透露着科技企业的野心和中国车企的无奈。近日&#xff0c;我国首份自动驾驶车辆道路测试年度报告出炉。这份由北京市发布的自动驾驶道路测试报告中&#xff0c;首次披露了自动驾驶相关企业&#xff0…

19个决定性时刻,2030年前,这些黑科技必将发生

来源&#xff1a;科技联盟技术中心摘要&#xff1a;从无人驾驶汽车到机器人工人&#xff0c;在我们熟悉所有这一切之前&#xff0c;未来正迎面走来。根据世界经济论坛全球议程理事会关于《未来软件与社会》的一份报告&#xff0c;到2025年前&#xff0c;很多新兴技术将会达到其…

推荐两本移动开发挺火的书

移动开发最好的入门书&#xff0c;而且例子实战特别多&#xff0c;是大学生的首选。 转载于:https://www.cnblogs.com/book2006/p/4487688.html

Matlab——图像缩放(插值法)

实验内容&#xff1a; 用双线性内插法实现位深度为8的灰度图像的缩放。 思路&#xff1a; 输入原图像以及缩放后图像的像素要求&#xff08;宽度*高度&#xff09;&#xff0c;处理后输出新图像。 我是用matlab来实现scale(input_img,scale_size)函数的&#xff0c;输入图像路径…

情感计算综述

来源&#xff1a;人机与认知实验室自然的齐一性指未检验过的物体将在某些相关的方面与我们已经检验过的同类物体相似。情感是人类智能的重要组成部分&#xff0c;是穿越理性的一把利器&#xff0c;然而&#xff0c;情感计算这一方向能否可行&#xff1f;如同形式化常识一样能否…

Matlab——对比度拉伸

1、代码如下&#xff1a; close all;clear all;clc; %关闭所有图形窗口&#xff0c;清除工作空间所有变量&#xff0c;清空命令行 Iimread(pout.tif); Jimadjust(I,[0.2 0.5],[0 1]);%将0.2-0.5之间的灰度扩展到整个0-1范围&#xff0c;这种处理 对于强调感兴趣灰度区非常有用…

形态学——腐蚀

1、基本概念 腐蚀 是一种消除连通域的边界点&#xff0c;使边界向内收缩的处理。 例如&#xff1a; 注&#xff1a;图像画面上边框处不能被结构元素覆盖的部分可以保持原来的值不变&#xff0c;也可以置为背景。 2、设计思想 设计一个结构元素&#xff0c;结构元素的原点定…

从现在到未来50年,传感器将如何改变世界?

来源&#xff1a;资本实验室2011年&#xff0c;网景公司创始人与风险投资家马克安德森提出了非常具有创见&#xff0c;而且已经成为现实的观点&#xff1a;“软件正在吞噬世界”。到今天&#xff0c;如果把句子中的“软件”替换为“传感器”&#xff0c;这一观点同样适用。自传…

开发过程中编写的一些批处理

1.BuildRelease.bat 用于不开启VS直接编译、部署、创建和恢复快照 WindowsPhone APP&#xff0c;注册WindowsPhone手机。 进行了编译和部署的效果&#xff1a; BuildRelease.bat 1 echo off2 pushd "%~dp0"3 title Build Release4 set folder%CD%5 set MSBUILD%windi…

形态学——膨胀

1、基本概念 膨胀是将与目标区域的背景点合并到该目标物中&#xff0c;使目标物边界向外部扩张的处理。 例如&#xff1a; 2、设计思想 设计一个结构元素&#xff0c;结构元素的原点定位在背景像素上&#xff0c;判断是否覆盖有目标点&#xff0c;来确定是否该点被膨胀为目标…

剖析20世纪未来出行 这些畅想21世纪能成吗?

来源&#xff1a;popsci编译&#xff1a; 网易智能 (乐邦)近年来有关飞行汽车、超级高铁、喷气背包、无人驾驶汽车等新型交通工具的报道一直不绝于耳&#xff0c;但目前这些领域的产品似乎都还算不上真正切实可行。说好的移动出行未来在哪里呢&#xff1f;人们梦寐以求的这些交…

图像分割——迭代式阈值分割

1、算法步骤&#xff1a; &#xff08;1&#xff09;预定义两阈值之差dt &#xff08;2&#xff09;选定初始阈值T0&#xff08;一般为图像的平均灰度&#xff09; &#xff08;3&#xff09;用T分割图像为G1、G2两组&#xff0c;G1由灰度值大于T的所有像素组成&#xff0c;…

第一本用机器生成的书籍由施普林格•自然出版

Lithium-Ion BatteriesA Machine-Generated Summary of Current Research来源&#xff1a;Springer丨公众号摘要&#xff1a;这本创新的原型书引人入胜地概述了锂离子电池的最新研究。与德国法兰克福大学应用计算语言学实验室合作开发的一种算法自动编写了这本书。施普林格•自…