python计算不规则图形面积算法

您所在的位置:网站首页 曲线不规则图形的面积怎么算 python计算不规则图形面积算法

python计算不规则图形面积算法

2024-07-17 05:38| 来源: 网络整理| 查看: 265

介绍:大三上做一个医学影像识别的项目,医生在原图上用红笔标记病灶点,通过记录红色的坐标位置可以得到病灶点的外接矩形,但是后续会涉及到红圈内的面积在外接矩形下的占比问题,有些外接矩形内有多个红色标记,在使用网上的opencv的fillPoly填充效果非常不理想,还有类似python计算任意多边形方法也不理想的情况下,自己探索出的一种效果还不错的计算多圈及不规则图形的面积的算法。

医生提供的病灶标记图和原图,大部分长这样

 

 

 

 

但也有一些多圈情况

 

 

 

 

 很明显,这些图片都是非常需要计算面积占比的,对样本需要筛选

通过百度,用opencv的填充来计算面积,一部分效果很差,单圈画不全,多圈都是错(用将面积计算结果上色,方便观察)

 

 

 

 

 

通过此算法之后,无论单圈,多圈,面积计算准确度提高许多

 

 

 

 

 能较为准确的计算出不规则图形的面积

正文:算法的思想很简单,遍历图片每一列,通过色差判断是否遇到标记圈,将坐标全部记录,对每一列的坐标都进行最小行和最大行记录,确定每一列的最小和最大的坐标,然后上色(类似opencv的fillPoly的实现,但是细节有些区别),只是这样效果并不好,将图片旋转90度,再做一边,将两个图片的结果放在一起做与操作,得到结果就能很好的处理多圈的标记问题和多算面积的问题(比如上面的08-LM),

 

 算法实现

全程只用pillow库

首先先用屏幕拾色器获取目标颜色的rgb值,我这种情况下就是(237,28,36),前期截取外接矩形也是要这一步的,颜色也一致

1 def pixel_wanted(pix): 2 return pix==(237,28, 36)

每一列都设定翻转位初始为False,如果上一个像素点不是目标色,当前是目标色则开始记录,一旦不是目标色,停止检测

top_Pixel都设定为黑色(0,0,0)因为有图片最上方就是目标色,导致判定出问题,直接让最上面的像素初始化是黑色

coordinate_List记录了所有符合的点坐标

1 coordinate_List = [] 2 top_Pixel = (0,0,0) 3 for x in range(im.size[0]): 4 flag = False #初始化每一列翻转位为False 5 for y in range(im.size[1]): 6 current_pixel = im.getpixel((x,y)) 7 last_pixel = im.getpixel((x,y-1)) if y>0 else top_Pixel 8 #翻转判定 9 if pixel_wanted(current_pixel) and \ 10 not pixel_wanted(last_pixel): 11 flag = True 12 if flag and not pixel_wanted(current_pixel): 13 flag = False 14 if(flag): 15 coordinate_List.append((x,y))

coordinate_List中的点如下图

 

 然后就是将上面获得coordinate列表进行处理

将coordinate列表中每一列的最小坐标和最大坐标进行记录

因为每一列记录的数量并不确定(应该可以在上一步改进一下),所以需要遍历多次

首先找到第一个列出现的坐标,将它的行信息记录(行信息最小确定),

然后遍历出全部的同列的坐标,比较行坐标,如果大的就将最大的代替(行信息最大确定),用一个新的列表记录数据

1 coordinate_Min_Max_List = [] 2 #找最小最大 3 for i in range(im.size[0]): 4 min=-1 5 max=-1 6 for coordinate in coordinate_List: 7 if coordinate[0] == i: 8 min = coordinate[1] 9 max = coordinate[1] 10 break 11 for coordinate in coordinate_List: 12 if coordinate[0] == i: 13 if coordinate[1]>max: 14 max = coordinate[1] 15 coordinate_Min_Max_List.append(min) 16 coordinate_Min_Max_List.append(max)

其中要将min和max都初始化为一个坐标不存在的值比如-1,为了在下一步多圈且有空隙情况下,不会出现残影现象,如下图

 

 

 

上一步的最后得到一个列表,第n列的最小行和最大行分别是第2n和2n+1元素,结果中的-1,为了让下一步不会画进去

 

然后就是绘制图片了,每一列将列表中对应的最小行到最大行涂满

1 #上色 2 for x in range(im.size[0]): 3 for y in range(im.size[1]): 4 min = coordinate_Min_Max_List[x*2] 5 max = coordinate_Min_Max_List[x*2+1] 6 if minmax: 36 max = coordinate[1] 37 coordinate_Min_Max_List.append(min) 38 coordinate_Min_Max_List.append(max) 39 #上色 40 for x in range(im.size[0]): 41 for y in range(im.size[1]): 42 min = coordinate_Min_Max_List[x*2] 43 max = coordinate_Min_Max_List[x*2+1] 44 if min


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3