thinning&&opencv


  1 #include <stdlib.h>
2 #include <string.h>
3
4 #include "opencv/cv.h"
5 #include "opencv/highgui.h"
6 #include "opencv/cxcore.h"
7
8 IplImage* ColorSrc ,*ColorSrcCopy;
9
10 //#define SHOW
11
12 //#define LONG int
13 //#define BYTE unsigned char
14 /////////////////////////////////////////////////////////////////////////
15 //基于索引表的细化细化算法
16 //功能:对图象进行细化
17 //参数:lpDIBBits:代表图象的一维数组
18 // lWidth:图象高度
19 // lHeight:图象宽度
20 // 无返回值
21 bool ThiningDIBSkeleton (unsigned char* lpDIBBits, int lWidth, int lHeight)
22 {
23 //循环变量
24 long i;
25 long j;
26 long lLength;
27
28 unsigned char deletemark[256] = {
29 0,0,0,0,0,0,0,1, 0,0,1,1,0,0,1,1,
30 0,0,0,0,0,0,0,0, 0,0,1,1,1,0,1,1,
31 0,0,0,0,0,0,0,0, 1,0,0,0,1,0,1,1,
32 0,0,0,0,0,0,0,0, 1,0,1,1,1,0,1,1,
33 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
34 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
35 0,0,0,0,0,0,0,0, 1,0,0,0,1,0,1,1,
36 1,0,0,0,0,0,0,0, 1,0,1,1,1,0,1,1,
37 0,0,1,1,0,0,1,1, 0,0,0,1,0,0,1,1,
38 0,0,0,0,0,0,0,0, 0,0,0,1,0,0,1,1,
39 1,1,0,1,0,0,0,1, 0,0,0,0,0,0,0,0,
40 1,1,0,1,0,0,0,1, 1,1,0,0,1,0,0,0,
41 0,1,1,1,0,0,1,1, 0,0,0,1,0,0,1,1,
42 0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,
43 1,1,1,1,0,0,1,1, 1,1,0,0,1,1,0,0,
44 1,1,1,1,0,0,1,1, 1,1,0,0,1,1,0,0
45 };//索引表
46
47 unsigned char p0, p1, p2, p3, p4, p5, p6, p7;
48 unsigned char *pmid, *pmidtemp;
49 unsigned char sum;
50 int changed;
51 bool bStart = true;
52 lLength = lWidth * lHeight;
53 unsigned char *pTemp = (unsigned char *)malloc(sizeof(unsigned char) * lWidth * lHeight);
54
55 // P0 P1 P2
56 // P7 P3
57 // P6 P5 P4
58
59 while(bStart)
60 {
61 bStart = false;
62 changed = 0;
63
64 //首先求边缘点(并行)
65 pmid = (unsigned char *)lpDIBBits + lWidth + 1;
66 memset(pTemp, 0, lLength);
67 pmidtemp = (unsigned char *)pTemp + lWidth + 1;
68 for(i = 1; i < lHeight -1; i++)
69 {
70 for(j = 1; j < lWidth - 1; j++)
71 {
72 if( *pmid == 0)
73 {
74 pmid++;
75 pmidtemp++;
76 continue;
77 }
78
79 p3 = *(pmid + 1);
80 p2 = *(pmid + 1 - lWidth);
81 p1 = *(pmid - lWidth);
82 p0 = *(pmid - lWidth -1);
83 p7 = *(pmid - 1);
84 p6 = *(pmid + lWidth - 1);
85 p5 = *(pmid + lWidth);
86 p4 = *(pmid + lWidth + 1);
87
88 sum = p0 & p1 & p2 & p3 & p4 & p5 & p6 & p7;
89 if(sum == 0)
90 {
91 *pmidtemp = 1;
92
93 #ifdef SHOW
94 cvSet2D(ColorSrc,i,j,cvScalar(0,0,255));
95 #endif
96 }
97
98 pmid++;
99 pmidtemp++;
100 }
101 pmid++;
102 pmid++;
103 pmidtemp++;
104 pmidtemp++;
105 }
106 #ifdef SHOW
107 cvNamedWindow("color");
108 cvShowImage("color",ColorSrc);
109 cvWaitKey(0);
110 #endif
111
112 //现在开始串行删除
113 pmid = (unsigned char *)lpDIBBits + lWidth + 1;
114 pmidtemp = (unsigned char *)pTemp + lWidth + 1;
115
116 for(i = 1; i < lHeight -1; i++)
117 {
118 for(j = 1; j < lWidth - 1; j++)
119 {
120 if( *pmidtemp == 0)
121 {
122 pmid++;
123 pmidtemp++;
124 continue;
125 }
126
127 p3 = *(pmid + 1);
128 p2 = *(pmid + 1 - lWidth);
129 p1 = *(pmid - lWidth);
130 p0 = *(pmid - lWidth -1);
131 p7 = *(pmid - 1);
132 p6 = *(pmid + lWidth - 1);
133 p5 = *(pmid + lWidth);
134 p4 = *(pmid + lWidth + 1);
135
136 p1 *= 2;
137 p2 *= 4;
138 p3 *= 8;
139 p4 *= 16;
140 p5 *= 32;
141 p6 *= 64;
142 p7 *= 128;
143
144 sum = p0 | p1 | p2 | p3 | p4 | p5 | p6 | p7;
145 // sum = p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7;
146 if(deletemark[sum] == 1)
147 {
148 *pmid = 0;
149 bStart = true;
150
151 #ifdef SHOW
152 cvSet2D(ColorSrc,i,j,cvScalar(0,0,0));
153
154 cvNamedWindow("delcolor");
155 cvShowImage("delcolor",ColorSrc);
156 cvWaitKey(2);
157 #endif
158 }
159
160 pmid++;
161 pmidtemp++;
162 }
163
164 pmid++;
165 pmid++;
166 pmidtemp++;
167 pmidtemp++;
168 }
169
170 #ifdef SHOW
171 printf("过了一圈\n");
172 #endif
173
174
175 }
176
177 return true;
178 }
179
180
181
182 int main(int argc, char* argv[])
183 {
184
185
186 IplImage* src = cvLoadImage("t.png",0);
187 cvThreshold(src,src,100,255,CV_THRESH_BINARY);
188 unsigned char* imagedata ;
189
190 ColorSrc = cvLoadImage("t.png",1);
191
192 cvNamedWindow("s");
193 cvShowImage("s" , src);
194
195
196 FILE* fp ;
197
198 #ifdef WRITEIMAGE
199 fp = fopen("data255.txt","rt+");
200 #endif
201
202 imagedata = (unsigned char*)malloc(sizeof(char)*src->width*src->height);
203
204 int x , y;
205 for(y=0;y<src->height;y++)
206 {
207 unsigned char* ptr = (unsigned char*)(src->imageData + y*src->widthStep);
208 for(x=0;x<src->width;x++)
209 {
210 imagedata[y*src->width+x] = ptr[x] > 0 ? 1 : 0;
211
212 #ifdef WRITEIMAGE
213 if(ptr[x] > 0)
214 fprintf(fp,"1");
215 else
216 {
217 fprintf(fp,"0");
218 }
219 #endif
220 }
221
222 #ifdef WRITEIMAGE
223 fprintf(fp,"\n");
224 #endif
225 }
226
227 #ifdef WRITEIMAGE
228 fclose(fp);
229 #endif
230
231 #ifdef WRITERESULT
232 fp = fopen("result.txt","rt+");
233 #endif
234
235 ThiningDIBSkeleton(imagedata,src->width,src->height);
236
237 for(y=0;y<src->height;y++)
238 {
239 unsigned char* ptr = (unsigned char*)(src->imageData + y*src->widthStep);
240 for(x=0;x<src->width;x++)
241 {
242 ptr[x] = imagedata[y*src->width + x]>0? 255 : 0;
243
244 #ifdef WRITERESULT
245 if(ptr[x] > 0)
246 fprintf(fp,"1");
247 else
248 {
249 fprintf(fp,"0");
250 }
251 #endif
252 }
253
254 #ifdef WRITERESULT
255 fprintf(fp,"\n");
256 #endif
257 }
258
259 #ifdef WRITERESULT
260 fclose(fp);
261 #endif
262
263 cvNamedWindow("src");
264 cvShowImage("src" , src);
265 cvWaitKey(0);
266
267 cvReleaseImage(&src);
268 cvReleaseImage(&ColorSrc);
269 free(imagedata);
270
271 return 0;
272 }

基于

thinning&&opencv

时间: 2024-10-13 02:21:39

thinning&&opencv的相关文章

【opencv】图像细化

[opencv]图像细化 [opencv]图像细化 2014-02-17 21:03 5404人阅读 评论(14) 收藏 举报  分类: opencv(1)  版权声明:本文为博主原创文章,未经博主允许不得转载. 在我们进行图像处理的时候,有可能需要对图像进行细化,提取出图像的骨架信息,进行更加有效的分析. 图像细化(Image Thinning),一般指二值图像的骨架化(Image Skeletonization) 的一种操作运算. 所谓的细化就是经过一层层的剥离,从原来的图中去掉一些点,但仍

MAC平台下Xcode配置使用OpenCV的具体方法 (2016最新)

1.序言: 1.1 背景 本人小白一枚,不过因为最近在从事机器视觉方面的工作,所以接触到OpenCV. 因为工作需求,本人要在MAC端使用OpenCV实现一些视觉功能,配置环境成了最大的阻碍,网上查了很多相关资料和博客,都因为版本环境问题屡试屡败,不过经历重重尝试,笔者最终还是配置成功并运行了自己的源码.当然成功的关键还是因为笔者站在了巨人的肩膀上,借鉴了很多网上的教程,为了不误导大家配置的过程,参考文章的地址统一放在文章里,望各位大大看见之后能够理解,废话不说进入正题. 1.2 环境说明 如果

Ubuntu16.04安装tensorflow+安装opencv+安装openslide+安装搜狗输入法

Ubuntu16.04在cuda以及cudnn安装好之后,安装tensorflow,tensorflow以及opencv可以到网上下载对应的安装包并且直接在安装包所在的路径下直接通过pip与conda进行安装,如下图所示: 前提是要下载好安装包.安装好tensorflow之后还需要进行在~/.bashrc文件中添加系统路径,如下图所示 Openslide是医学图像一个重要的库,这里给出三条命令进行安装 sudo apt-get install openslide-tools sudo apt-g

关于opencv的文件配置详细内容

原文链接:http://blog.csdn.net/zhuce0001/article/details/21279527 最近在做opencv的一些代码的修修补补的工作: 但在此之前,根本没接触过cpp,更别谈vs,opencv 最近一段时间改代码,感觉自己学习很多东西,在这个过程中一直不断查资料,也没有时间去好好整理一下,但是查资料的过程中发现很多很好的博客,就记录下来方便自己日后查询,很感谢这些热爱分享的大佬 一.只对当前工程起作用的设置1. 设置头文件包含路径   工程上右击,选择"属性&

什么是图像 -- opencv基础

opencv基础篇--到底什么是图像 什么是图像?英语中有两个单词来形容图像,一个是picture,一个是image.这两者虽然是形容同一个东西,但却又有着区别.picture代表实而有物的真实图像:而image代表着计算机中存储的图像,也代表想象中的图像. 而我们更多研究的便是image,计算机图像从广义地可分为矢量图和像素图(位图).矢量图,是由一系列计算机指令描述和记录的一幅图,一幅图可以解为一系列由点.线.面等组成的子图.像素图,则是由很多个点组成的,每个点都是由二进制数据来描述和存储其

OpenCV点滴3

这段时间想稍微系统地学下: 1.Mat-基本图像容器: OpenCV函数中输出图像的内存分配是自动完成的(如果不特别指定的话). 使用OpenCV的C++接口时不需要考虑内存释放问题. 赋值运算符(=)和拷贝构造函数( Mat A,Mat B(A) )只拷贝信息头. 使用函数 clone() 或者 copyTo() 来拷贝一副图像的矩阵. Mat M(2,2, CV_8UC3, Scalar(0,0,255)); 行数,列数,8位,3通道,指定的值初始化: Point2f P(5,1) -->[

OpenCV教程

<OpenCV3编程入门>内容简介&勘误&配套源代码下载 [OpenCV入门教程之十八]OpenCV仿射变换 & SURF特征点描述合辑 [OpenCV入门教程之十七]OpenCV重映射 & SURF特征点检测合辑 [OpenCV入门教程之十六]OpenCV角点检测之Harris角点检测 [OpenCV入门教程之十五]水漫金山:OpenCV漫水填充算法(Floodfill) [OpenCV入门教程之十四]OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑 [Ope

Kinect2入门+opencv画骨架+骨架数据

////////////////////////////准备工作/////////////////////////////// 首先需要下载安装Kinect2的SDK,下载地址如下: https://www.microsoft.com/en-us/download/details.aspx?id=44561 建议安装时从官网下载,之前有出现过拷贝的文件无法正常安装的情况. //注意V2.0以下版本为一代Kinect所用,一代Kinect推荐V1.8 相对于一代的Kinect,二代由于SDK只出过

基于OpenCV立体视觉标定和校正

这几天学习双目视觉标定,分别使用了两种工具:OpenCV和Matlab.Matlab的效果非常稳定,但是一开始OpenCV的效果很糟糕,要不是出现中断就是标定出来的结果数值很大.经过了几天的不断调试和更改,终于把OpenCV的立体视觉标定和校正的程序写出来了.立体标定时计算空间上的两台摄像机几何关系的过程,立体校正则是对个体图像进行纠正,保证这些图像可以从平面对准的两幅图像获得.程序的框架如下: 1.读取左右相机图片序列 双目相机的图片序列放在Demon的路径下,左右相机的图像的名字分别存放在两