c#对bmp图片轮廓识别与轮廓坐标分类保存

aijun9801 2015-08-20 04:10:25
如题:c#对bmp图片轮廓识别与轮廓坐标分类保存

我已完成对bmp图像的灰度化、二值化及轮廓识别处理,因没学过c#以及图像处理也是初次接触,近来一直投入时间研究,也参阅过一些案列,限于c#基础,一个问题一直无法解决,故发帖请教,问题:不同的轮廓进行标示后,如何将这些不同标示的轮廓坐标点取出并送txt文件(标示及该标示下的所有轮廓坐标点)?谢谢!

...全文
836 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hewei512658301 2018-06-02
  • 打赏
  • 举报
回复
是可以把轮廓点重新按轮廓的走向重新排列的
qq_40317580 2018-03-26
  • 打赏
  • 举报
回复
请问您的问题解决了吗,能否发一份
qq_40317580 2018-03-26
  • 打赏
  • 举报
回复
您好,最近也在学习这个同样的内容,对一张图片中的矩形轮廓用矩形标示,想把每个矩形轮廓的位置信息提取出来
aijun9801 2015-08-24
  • 打赏
  • 举报
回复
[code=csharp] [ List<List<Point>> list = new List<List<Point>>(); List<Point> close = new List<Point>(); //处理过的点放入close集合,不再访问 int listCount = 0; Bitmap a = new Bitmap(pictureBox1.Image); int w = a.Width; int h = a.Height; bool[,] B = new bool[w, h]; //////定义结束 //////用true/false有无标示轨迹点,true:有轨迹点,flase:无轨迹点 for (int x = 0; x < w; x++ ) for (int y = 0; y < h; y++ ) { var color = a.GetPixel(x, y); if ((int)color.R == 0 && (int)color.G == 0 && (int)color.B == 0) { B[x, y] = true; } else B[x, y] = false; } ////下一功能 for (int x = 0; x < w; x++) { for (int y = 0; y < h; y++) //循环扫描每个点,发现一个点为true时,停止循环,并以该点为基地, { //广度优先搜索所有可以到达的点 if (B[x, y] && !close.Contains(new Point(x, y))) { listCount++; list.Add(new List<Point>()); List<Point> queue = new List<Point>(); queue.Add(new Point(x, y)); while (queue.Count != 0) { Point current = queue[0]; if (current == null) { break; } queue.RemoveAt(0); //可以到达的点 Point[] reach = new Point[8] { new Point(current.X - 1, current.Y - 1), new Point(current.X, current.Y - 1), new Point(current.X + 1, current.Y - 1), new Point(current.X - 1, current.Y), new Point(current.X + 1, current.Y), new Point(current.X - 1, current.Y + 1), new Point(current.X, current.Y + 1), new Point(current.X + 1, current.Y + 1) }; for (int k = 0; k < 8; k++) { if (reach[k].X >= 0 && reach[k].X < w && reach[k].Y >= 0 && reach[k].Y < h)//没有超出范围 { if (B[reach[k].X, reach[k].Y] && !close.Contains(new Point(reach[k].X, reach[k].Y))) { list[listCount].Add(new Point(reach[k].X, reach[k].Y)); queue.Add(new Point(reach[k].X, reach[k].Y)); close.Add(new Point(reach[k].X, reach[k].Y)); } } } } close.Add(new Point(x, y)); } } } ] 不关怎么调都无法求出轮廓的个数,及某一个轮廓的所有坐标,有时间的大侠请指导一下,谢谢(以前从没接触过C#编程,因一个项目自学了C#,c#的知识很不全面也不是很熟悉,这可能是一个比较简单的问题,但是就拦住我!)
卧_槽 2015-08-24
  • 打赏
  • 举报
回复
引用 3 楼 aijun9801 的回复:
现在能把所有轮廓的坐标求出并按我要的格式送到txt,但是还有两个问题:1不同轮廓的坐标如何分类保存?2同一轮廓的坐标如何按轨迹走向重新排序?请赐教,谢谢!
问题1不是问题,不同轮廓保存不同List就可以了。 问题2的问题在于,如何界定“轨迹走向”。从左至右?从上到下?顺时针?逆时针?你自己能不能确定轨迹走向,确定之后建立规则,然后按规则判断像素点相邻规则保存到List即可。 PS:问题2的处理方式会是一条不归路。
卧_槽 2015-08-24
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
[quote=引用 3 楼 aijun9801 的回复:] 现在能把所有轮廓的坐标求出并按我要的格式送到txt,但是还有两个问题:1不同轮廓的坐标如何分类保存?2同一轮廓的坐标如何按轨迹走向重新排序?请赐教,谢谢!
没法重新排序,光给出一大堆分散的点,鬼知道点与点之间到底应该是个什么关系 你需要在遍历图像查找轮廓的时候,就按相邻的顺序把点取出来,而不是过后才想起排序来 至于分类保存,你就得自己规定协议了,一个轮廓的一堆点之间,和另一个轮廓的一堆点直接,到底要加什么分隔符还是什么的 最好还是放弃txt,而把点放进dataset里,里面每个表是一个轮廓,每行是一个点 然后你把dataset序列化成二进制保存[/quote] 重新排列是可以的,也就是当前数据按照临近原则建立树形结构,当然这个算法要写死人,我已经死过一回了。
xuzuning 2015-08-23
  • 打赏
  • 举报
回复
for (int i = 0; i < list.Count - 1; i++) 应为 for (int i = 0; i < list.Count; i++) 否则如果只有一条通路的话,循环就进不去 同理,for (int kkk = 0; kkk < list[i].Count-1;kkk++) 应为 for (int kkk = 0; kkk < list[i].Count;kkk++ )
aijun9801 2015-08-22
  • 打赏
  • 举报
回复
//////连通域相关参数定义 List<List<Point>> list = new List<List<Point>>(); List<Point> close = new List<Point>(); //处理过的点放入close集合,不再访问 int listCount = 0; Bitmap a = new Bitmap(pictureBox1.Image); int w = a.Width; int h = a.Height; bool[,] B = new bool[w, h]; //////定义结束 //////用true/false有无标示轨迹点,true:有轨迹点,flase:无轨迹点 for (int x = 0; x < w; x++ ) for (int y = 0; y < h; y++ ) { var color = a.GetPixel(x, y); if ((int)color.R == 0 && (int)color.G == 0 && (int)color.B == 0) { B[x, y] = true; } else B[x, y] = false; } ////下一功能 for (int x = 0; x < w; x++) { for (int y = 0; y < h; y++) //循环扫描每个点,发现一个点为true时,停止循环,并以该点为基地, { //广度优先搜索所有可以到达的点 if (B[x, y] && !close.Contains(new Point(x, y))) { listCount++; list.Add(new List<Point>()); List<Point> queue = new List<Point>(); queue.Add(new Point(x, y)); while (queue.Count != 0) { Point current = queue[0]; if (current == null) { break; } queue.RemoveAt(0); //可以到达的点 Point[] reach = new Point[8] { new Point(current.X - 1, current.Y - 1), new Point(current.X, current.Y - 1), new Point(current.X + 1, current.Y - 1), new Point(current.X - 1, current.Y), new Point(current.X + 1, current.Y), new Point(current.X - 1, current.Y + 1), new Point(current.X, current.Y + 1), new Point(current.X + 1, current.Y + 1) }; for (int k = 0; k < 8; k++) { if (reach[k].X >= 0 && reach[k].X < w && reach[k].Y >= 0 && reach[k].Y < h)//没有超出范围 { if (B[reach[k].X, reach[k].Y] && !close.Contains(new Point(reach[k].X, reach[k].Y))) { list[listCount].Add(new Point(reach[k].X, reach[k].Y)); queue.Add(new Point(reach[k].X, reach[k].Y)); close.Add(new Point(reach[k].X, reach[k].Y)); } } } } close.Add(new Point(x, y)); } } }
aijun9801 2015-08-22
  • 打赏
  • 举报
回复
//////连通域相关参数定义 List<List<Point>> list = new List<List<Point>>(); List<Point> close = new List<Point>(); //处理过的点放入close集合,不再访问 int listCount = 0; Bitmap a = new Bitmap(pictureBox1.Image); int w = a.Width; int h = a.Height; bool[,] B = new bool[w, h]; //////定义结束 //////用true/false有无标示轨迹点,true:有轨迹点,flase:无轨迹点 for (int x = 0; x < w; x++ ) for (int y = 0; y < h; y++ ) { var color = a.GetPixel(x, y); if ((int)color.R == 0 && (int)color.G == 0 && (int)color.B == 0) { B[x, y] = true; } else B[x, y] = false; } ////下一功能 for (int x = 0; x < w; x++) { for (int y = 0; y < h; y++) //循环扫描每个点,发现一个点为true时,停止循环,并以该点为基地, { //广度优先搜索所有可以到达的点 if (B[x, y] && !close.Contains(new Point(x, y))) { listCount++; list.Add(new List<Point>()); List<Point> queue = new List<Point>(); queue.Add(new Point(x, y)); while (queue.Count != 0) { Point current = queue[0]; if (current == null) { break; } queue.RemoveAt(0); //可以到达的点 Point[] reach = new Point[8] { new Point(current.X - 1, current.Y - 1), new Point(current.X, current.Y - 1), new Point(current.X + 1, current.Y - 1), new Point(current.X - 1, current.Y), new Point(current.X + 1, current.Y), new Point(current.X - 1, current.Y + 1), new Point(current.X, current.Y + 1), new Point(current.X + 1, current.Y + 1) }; for (int k = 0; k < 8; k++) { if (reach[k].X >= 0 && reach[k].X < w && reach[k].Y >= 0 && reach[k].Y < h)//没有超出范围 { if (B[reach[k].X, reach[k].Y] && !close.Contains(new Point(reach[k].X, reach[k].Y))) { list[listCount].Add(new Point(reach[k].X, reach[k].Y)); queue.Add(new Point(reach[k].X, reach[k].Y)); close.Add(new Point(reach[k].X, reach[k].Y)); } } } } close.Add(new Point(x, y)); } } } 参考了别人的程序,但是读list的count总是等于0,感觉我读List<List<Point>>的方法有误 for (int i = 0; i < list.Count - 1; i++) { sw.WriteLine("var num pointxy{" + 2 * list[i].Count + "}:=[");//输出i 轮廓的点数 for (int kkk = 0; kkk < list[i].Count-1;kkk++ ) { sw.WriteLine(string.Format("{0}, {1},", list[i][kkk].X, list[i][kkk].Y));//输出i 轮廓下的所有坐标 } }
於黾 2015-08-21
  • 打赏
  • 举报
回复
引用 3 楼 aijun9801 的回复:
现在能把所有轮廓的坐标求出并按我要的格式送到txt,但是还有两个问题:1不同轮廓的坐标如何分类保存?2同一轮廓的坐标如何按轨迹走向重新排序?请赐教,谢谢!
没法重新排序,光给出一大堆分散的点,鬼知道点与点之间到底应该是个什么关系 你需要在遍历图像查找轮廓的时候,就按相邻的顺序把点取出来,而不是过后才想起排序来 至于分类保存,你就得自己规定协议了,一个轮廓的一堆点之间,和另一个轮廓的一堆点直接,到底要加什么分隔符还是什么的 最好还是放弃txt,而把点放进dataset里,里面每个表是一个轮廓,每行是一个点 然后你把dataset序列化成二进制保存
aijun9801 2015-08-21
  • 打赏
  • 举报
回复
现在能把所有轮廓的坐标求出并按我要的格式送到txt,但是还有两个问题:1不同轮廓的坐标如何分类保存?2同一轮廓的坐标如何按轨迹走向重新排序?请赐教,谢谢!
aijun9801 2015-08-20
  • 打赏
  • 举报
回复
谢谢!简单的写入txt我没有问题,我的问题纠结在是如何把不同的轮廓轨迹进行标示,并把表示下对应的坐标按序分别提出来,我用到了LIst<List<Point>>,就是不清楚如何读取标示及标示下的坐标值到txt。
风吹腚腚凉 2015-08-20
  • 打赏
  • 举报
回复
引用 楼主 aijun9801 的回复:
如题:c#对bmp图片轮廓识别与轮廓坐标分类保存 我已完成对bmp图像的灰度化、二值化及轮廓识别处理,因没学过c#以及图像处理也是初次接触,近来一直投入时间研究,也参阅过一些案列,限于c#基础,一个问题一直无法解决,故发帖请教,问题:不同的轮廓进行标示后,如何将这些不同标示的轮廓坐标点取出并送txt文件(标示及该标示下的所有轮廓坐标点)?谢谢!
百度 C#写入txt文件。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧