chun2495 发表于 2020-12-2 10:47:47

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



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

bailangcn 发表于 2020-12-2 10:55:01

openCV?



chun2495 发表于 2020-12-2 10:55:02



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

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

chun2495 发表于 2020-12-2 10:56:13

bailangcn 发表于 2020-12-2 10:55
openCV?

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

imliyucai 发表于 2020-12-2 11:05:03

我觉得就是应用平面几何的基本知识。先横向扫描,遇到 1-0 和 0-1 变化的像素就是边界,然后竖向扫描,同样由变化找到边界。

chun2495 发表于 2020-12-2 11:23:25

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

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

wye11083 发表于 2020-12-2 11:58:17

橙色区域是你拿到的处理好的图?那你直接比色差不得了。超声图是灰度的。对色差求边沿,然后滤一下就好了。

thxcai2 发表于 2020-12-2 12:04:56

边界线必定是连续的,先找到任意一个边界点,然后此边界点的8个相临点必定有0和1,以0为基点顺时针查找到1就是下一个边界点,依次循环到第一个点就找完了,如果某区域宽度只有一个像素要特别处理。

azeng 发表于 2020-12-2 12:23:08

二维FFT?

ysu_er 发表于 2020-12-2 12:35:19

图像识别就是干这个的

chun2495 发表于 2020-12-2 13:37:51

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

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

niaojingxin 发表于 2020-12-2 13:44:19

看你的描述,图像已经二值化好了。想快的话,找opencv的blob二值化后的源码,拷贝出来,直接能用了。想自己写个简单的话,既然已经是二值化点了,那有梯度的地方就是轮廓,求x,y方向的梯度,判断(dx+dy)>0,就是边缘点。

xstt 发表于 2020-12-2 14:24:49

应该不难。都这么好的参数了,直接写个边缘检测的算法就是了。

chun2495 发表于 2020-12-2 17:19:47

本帖最后由 chun2495 于 2020-12-2 17:32 编辑

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


代码也奉献给有需要的人
var points3 = ()
      var start_x = image_middle//初始点坐标x
      var start_y = start//初始点坐标y
      points3.append(CGPoint(x: start_x, y: start_y))//第一个初始点
      // 7 8 1
      // 6 0 2
      // 5 4 3
      repeat{
            start_y -= 1//1
            start_x += 1//1
            if(bladder == 0 && bladder == 1){
                points3.append(CGPoint(x: start_x, y: start_y))
            }
            else{
                start_y += 1//2
                if(bladder == 0 && bladder == 1){
                  points3.append(CGPoint(x: start_x, y: start_y))
                }
                else{
                  start_y += 1//3
                  if(bladder == 0 && bladder == 1){
                        points3.append(CGPoint(x: start_x, y: start_y))
                  }
                  else{
                        start_x -= 1//4
                        if(bladder == 0 && bladder == 1){
                            points3.append(CGPoint(x: start_x, y: start_y))
                        }
                        else{
                            start_x -= 1//5
                            if(bladder == 0 && bladder == 1){
                              points3.append(CGPoint(x: start_x, y: start_y))
                            }
                            else{
                              start_x -= 1//5
                              if(bladder == 0 && bladder == 1){
                                    points3.append(CGPoint(x: start_x, y: start_y))
                              }
                              else{
                                    start_y -= 1//6
                                    if(bladder == 0 && bladder == 1){
                                        points3.append(CGPoint(x: start_x, y: start_y))
                                    }
                                    else{
                                        start_y -= 1//7
                                        if(bladder == 0 && bladder == 1){
                                          points3.append(CGPoint(x: start_x, y: start_y))
                                        }
                                        else{
                                          start_x += 1//8
                                          if(bladder == 0 && bladder == 1){
                                                points3.append(CGPoint(x: start_x, y: start_y))
                                          }
                                          else{
                                                print("error!")
                                          }
                                        }
                                    }
                              }
                            }
                        }
                  }
                }
            }
      }while(start_x != image_middle || start_y != start)

redroof 发表于 2020-12-2 22:35:53

十层右括号,好吓人啊
这就看岀linux核心规定缩进必须是8个字符的好处了。。。

chun2495 发表于 2020-12-2 22:49:06

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

能帮我优化吗

xjavr 发表于 2020-12-4 09:18:37

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



你这个也不是c语言呀

我是一个大白菜 发表于 2020-12-4 09:35:13

xjavr 发表于 2020-12-4 09:18
你这个也不是c语言呀

这个是golang吧

chun2495 发表于 2020-12-4 09:42:01

我是一个大白菜 发表于 2020-12-4 09:35
这个是golang吧

swift。

我是一个大白菜 发表于 2020-12-4 10:23:37

chun2495 发表于 2020-12-4 09:42
swift。

好吧,我草率了{:sweat:}

heyueming0 发表于 2020-12-4 11:27:44

tips:百度下腐蚀和膨胀的原理,腐蚀图和膨胀图相减

nade 发表于 2020-12-4 13:13:01

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

思维敏捷啊,好方法

memstone 发表于 2020-12-4 19:05:54

chun2495 发表于 2020-12-2 22:49
能帮我优化吗

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

rube 发表于 2020-12-5 14:03:40

算法很重要

孤独飞行 发表于 2020-12-21 16:18:41

图像边界捕捉,标记

lyping1987 发表于 2020-12-21 17:36:04

求C的实现啊。最近一个需求是用opencv实现的

chun2495 发表于 2020-12-22 13:58:59

我那个稍微改下就是c了,思路都是一样的。
页: [1]
查看完整版本: 请教:如何通过c语言获取下面图像的边界