搜索
bottom↓
回复: 26

请教:如何通过c语言获取下面图像的边界

[复制链接]
(20516963)

出5入84汤圆

发表于 2020-12-2 10:47:47 | 显示全部楼层 |阅读模式


已知了图像区域点,如何只把边界勾勒出来?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(20516529)

出0入0汤圆

发表于 2020-12-2 10:55:01 | 显示全部楼层
openCV?



(20516528)

出5入84汤圆

 楼主| 发表于 2020-12-2 10:55:02 | 显示全部楼层


我想到的是从中心点向四周以一定的增长角度(30度)发出射线,遇到的第一个点就记录为边界点。然后把这些边界点连接就是边界了。
请问这种该怎么利用三角函数来编程呢?

已知中心点坐标,已知橙色区域数据点坐标。橙色标记为1,其他都是0,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(20516457)

出5入84汤圆

 楼主| 发表于 2020-12-2 10:56:13 | 显示全部楼层

做ios上编程,就当是c语言裸机吧,不带图像处理api。
(20515927)

出0入0汤圆

发表于 2020-12-2 11:05:03 | 显示全部楼层
我觉得就是应用平面几何的基本知识。  先横向扫描,遇到 1-0 和 0-1 变化的像素就是边界,然后竖向扫描,同样由变化找到边界。
(20514825)

出5入84汤圆

 楼主| 发表于 2020-12-2 11:23:25 | 显示全部楼层
imliyucai 发表于 2020-12-2 11:05
我觉得就是应用平面几何的基本知识。  先横向扫描,遇到 1-0 和 0-1 变化的像素就是边界,然后竖向扫描,同 ...

这样找到的点很多都是散乱的对不规则图像更是要判断好几次,效果不太理想。
(20512733)

出0入20汤圆

发表于 2020-12-2 11:58:17 来自手机 | 显示全部楼层
橙色区域是你拿到的处理好的图?那你直接比色差不得了。超声图是灰度的。对色差求边沿,然后滤一下就好了。
(20512334)

出0入4汤圆

发表于 2020-12-2 12:04:56 | 显示全部楼层
边界线必定是连续的,先找到任意一个边界点,然后此边界点的8个相临点必定有0和1,以0为基点顺时针查找到1就是下一个边界点,依次循环到第一个点就找完了,如果某区域宽度只有一个像素要特别处理。
(20511242)

出0入0汤圆

发表于 2020-12-2 12:23:08 | 显示全部楼层
二维FFT?
(20510511)

出0入0汤圆

发表于 2020-12-2 12:35:19 | 显示全部楼层
图像识别就是干这个的
(20506759)

出5入84汤圆

 楼主| 发表于 2020-12-2 13:37:51 | 显示全部楼层
thxcai2 发表于 2020-12-2 12:04
边界线必定是连续的,先找到任意一个边界点,然后此边界点的8个相临点必定有0和1,以0为基点顺时针查找到1 ...

这个方法非常好。我现在就去试试,回头贴上代码和图片验证。感谢大神!
(20506371)

出0入0汤圆

发表于 2020-12-2 13:44:19 | 显示全部楼层
看你的描述,图像已经二值化好了。想快的话,找opencv的blob二值化后的源码,拷贝出来,直接能用了。想自己写个简单的话,既然已经是二值化点了,那有梯度的地方就是轮廓,求x,y方向的梯度,判断(dx+dy)>0,就是边缘点。
(20503941)

出0入8汤圆

发表于 2020-12-2 14:24:49 | 显示全部楼层
应该不难。都这么好的参数了,直接写个边缘检测的算法就是了。
(20493443)

出5入84汤圆

 楼主| 发表于 2020-12-2 17:19:47 | 显示全部楼层
本帖最后由 chun2495 于 2020-12-2 17:32 编辑

经过8楼大神“thxcai2”的指点,图像边界已经出来了,效果非常好,也感谢其他坛友的帮忙。
效果图如下:


代码也奉献给有需要的人
  1. var points3 = [CGPoint]()
  2.         var start_x = image_middle//初始点坐标x
  3.         var start_y = start//初始点坐标y
  4.         points3.append(CGPoint(x: start_x, y: start_y))//第一个初始点
  5.         // 7 8 1
  6.         // 6 0 2
  7.         // 5 4 3
  8.         repeat{
  9.             start_y -= 1//1
  10.             start_x += 1//1
  11.             if(bladder[image_wide*start_y + (start_x - 1)] == 0 && bladder[image_wide*start_y + start_x] == 1){
  12.                 points3.append(CGPoint(x: start_x, y: start_y))
  13.             }
  14.             else{
  15.                 start_y += 1//2
  16.                 if(bladder[image_wide*(start_y - 1) + start_x] == 0 && bladder[image_wide*start_y + start_x] == 1){
  17.                     points3.append(CGPoint(x: start_x, y: start_y))
  18.                 }
  19.                 else{
  20.                     start_y += 1//3
  21.                     if(bladder[image_wide*(start_y - 1) + start_x] == 0 && bladder[image_wide*start_y + start_x] == 1){
  22.                         points3.append(CGPoint(x: start_x, y: start_y))
  23.                     }
  24.                     else{
  25.                         start_x -= 1//4
  26.                         if(bladder[image_wide*start_y + (start_x + 1)] == 0 && bladder[image_wide*start_y + start_x] == 1){
  27.                             points3.append(CGPoint(x: start_x, y: start_y))
  28.                         }
  29.                         else{
  30.                             start_x -= 1//5
  31.                             if(bladder[image_wide*start_y + (start_x + 1)] == 0 && bladder[image_wide*start_y + start_x] == 1){
  32.                                 points3.append(CGPoint(x: start_x, y: start_y))
  33.                             }
  34.                             else{
  35.                                 start_x -= 1//5
  36.                                 if(bladder[image_wide*start_y + (start_x + 1)] == 0 && bladder[image_wide*start_y + start_x] == 1){
  37.                                     points3.append(CGPoint(x: start_x, y: start_y))
  38.                                 }
  39.                                 else{
  40.                                     start_y -= 1//6
  41.                                     if(bladder[image_wide*(start_y + 1) + start_x] == 0 && bladder[image_wide*start_y + start_x] == 1){
  42.                                         points3.append(CGPoint(x: start_x, y: start_y))
  43.                                     }
  44.                                     else{
  45.                                         start_y -= 1//7
  46.                                         if(bladder[image_wide*(start_y + 1) + start_x] == 0 && bladder[image_wide*start_y + start_x] == 1){
  47.                                             points3.append(CGPoint(x: start_x, y: start_y))
  48.                                         }
  49.                                         else{
  50.                                             start_x += 1//8
  51.                                             if(bladder[image_wide*start_y + (start_x - 1)] == 0 && bladder[image_wide*start_y + start_x] == 1){
  52.                                                 points3.append(CGPoint(x: start_x, y: start_y))
  53.                                             }
  54.                                             else{
  55.                                                 print("error!")
  56.                                             }
  57.                                         }
  58.                                     }
  59.                                 }
  60.                             }
  61.                         }
  62.                     }
  63.                 }
  64.             }
  65.         }while(start_x != image_middle || start_y != start)
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(20474477)

出0入21汤圆

发表于 2020-12-2 22:35:53 来自手机 | 显示全部楼层
十层右括号,好吓人啊
这就看岀linux核心规定缩进必须是8个字符的好处了。。。
(20473684)

出5入84汤圆

 楼主| 发表于 2020-12-2 22:49:06 | 显示全部楼层
redroof 发表于 2020-12-2 22:35
十层右括号,好吓人啊
这就看岀linux核心规定缩进必须是8个字符的好处了。。。 ...

能帮我优化吗
(20349513)

出0入0汤圆

发表于 2020-12-4 09:18:37 | 显示全部楼层
chun2495 发表于 2020-12-2 17:19
经过8楼大神“thxcai2”的指点,图像边界已经出来了,效果非常好,也感谢其他坛友的帮忙。
效果图如下:

你这个也不是c语言呀
(20348517)

出0入0汤圆

发表于 2020-12-4 09:35:13 | 显示全部楼层
xjavr 发表于 2020-12-4 09:18
你这个也不是c语言呀

这个是golang吧
(20348109)

出5入84汤圆

 楼主| 发表于 2020-12-4 09:42:01 | 显示全部楼层

  swift。
(20345613)

出0入0汤圆

发表于 2020-12-4 10:23:37 | 显示全部楼层

好吧,我草率了
(20341766)

出0入0汤圆

发表于 2020-12-4 11:27:44 | 显示全部楼层
tips:百度下腐蚀和膨胀的原理,腐蚀图和膨胀图相减
(20335449)

出0入0汤圆

发表于 2020-12-4 13:13:01 | 显示全部楼层
thxcai2 发表于 2020-12-2 12:04
边界线必定是连续的,先找到任意一个边界点,然后此边界点的8个相临点必定有0和1,以0为基点顺时针查找到1 ...

思维敏捷啊,好方法
(20314276)

出100入0汤圆

发表于 2020-12-4 19:05:54 | 显示全部楼层

弄个子函数,符合就返回,不然继续,这样就不用这么嵌套了。
(20246010)

出0入0汤圆

发表于 2020-12-5 14:03:40 | 显示全部楼层
算法很重要
(18855509)

出0入0汤圆

发表于 2020-12-21 16:18:41 | 显示全部楼层
图像边界捕捉,标记
(18850866)

出135入180汤圆

发表于 2020-12-21 17:36:04 | 显示全部楼层
求C的实现啊。最近一个需求是用opencv实现的
(18777491)

出5入84汤圆

 楼主| 发表于 2020-12-22 13:58:59 | 显示全部楼层
我那个稍微改下就是c了,思路都是一样的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2021-7-27 21:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表