网络编程
位置:首页>> 网络编程>> Python编程>> Python计算不规则图形面积算法实现解析

Python计算不规则图形面积算法实现解析

作者:PowerZZJ  发布时间:2022-03-14 21:04:17 

标签:python,计算,不规则,图形,面积,算法

这篇文章主要介绍了Python计算不规则图形面积算法实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

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

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

Python计算不规则图形面积算法实现解析

算法实现

全程只用pillow库

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


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

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

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

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


coordinate_List = []
top_Pixel = (0,0,0)
for x in range(im.size[0]):
 flag = False #初始化每一列翻转位为False
 for y in range(im.size[1]):
   current_pixel = im.getpixel((x,y))
   last_pixel = im.getpixel((x,y-1)) if y>0 else top_Pixel
   #翻转判定
   if pixel_wanted(current_pixel) and \
       not pixel_wanted(last_pixel):
     flag = True
   if flag and not pixel_wanted(current_pixel):
     flag = False
   if(flag):
     coordinate_List.append((x,y))

coordinate_List中的点如下图

Python计算不规则图形面积算法实现解析

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

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

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

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

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


coordinate_Min_Max_List = []
#找最小最大
for i in range(im.size[0]):
 min=-1
 max=-1
 for coordinate in coordinate_List:
   if coordinate[0] == i:
     min = coordinate[1]
     max = coordinate[1]
     break
 for coordinate in coordinate_List:
   if coordinate[0] == i:
     if coordinate[1]>max:
       max = coordinate[1]
 coordinate_Min_Max_List.append(min)
 coordinate_Min_Max_List.append(max)

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

Python计算不规则图形面积算法实现解析Python计算不规则图形面积算法实现解析

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

Python计算不规则图形面积算法实现解析

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


#上色
for x in range(im.size[0]):
 for y in range(im.size[1]):
   min = coordinate_Min_Max_List[x*2]
   max = coordinate_Min_Max_List[x*2+1]
   if min<y<max:
     im.putpixel((x,y),(0,255,0))
   else:
     #可以把非红圈的上掩膜遮住
     pass

至此,就是类似opencv的算法实现,虽然还差翻转做与操作,但是已经比opencv生成的效果好,写成函数后续调用,

然后就是简单的翻转90度,再调用一次这个函数再做一遍


def Cal_S(im):
 im_0 = im.rotate(0)
 im_90 = im.rotate(90, expand=True)

im_0 = fillPoly(im_0)
 im_90 = fillPoly(im_90)
 im_90 = im_90.rotate(-90, expand=True)

i=0
 for x in range(im.size[0]):
   for y in range(im.size[1]):
     if(im_0.getpixel((x,y))==(0,255,0) and
     im_90.getpixel((x,y))==(0,255,0)):
       im.putpixel((x,y),(0,255,0))
       i+=1
 return i/(im.size[0]*im.size[1])

做两遍的效果图

Python计算不规则图形面积算法实现解析Python计算不规则图形面积算法实现解析

可以看到效果非常不错,但是依旧有个别图像有问题,比如十字分布的,

但现在的话误差已经降低非常多了,这些极其个别的十字现象可以手动把原图切割一下,或者干脆不处理了

Python计算不规则图形面积算法实现解析

所有代码,画出绿图片为了方便直观的查看,函数中可以把图片顺便保存一下,总体看一下效果


from PIL import Image

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

def fillPoly(im):
 coordinate_List = []

top_Pixel = (0,0,0)
 for x in range(im.size[0]):
   flag = False #初始化每一列翻转位为False
   for y in range(im.size[1]):
     current_pixel = im.getpixel((x,y))
     last_pixel = im.getpixel((x,y-1)) if y>0 else top_Pixel
     #翻转判定
     if pixel_wanted(current_pixel) and \
         not pixel_wanted(last_pixel):
       flag = True
     if flag and not pixel_wanted(current_pixel):
       flag = False
     if(flag):
       coordinate_List.append((x,y))
 coordinate_Min_Max_List = []
 #找最小最大
 for i in range(im.size[0]):
   min=-1
   max=-1
   for coordinate in coordinate_List:
     if coordinate[0] == i:
       min = coordinate[1]
       max = coordinate[1]
       break
   for coordinate in coordinate_List:
     if coordinate[0] == i:
       if coordinate[1]>max:
         max = coordinate[1]
   coordinate_Min_Max_List.append(min)
   coordinate_Min_Max_List.append(max)
 #上色
 for x in range(im.size[0]):
   for y in range(im.size[1]):
     min = coordinate_Min_Max_List[x*2]
     max = coordinate_Min_Max_List[x*2+1]
     if min<y<max:
       im.putpixel((x,y),(0,255,0))
     else:
       #可以把非红圈的上掩膜遮住
       pass
 return im

def Cal_S(im):
 im_0 = im.rotate(0)
 im_90 = im.rotate(90, expand=True)

im_0 = fillPoly(im_0)
 im_90 = fillPoly(im_90)
 im_90 = im_90.rotate(-90, expand=True)

i=0
 for x in range(im.size[0]):
   for y in range(im.size[1]):
     if(im_0.getpixel((x,y))==(0,255,0) and
     im_90.getpixel((x,y))==(0,255,0)):
       im.putpixel((x,y),(0,255,0))
       i+=1
 return i/(im.size[0]*im.size[1])

来源:https://www.cnblogs.com/powerzzjcode/p/11908817.html

0
投稿

猜你喜欢

  • v1.0.0完成基础框架、初始功能背景:为了提高日常工作效率、学习界面工具开发,可以将一些常用的功能集成到一个小的测试工具中,供大家使用。一
  • 一份基于cnn的手写数字自识别的代码,供大家参考,具体内容如下# -*- coding: utf-8 -*-import tensorflo
  • 顺序表python版的实现(部分功能未实现)结果展示:代码示例:#!/usr/bin/env python# -*- coding:utf-
  • 10个杀手级应用的Python自动化脚本重复的任务总是耗费时间和枯燥的。想象一下,逐一裁剪100张照片,或者做诸如Fetching APIs
  • 在Web标准中一个很重要的概念就是强调页面的结构与表现分离。说的通俗一点就是XHTML中应该没有样式化的东西,而且Web在浏览器中除内容外都
  • 工资excel表格格式如下所示:使用python批量给每位员工发送工资条信息,格式如下:思路:首先是加载excel,获取当前sheet表格s
  • 上段时间,团队内部有过好几次几次给力的分享,这里对西风师傅分享的继承机制稍作整理一下,适当加了写口语化的描述,留作备案。一、讲个故事吧澄清在
  • 用的昨天刚接触到的库,在windows下通过paramiko来登录linux系统并执行了几个命令,基本算是初试成功,后面会接着学习的。代码:
  • 这篇文章主要介绍了如何使用python实现模拟鼠标点击,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
  • 1、使用函数shutil.make_archive()创建归档文件,并返回归档后的名称。import shutilpath_1 = r
  • 如下所示:import http.client, urllib.parseimport http.client, urllib.parsei
  • Pytest和Unittest测试框架的区别?如何区分这两者,很简单unittest作为官方的测试框架,在测试方面更加基础,并且可以再次基础
  • Notes怀疑模型梯度 * ,想打印模型 loss 对各权重的导数看看。如果如果fit来训练的话,可以用keras.callbacks.Ten
  • 今天萌发一个想法,用css来实现透视效果。起初,我想到的是我们常见的添加阴影效果的方法,用多个div通过偏移来实现,但这需要很多 div,不
  • 围绕一门语言,学习它的文化精髓,能让你成为一名更优秀的程序员。如果你还没读过Python之禅(Zen of Python) ,那么打开Pyt
  • (一)关于体验约瑟夫.派恩和詹姆士.吉尔摩在《体验经济》一书中提出其观点:所谓“体验”就是企业以商品为道具,以服务为舞台,以顾客为中心,创造
  • 最近在学习的时候遇到了一个问题始终没有解决,这个博客写的也不是完全解决了这个问题。指示换了一种可行的思路而已。在运行一些显示动态的图片时,P
  • 本文实例讲述了python通过索引遍历列表的方法。分享给大家供大家参考。具体如下:python中我们可以通过for循环来遍历列表:colou
  • 说明eventlet是一个必备工具,经常用,绿化原理有点忘记了,重新复习一遍.三个主要问题 1. 绿化的原理是什么?2. 绿化怎么
  • 框架概念框架和web服务器关系·静态资源:不是经常变化的资源、往往是固定不变的资源·动态资源:经常变化的资源·模板文件:提供了一个显示的模板
手机版 网络编程 asp之家 www.aspxhome.com