如何寻轮廓的凹点

netdata 2008-05-27 08:01:02
在二值图象中

封闭图形寻找其凹点,如何实现....


类似如图


........... .
' . . .
. . .
. .
. .
. . .
. . . .
...... ......
...全文
786 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiansen 2008-07-29
  • 打赏
  • 举报
回复
对轮廓的每个点求二阶导数,符号变化的地方就是凹凸变化的地方
dx=x2-x1 dy=y2-y1
d2x=dx2-dx1 d2y=dy2-dy1
曲率公式代进去就可以了
sunrisemaple 2008-05-30
  • 打赏
  • 举报
回复
如果你的图形向你绘制的那么规则的话,是不是可以这样找:
1.找到图形的中点。
2.找到一些离中点距离比较近的点作为候选点(凹点因为是乡里面凹的,所以离中心近)
3.统计这些候选点附近局部轮廓的方向变化,变化比较剧烈的就是凹点了。
devang 2008-05-28
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080525/11/c3c4fb4a-0077-4d5f-9c66-d58659d5ddbd.html?seed=2125791699
netdata 2008-05-28
  • 打赏
  • 举报
回复
封闭图形的轮廓已经提取,问题在于如何找到凹点。。。。

楼上两位非常感谢分析
sblt_001 2008-05-28
  • 打赏
  • 举报
回复
不懂这是写什么啊
devang 2008-05-27
  • 打赏
  • 举报
回复
晕,,越说越糊涂,,vburf == rbuf
devang 2008-05-27
  • 打赏
  • 举报
回复
不对,还得先进行边缘检测(ROBERT算子),,边缘检测是根据二值数据做的,,

上面的vburf存储边缘检测后的数据 下面的tbuf是二值化数据 ,,rbuf是存储边缘检测后的数据...



int i,j;
UCHAR *c1,*c2,v;
c1 = NULL;

unsigned char pixel[4];

for(i=1;i<image_hei-1;i++)
for(j=1;j<image_wid-1;j++)
{
pixel[0] = (unsigned char)(*(tbuf+i*image_wid+j));
pixel[1] = (unsigned char)(*(tbuf+(i+1)*image_wid+j));
pixel[2] = (unsigned char)(*(tbuf+i*image_wid+j+1));
pixel[3] = (unsigned char)(*(tbuf+(i+1)*image_wid+j+1));

c2=(UCHAR *)(rbuf+i*image_wid+j);

v = (unsigned char)(sqrt(( pixel[0] - pixel[3] )*( pixel[0] - pixel[3] ) + \
( pixel[1] - pixel[2] )*( pixel[1] - pixel[2] )));

c2[0]=v; c2[1]=v; c2[2]=v; c2[3]=255;
}
devang 2008-05-27
  • 打赏
  • 举报
回复
没看清楚,,,给你贴个轮廓提取的代码,,是在二值化的结果上做的

vburf存储二值化数据
kburf存储提取轮廓后的数据




int i,j;
UCHAR *c1,*c2;
unsigned char n,e,s,w,ne,se,nw,sw;
unsigned char pixel;

for(i=1;i<image_hei-1;i++)
for(j=1;j<image_wid-1;j++)
{
c1=(UCHAR *)(vbuf+i*image_wid+j);
c2=(UCHAR *)(kbuf+i*image_wid+j);

pixel = *c1;

if(pixel == 0)
{
//*c2 = (unsigned char)0;
c2[0]=0; c2[1]=0; c2[2]=0; c2[3]=255;

nw = (unsigned char)*(c1 + (sizeof(UINT))*(image_wid-1));
n = (unsigned char)*(c1 + (sizeof(UINT))*image_wid );
ne = (unsigned char)*(c1 + (sizeof(UINT))*(image_wid +1));
w = (unsigned char)*(c1 - (sizeof(UINT))*1);
e = (unsigned char)*(c1 + (sizeof(UINT))*1);
sw = (unsigned char)*(c1 - (sizeof(UINT))*(image_wid -1));
s = (unsigned char)*(c1 - (sizeof(UINT))*image_wid );
se = (unsigned char)*(c1 - (sizeof(UINT))*(image_wid +1));
//如果相邻的八个点都是黑点
if ((nw==n) && (n==ne) && (ne==w) && (w==e) && (e==sw) & (sw==s) && (s==se) && (se==nw))
{
//*c2 = (unsigned char)255;
c2[0]=255; c2[1]=255; c2[2]=255; c2[3]=255;
}
}
else
{
c2[0]=255; c2[1]=255; c2[2]=255; c2[3]=255;
}
}
devang 2008-05-27
  • 打赏
  • 举报
回复
找一个最小凸包的源代码,,以前做过但没做出来,,呵呵
用户 昵称 2008-05-27
  • 打赏
  • 举报
回复
[code=BatchFile] ........... .
' . . .
. . .
. .
. .
. . .
. . . .
..... ...... [/code]
netdata 2008-05-27
  • 打赏
  • 举报
回复
两个角角的点
netdata 2008-05-27
  • 打赏
  • 举报
回复
........... .
' . . .
. . .
. .
. .
. . .
. . . .
..... ......

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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