请教:如何通过c语言获取下面图像的边界
已知了图像区域点,如何只把边界勾勒出来?
openCV?
我想到的是从中心点向四周以一定的增长角度(30度)发出射线,遇到的第一个点就记录为边界点。然后把这些边界点连接就是边界了。
请问这种该怎么利用三角函数来编程呢?
已知中心点坐标,已知橙色区域数据点坐标。橙色标记为1,其他都是0, bailangcn 发表于 2020-12-2 10:55
openCV?
做ios上编程,就当是c语言裸机吧,不带图像处理api。 我觉得就是应用平面几何的基本知识。先横向扫描,遇到 1-0 和 0-1 变化的像素就是边界,然后竖向扫描,同样由变化找到边界。 imliyucai 发表于 2020-12-2 11:05
我觉得就是应用平面几何的基本知识。先横向扫描,遇到 1-0 和 0-1 变化的像素就是边界,然后竖向扫描,同 ...
这样找到的点很多都是散乱的对不规则图像更是要判断好几次,效果不太理想。 橙色区域是你拿到的处理好的图?那你直接比色差不得了。超声图是灰度的。对色差求边沿,然后滤一下就好了。 边界线必定是连续的,先找到任意一个边界点,然后此边界点的8个相临点必定有0和1,以0为基点顺时针查找到1就是下一个边界点,依次循环到第一个点就找完了,如果某区域宽度只有一个像素要特别处理。 二维FFT? 图像识别就是干这个的 thxcai2 发表于 2020-12-2 12:04
边界线必定是连续的,先找到任意一个边界点,然后此边界点的8个相临点必定有0和1,以0为基点顺时针查找到1 ...
这个方法非常好。我现在就去试试,回头贴上代码和图片验证。感谢大神! 看你的描述,图像已经二值化好了。想快的话,找opencv的blob二值化后的源码,拷贝出来,直接能用了。想自己写个简单的话,既然已经是二值化点了,那有梯度的地方就是轮廓,求x,y方向的梯度,判断(dx+dy)>0,就是边缘点。 应该不难。都这么好的参数了,直接写个边缘检测的算法就是了。 本帖最后由 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) 十层右括号,好吓人啊
这就看岀linux核心规定缩进必须是8个字符的好处了。。。 redroof 发表于 2020-12-2 22:35
十层右括号,好吓人啊
这就看岀linux核心规定缩进必须是8个字符的好处了。。。 ...
能帮我优化吗 chun2495 发表于 2020-12-2 17:19
经过8楼大神“thxcai2”的指点,图像边界已经出来了,效果非常好,也感谢其他坛友的帮忙。
效果图如下:
你这个也不是c语言呀 xjavr 发表于 2020-12-4 09:18
你这个也不是c语言呀
这个是golang吧 我是一个大白菜 发表于 2020-12-4 09:35
这个是golang吧
swift。 chun2495 发表于 2020-12-4 09:42
swift。
好吧,我草率了{:sweat:} tips:百度下腐蚀和膨胀的原理,腐蚀图和膨胀图相减 thxcai2 发表于 2020-12-2 12:04
边界线必定是连续的,先找到任意一个边界点,然后此边界点的8个相临点必定有0和1,以0为基点顺时针查找到1 ...
思维敏捷啊,好方法 chun2495 发表于 2020-12-2 22:49
能帮我优化吗
弄个子函数,符合就返回,不然继续,这样就不用这么嵌套了。 算法很重要 图像边界捕捉,标记 求C的实现啊。最近一个需求是用opencv实现的
我那个稍微改下就是c了,思路都是一样的。
页:
[1]