最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python計算不規(guī)則圖形面積算法實(shí)現(xiàn)解析

 更新時間:2019年11月22日 10:13:02   作者:PowerZZJ  
這篇文章主要介紹了Python計算不規(guī)則圖形面積算法實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

這篇文章主要介紹了Python計算不規(guī)則圖形面積算法實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

介紹:大三上做一個醫(yī)學(xué)影像識別的項目,醫(yī)生在原圖上用紅筆標(biāo)記病灶點(diǎn),通過記錄紅色的坐標(biāo)位置可以得到病灶點(diǎn)的外接矩形,但是后續(xù)會涉及到紅圈內(nèi)的面積在外接矩形下的占比問題,有些外接矩形內(nèi)有多個紅色標(biāo)記,在使用網(wǎng)上的opencv的fillPoly填充效果非常不理想,還有類似python計算任意多邊形方法也不理想的情況下,自己探索出的一種效果還不錯的計算多圈及不規(guī)則圖形的面積的算法。

能較為準(zhǔn)確的計算出不規(guī)則圖形的面積

正文:算法的思想很簡單,遍歷圖片每一列,通過色差判斷是否遇到標(biāo)記圈,將坐標(biāo)全部記錄,對每一列的坐標(biāo)都進(jìn)行最小行和最大行記錄,確定每一列的最小和最大的坐標(biāo),然后上色(類似opencv的fillPoly的實(shí)現(xiàn),但是細(xì)節(jié)有些區(qū)別),只是這樣效果并不好,將圖片旋轉(zhuǎn)90度,再做一邊,將兩個圖片的結(jié)果放在一起做與操作,得到結(jié)果就能很好的處理多圈的標(biāo)記問題和多算面積的問題(比如上面的08-LM),

算法實(shí)現(xiàn)

全程只用pillow庫

首先先用屏幕拾色器獲取目標(biāo)顏色的rgb值,我這種情況下就是(237,28,36),前期截取外接矩形也是要這一步的,顏色也一致

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

每一列都設(shè)定翻轉(zhuǎn)位初始為False,如果上一個像素點(diǎn)不是目標(biāo)色,當(dāng)前是目標(biāo)色則開始記錄,一旦不是目標(biāo)色,停止檢測

top_Pixel都設(shè)定為黑色(0,0,0)因?yàn)橛袌D片最上方就是目標(biāo)色,導(dǎo)致判定出問題,直接讓最上面的像素初始化是黑色

coordinate_List記錄了所有符合的點(diǎn)坐標(biāo)

coordinate_List = []
top_Pixel = (0,0,0)
for x in range(im.size[0]):
  flag = False #初始化每一列翻轉(zhuǎn)位為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
    #翻轉(zhuǎn)判定
    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中的點(diǎn)如下圖

然后就是將上面獲得coordinate列表進(jìn)行處理

將coordinate列表中每一列的最小坐標(biāo)和最大坐標(biāo)進(jìn)行記錄

因?yàn)槊恳涣杏涗浀臄?shù)量并不確定(應(yīng)該可以在上一步改進(jìn)一下),所以需要遍歷多次

首先找到第一個列出現(xiàn)的坐標(biāo),將它的行信息記錄(行信息最小確定),

然后遍歷出全部的同列的坐標(biāo),比較行坐標(biāo),如果大的就將最大的代替(行信息最大確定),用一個新的列表記錄數(shù)據(jù)

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都初始化為一個坐標(biāo)不存在的值比如-1,為了在下一步多圈且有空隙情況下,不會出現(xiàn)殘影現(xiàn)象,如下圖

上一步的最后得到一個列表,第n列的最小行和最大行分別是第2n和2n+1元素,結(jié)果中的-1,為了讓下一步不會畫進(jìn)去

然后就是繪制圖片了,每一列將列表中對應(yīng)的最小行到最大行涂滿

#上色
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的算法實(shí)現(xiàn),雖然還差翻轉(zhuǎn)做與操作,但是已經(jīng)比opencv生成的效果好,寫成函數(shù)后續(xù)調(diào)用,

然后就是簡單的翻轉(zhuǎn)90度,再調(diào)用一次這個函數(shù)再做一遍

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])

做兩遍的效果圖

可以看到效果非常不錯,但是依舊有個別圖像有問題,比如十字分布的,

但現(xiàn)在的話誤差已經(jīng)降低非常多了,這些極其個別的十字現(xiàn)象可以手動把原圖切割一下,或者干脆不處理了

所有代碼,畫出綠圖片為了方便直觀的查看,函數(shù)中可以把圖片順便保存一下,總體看一下效果

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 #初始化每一列翻轉(zhuǎn)位為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
      #翻轉(zhuǎn)判定
      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])

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python子進(jìn)程subpocess原理及用法解析

    Python子進(jìn)程subpocess原理及用法解析

    這篇文章主要介紹了Python子進(jìn)程subpocess原理及用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • python numpy 按行歸一化的實(shí)例

    python numpy 按行歸一化的實(shí)例

    今天小編就為大家分享一篇python numpy 按行歸一化的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • linux環(huán)境下Django的安裝配置詳解

    linux環(huán)境下Django的安裝配置詳解

    這篇文章主要介紹了linux環(huán)境下Django的安裝配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • Python3中字符串的常用操作方法及查找方法

    Python3中字符串的常用操作方法及查找方法

    這篇文章主要介紹了Python3中字符串的常用操作方法及查找方法,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Python3 venv搭建輕量級虛擬環(huán)境的步驟(圖文)

    Python3 venv搭建輕量級虛擬環(huán)境的步驟(圖文)

    這篇文章主要介紹了Python3 venv搭建輕量級虛擬環(huán)境的步驟(圖文),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • python庫pydantic的簡易入門教程

    python庫pydantic的簡易入門教程

    pydantic庫是一種常用的用于數(shù)據(jù)接口schema定義與檢查的庫,通過pydantic庫,我們可以更為規(guī)范地定義和使用數(shù)據(jù)接口,下面這篇文章主要給大家介紹了關(guān)于python庫pydantic的簡易入門教程,需要的朋友可以參考下
    2022-03-03
  • 深入解析Python中的JSON比較

    深入解析Python中的JSON比較

    進(jìn)行接口自動化時,有時候我們需要斷言的數(shù)據(jù)比較多,一個字段一個字段進(jìn)行斷言比較麻煩,那么如何利用Python實(shí)現(xiàn)輕松判斷數(shù)據(jù)格式是否相同呢,下面小編就為大家詳細(xì)講講
    2023-09-09
  • python中如何提高圖像質(zhì)量

    python中如何提高圖像質(zhì)量

    這篇文章主要介紹了python中如何提高圖像質(zhì)量問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • python中pyplot直方圖的繪制方式

    python中pyplot直方圖的繪制方式

    這篇文章主要介紹了python中pyplot直方圖的繪制方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • python實(shí)現(xiàn)圖像隨機(jī)裁剪的示例代碼

    python實(shí)現(xiàn)圖像隨機(jī)裁剪的示例代碼

    這篇文章主要介紹了python實(shí)現(xiàn)圖像隨機(jī)裁剪的示例代碼,幫助大家更好的理解和使用python處理圖片,感興趣的朋友可以了解下
    2020-12-12

最新評論

仙桃市| 闵行区| 武邑县| 图木舒克市| 沧州市| 仙桃市| 武清区| 江门市| 南丹县| 余庆县| 洛隆县| 庆阳市| 新闻| 新河县| 阜南县| 霍山县| 手游| 外汇| 习水县| 百色市| 博罗县| 宁陵县| 霍山县| 隆林| 佛坪县| 兴宁市| 永和县| 兴业县| 娱乐| 闽清县| 大厂| 安龙县| 含山县| 重庆市| 九台市| 麟游县| 祁门县| 陈巴尔虎旗| 哈尔滨市| 策勒县| 南漳县|