封闭图形的边界

northwolves 2009-05-10 10:59:18
已知白色背景图片控件上某点坐标,如何取得包围该点的最小不规则图形边界全部点(假设存在,边界黑色)的坐标?
...全文
386 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
coxfilur_2008 2009-05-13
  • 打赏
  • 举报
回复
mark
绿色夹克衫 2009-05-12
  • 打赏
  • 举报
回复
northwolves 给的图似乎并不大呀,直接用bfs填色来做,效率也在可接受的范围之内,
比如可以先用bfs的方法给湖北填色,然后对填色后的点进行扩选(选中所有点周围的8个点),
然后用扩选后的点集减去扩选前的点集,就是轮廓了!

方法比较土,不过编程思路简单
test4ever 2009-05-12
  • 打赏
  • 举报
回复
LZ的意思应该是图像识别的问题吧
边缘检测不懂,看了下canny算法,感觉不错

不过看到另一个帖子中谈到预先确认所有多边形边界数据,
然后在确定点与多边形的关系,
而这个是图形学问题,点与多边形位置关系用 射线法 可以很好的判断
绿色夹克衫 2009-05-12
  • 打赏
  • 举报
回复
做了一个简单的,用的是dfs,效率很低,而且有时候会因为递归的过深,产生溢出,什么优化也没做,不过基本上就是这么个意思!
当作娱乐玩好了


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace picbsftest
{
public partial class Form1 : Form
{
private Bitmap bmpBack;
private bool[,] matrix;

public Form1()
{
InitializeComponent();
bmpBack = new Bitmap(pictureBox1.Image);
}

private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
Bitmap bmpnew = new Bitmap(bmpBack);
matrix = new bool[bmpBack.Width, bmpBack.Height];
dfs(e.X, e.Y, bmpnew, 0);

for (int i = 1; i < matrix.GetLength(0) - 1; i++)
{
for (int j = 1; j < matrix.GetLength(1) - 1; j++)
{
if (matrix[i, j])
{
if (!matrix[i - 1, j])
bmpnew.SetPixel(i - 1, j, Color.Red);
if (!matrix[i + 1, j])
bmpnew.SetPixel(i + 1, j, Color.Red);
if (!matrix[i, j - 1])
bmpnew.SetPixel(i, j - 1, Color.Red);
if (!matrix[i, j + 1])
bmpnew.SetPixel(i, j + 1, Color.Red);
}
}
}

pictureBox1.Image = bmpnew;
}

private void dfs(int x, int y, Bitmap bmp, int level)
{
if (x < 0 || y < 0 || x >= bmp.Width || y >= bmp.Height)
return;

if (matrix[x, y])
return;

if (bmp.GetPixel(x, y).ToArgb() == -16777216)
return;

matrix[x, y] = true;

dfs(x - 1, y, bmp, level + 1);
dfs(x + 1, y, bmp, level + 1);
dfs(x, y - 1, bmp, level + 1);
dfs(x, y + 1, bmp, level + 1);
}
}
}
lllanm 2009-05-12
  • 打赏
  • 举报
回复
收藏一下, CANNY算法应该很有趣
绿色夹克衫 2009-05-12
  • 打赏
  • 举报
回复
明天有空试试,这类工程性的问题应该比较有意思!
绿色夹克衫 2009-05-11
  • 打赏
  • 举报
回复
用bfs填色虽然可以解决这类问题,然而效率却不算高,我觉得可以试试先找到同纬度或同经度的一个黑点,
然后判断该点是否位于一个闭合图形上(也是bfs或dfs那套),如果存在不闭合的情况,则继续找下一个黑点.
说的比较简单,不过想的不是很细致,可能还存在什么问题。

初始黑点的选择,可以先选择点集里经纬度位于四个方向最大值的点,然后再找到这4个点对应方向以外的黑点

[Quote=引用 3 楼 northwolves 的回复:]
包括凹多边形.
比如在中国地图,现在知道武汉的位置,如何高效求出湖北省的边界?(很明显整个中国不是最小封闭图形),给湖北涂色我是会的
[/Quote]
northwolves 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 litaoye 的回复:]
应该包括凹多边形吧? 最小指面积最小?
不知道northwolves同志这次说的是个数学问题,还是个canny算法的问题?
[/Quote]

非常感谢,就是这个canny算法,不过我的要求似乎更低些,先翻翻看
northwolves 2009-05-11
  • 打赏
  • 举报
回复
很显然边界的每一个x可能对应多个y(经度相同),每一个y也可能对应多个x(纬度相同)
northwolves 2009-05-11
  • 打赏
  • 举报
回复
包括凹多边形.
比如在中国地图,现在知道武汉的位置,如何高效求出湖北省的边界?(很明显整个中国不是最小封闭图形),给湖北涂色我是会的
sunzerui 2009-05-11
  • 打赏
  • 举报
回复
不明白,顶一下!
继续关注!
northwolves 2009-05-11
  • 打赏
  • 举报
回复
这里我只能发100分的帖子,发一个300分的:

http://topic.csdn.net/u/20090511/17/535ba985-8eb3-4d07-8010-a22cec06627c.html
northwolves 2009-05-11
  • 打赏
  • 举报
回复
针对我的例子应该如何处理?
绿色夹克衫 2009-05-10
  • 打赏
  • 举报
回复
应该包括凹多边形吧? 最小指面积最小?
不知道northwolves同志这次说的是个数学问题,还是个canny算法的问题?
liao05050075 2009-05-10
  • 打赏
  • 举报
回复
从这一点出发,做一个DFS或者BFS,直到遇到黑色点就返回,
这样可以找到所有的黑色边界。
时间效率的话,如果你那个封闭图形上象素点个数为N,那就是O(N)的

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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