搜索
bottom↓
回复: 26

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

[复制链接]

出25入84汤圆

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


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

本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

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



出25入84汤圆

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


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

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

本帖子中包含更多资源

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

x

出25入84汤圆

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

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

出0入0汤圆

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

出25入84汤圆

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

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

出0入442汤圆

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

出0入4汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出25入84汤圆

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

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

出0入0汤圆

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

出0入16汤圆

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

出25入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

出300入477汤圆

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

出25入84汤圆

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

能帮我优化吗

出0入0汤圆

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

你这个也不是c语言呀

出0入42汤圆

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

这个是golang吧

出25入84汤圆

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

  swift。

出0入42汤圆

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

好吧,我草率了

出0入0汤圆

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

出0入0汤圆

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

思维敏捷啊,好方法

出110入93汤圆

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

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

出0入8汤圆

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

出0入0汤圆

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

出235入235汤圆

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

出25入84汤圆

 楼主| 发表于 2020-12-22 13:58:59 | 显示全部楼层
我那个稍微改下就是c了,思路都是一样的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 22:05

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

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