用Python 對圖片主體輪廓進行提取、顏色標記、並計算區域面積

2021-01-07 Z先生點記

Python + Opencv2 實現輪廓提取,輪廓區域面積計算;

對圖像處理時,會遇到這樣一個場景:找到圖像主體輪廓,這是其一,可能為了凸顯輪廓,需要用指定的顏色進行標記;輪廓標記完可能任務還沒有結束,還需對輪廓所勾勒的像素麵積區域統計計算。

本篇文章的主要內容就是要解決上面場景遇到的三個問問題

找到圖像主題輪廓;用指定顏色對源圖像進行輪廓標記;計算輪廓中的主體;實驗環境配置為 Python + Opencv 3.4, 處理的圖像如下:

images.jpg第一步,提取輪廓,Opencv 中的 findContours() 函數 可以直接提取輪廓,但對輸入圖像有一定要求

一,輸入的圖像必須是單通道,三通道不允許;二,輸入的圖像數據類型需是 8UC1;否則程序會報錯的,報錯信息如下:error: (-210) [start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in function cvStartFindContours_Impl解決方法,在讀取時加入下面這行代碼進行數據格式轉換,同時解決上面兩個問題:

mat_img2 = cv2.imread(img_path,cv2.CV_8UC1)三、輸入的圖像背景需是黑色的,否則輪廓提取失敗,就以本次圖像為例,如果直接提取效果如下:

1.jpg圖片最外層是一層黑色部分,所以最終結果就是標記最外層;對這類背景非黑色的圖片做輪廓提取時,需要進行預處理:把背景變為黑色

提供一個簡單辦法,閾值化處理:設定一個閾值 Threshold 和一個指定值 OutsideValue ,當圖像中像素滿足某種條件(大於或小於設定的閾值時),像素值發生變化。

自適應閾值化分割

這裡用到的是 Opencv 提供的自適應閾值分割算法,其函數格式為:

dst=cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

src 需要分割的圖像( adarray 類型);maxValue ,滿足條件是替換的像素值,等價於上面提到的 OutsideValue;adaptiveMetheod: 自適應閾值分割算法,Opencv 中提供兩種方法1,ADAPTIVE_THRESH_MEAN_C : 最後的像素值

為原像素值

區域像素的平均值 ;

2,ADAPTIVE_THRESH_GAUSSIAN_C : 最後像素值

為原像素值

附近

區域大小最小值 ;

thresholdType 閾值分割方法,Opencv 提供了5 種;1,THRESH_BINARY:

2,THRESH_BINARY_INV:

3,THRESH_TRUNC:

4,THRESH_TOZERO:

5,THRESH_TOZERO_INV;

dst : 返回的閾值分割圖像(是 ndarray 類型)下面這行代碼就是本次實驗設置的參數:

dst = cv2.adaptiveThreshold(mat_img2,210,cv2.BORDER_REPLICATE,cv2.THRESH_BINARY_INV,3,10)自適應閾值分割的結果:

輪廓提取

接下來就是進行輪廓提取了,用到的函數:

image, contours, hierarchy=cv2.findContours(image, mode, method)

image 返回的圖像,在 Opencv 4.0 之後就沒有這個參數了;contours 標記的輪廓,以 list 形式存在,每個輪廓中都包含了輪廓像素的坐標向量;hierarchy 表示輪廓的繼承關係,一般用不到;dimage 後面image 表示需要標記輪廓的圖像,以 ndarray 格式存在;mode 標記輪廓的模式,Opencv 提供了4種;1,RETR_EXTERNAL;只提取整體外部輪廓;

2,RETR_LIST;提取所有輪廓,不需要建立任何繼承關係;

3, RETR_CCOMP ;提取所有輪廓,最後形成兩個水平集,外面一個,內部一個;

4, RETR_TREE ;提取所有輪廓,構建等級關係(父子繼承關係)

method :輪廓近似點連接方式,例如一個長方形,可以由數百個點連接而成,單節省內存的方式就是找到四個角點即可;其中前者為 CHAIN_APPROX_NONE 後者為 CHAIN_APPROX_SIMPLE這裡分別對 mode 設置不同的參數,一個設為 RETR_TREE (提取全部輪廓),一個設置 RETR_EXTRENAL (只提取最外部輪廓 );可以看一下提取輪廓效果:

RETR_TREE 結果:

RETR_EXTRENAL 結果:

是不是感受到了mode 不同導致輪廓的差距;一般只提取一個輪廓用 RETR_EXTRENAL,多個的話用 RETR_TREE;

輪廓標記

對輪廓顏色繪製,用到 的函數

cv2.drawContours(image, contours, contourIdx, color,thickness)

image 繪製輪廓的圖像 ndarray 格式;contours ,findContours 函數找到的輪廓列表;contourIdx 繪製輪廓的索引數,取整數時繪製特定索引的輪廓,為負值時,繪製全部輪廓;color 繪製輪廓所用到的顏色,這裡需要提醒一下, 想使用 RGB 彩色繪製時,必須保證 輸入的 image 為三通道,否則輪廓線非黑即白;thickness ,用於繪製輪廓線條的寬度,取負值時將繪製整個輪廓區域;以下就是分別取 thickness 為3(左)、-3(右) 繪製的結果

輪廓區域面積計算

最後計算輪廓面積,用到 cv2.contourArea(contour) 函數,裡面的參數指的就是計算的輪廓

area = 0for i in contours: area += cv2.contourArea(i)print(area)>>>16397.5#最後結果本篇文章用到的完整代碼如下:

import cv2img_path = "E:/data_ceshi/images.jpg"#讀取文件mat_img = cv2.imread(img_path)mat_img2 = cv2.imread(img_path,cv2.CV_8UC1)#自適應分割dst = cv2.adaptiveThreshold(mat_img2,210,cv2.BORDER_REPLICATE,cv2.THRESH_BINARY_INV,3,10)#提取輪廓img,contours,heridency = cv2.findContours(dst,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#標記輪廓cv2.drawContours(mat_img,contours,-1,(255,0,255),3)#計算輪廓面積area = 0for i in contours: area += cv2.contourArea(i)print(area)#圖像showcv2.imshow("window1",mat_img)cv2.waitKey(0)

相關焦點

  • OpenCV-Python 輪廓特徵|二十二
    目標在本文中,我們將學習如何找到輪廓的不同特徵,例如面積,周長,質心,邊界框等。您將看到大量與輪廓有關的功能。1. 特徵矩特徵矩可以幫助您計算一些特徵,例如物體的質心,物體的面積等。請查看特徵矩上的維基百科頁面。函數cv.moments()提供了所有計算出的矩值的字典。
  • 從入門到入域之python+opencv提取sfz信息
    建立一個標準號碼庫(利用上面自製模板數字分割後獲得),然後用每一個號碼圖片與庫中所有標準號碼圖片做相似度匹配,和哪一個模板相似度最高,則說明該圖片為哪一位號碼。在將模板號碼分割成功後,最關鍵的一步就是進行相似度匹配。
  • 一文概述用 python 的 scikit-image 模塊進行圖像分割
    而圖像分割是圖像處理中非常重要的一個步驟,它是把圖像分成若干個特定的、具有獨特性質的區域,並提取出感興趣目標的技術。近日,工程師 Parul Pandey 發表了一篇博文,在博文中,她介紹了用 python 的 scikit-image 庫進行圖像分割的方法。具體涉及 scikit-image 的安裝,圖像導入以及用監督算法和無監督算法進行圖像分割的方法。
  • ImagePy——UI界面支持開放插件的Python開源圖像處理框架
    ;能夠對從圖像中提取的參數進行相關的數據分析、濾波、統計分析等。硬幣過濾與分割選擇一個複合濾波器對圖像進行 sobel 梯度提取,然後使用上下閾值作為標記,最後在梯度圖上進行 watersheds 分割。濾波和分割是圖像處理工具包中的關鍵技術,也是最終測量成敗的關鍵。還支持諸如自適應閾值、watersheds 等分割方法。
  • 「python opencv視覺零到實戰」八、圖片選區操作
    」 第四節色彩空間「python opencv視覺入門到實戰」 五、對象追蹤「python opencv視覺零基礎到實戰」 六、圖像運算「python opencv視覺零基礎實戰」 七邏輯運算應用二、了解OpenCV中圖像ROI的顏色填充2.1 了解ROI是什麼ROI指的是region of Interest,翻譯過來就是你所感興趣的區域
  • OpenCV-Python 輪廓屬性|二十三
    目標在這裡,我們將學習提取一些常用的物體屬性,如堅實度,等效直徑,掩模圖像,平均強度等。更多的功能可以在Matlab regionprops文檔中找到。(注:質心、面積、周長等也屬於這一類,但我們在上一章已經見過)1. 長寬比它是對象邊界矩形的寬度與高度的比值。
  • 利用Python來識別並提取圖片中文字
    在文字識別中,許多應用軟體可以幫我們忙,那麼強大的python可以實現圖片中的文字識別嗎?    在學習python的圖像識別中,我們了解到關於中文的識別,效果比較好而且開源的應該就是Tesseract-OCR了,python裡面也有一個包去使用Tesseract-OCR,這個包叫pytesseract。
  • PDF圖片提取
    之前我們使用pymupdf提取了PDF文檔中的文本信息(《PyMuPDF提取文本信息》),那麼對於圖片信息,也可以進行一波提取。今天我們一起來試試。一、簡介可以觀察到,該文檔中共有4張圖片。提取思路為:首先得到PDF文檔的所有對象,然後遍歷它們判斷是否是圖片類型,再將圖片信息寫入,最後保存為png格式文件。
  • Python-OpenCV獲取圖像輪廓的圖像處理方法
    圖像閾值化操作中,我們更關心的是從二值化圖像中分離目標區域和背景區域,僅僅通過固定閾值很難達到理想的分割效果。在圖片中的灰度是不均勻的,所以通常情況下圖片中不同區域的閾值是不一樣的。這樣就需要一種方法根據圖像不同區域亮度或灰度分布,計算其局部閾值來進行閾值處理。
  • 利用python計算函數與x軸之間的面積
    用數學表達式表示出來就是:也就是求解任意一個函數的絕對值與x軸之間構成的面積,我們以函數sin(x)為例(因為函數sin(x)便於對計算結果進行檢驗),如圖所示:我們用積分的定義來計算,積分就是將函數分成無數的小段,然後對每一小段進行求和處理。
  • 我用Python進行情感分析,讓程式設計師和女神牽手成功
    所以,我們需要將這50000個txt文件整合成一個表格,表格分為兩列,第一列表示評論的內容,第二列表示評論是屬於正面(用1表示)還是負面(用0表示)。三、生成電影評論的表格文件將50000個txt文件整合成一個表格文件的時候,需要十分鐘左右。
  • 基於Opencv的身份證圖像信息提取
    身份證信息提取要求:①能自動提取身份證的頭像部分②能自動識別身份證的號碼信息身份證不同區域的信息提取是基於對初步形成的連通域進行輪廓提取來實現的,該過程主要包括輪廓的檢測、輪廓的繪製以及區域的分割。輪廓是區域的邊緣列表,在圖像中邊緣一般定義為局部亮度變換最明顯的地方,主要存在於目標、背景和區域三者之間。
  • 像Excel一樣使用python進行數據分析
    isnull()0    False1     True2    False3    False4     True5    FalseName: price, dtype: bool查看唯一值Excel中查看唯一值的方法是使用「條件格式」對唯一值進行顏色標記
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    由於img1圖片只有「我是1_bit」文字為白色,其他區域為黑色,我們可以當成「我偶是1_bit」這個內容區域的值為1,然後黑色區域位置為0。這時黑色區域與img3圖片的通道區域值進行計算,那就是0與一個內容值進行邏輯與計算,那麼結果為0,img1的文字部分值為1,與img3圖片相同的位置進行邏輯與計算,那麼保留結果。
  • 一種用Python生成詞雲
    一種用Python生成詞雲我們在閱讀一篇很長的文章時,總先看看文章的關鍵詞來獲知文章的大概內容。今天我們就來製作一個詞雲程序,將文章中出現次數較多的詞語提取出來,生成一張詞雲圖。」Grey」Font_path=」msyh.ttc」)顏色可以查詢下表也可以用16進位數值模式,以#開頭的6位16進位數表示顏色,你可以在下面這個網站上找到自己想要的顏色的1 6進位顏色數值。
  • 【OpenCV+Python】輪廓特徵初階
    圖像識別的一個核心問題是圖像的特徵提取,簡單描述即為用一組簡單的數據(數據描述量)來描述整個圖像,這組數據越簡單越有代表性越好。良好的特徵不受光線、噪點、幾何形變的幹擾,圖像識別技術的發展中,不斷有新的描述圖像特徵提出,而圖像不變矩就是其中一個。
  • PS如何將圖片中的顏色提取並保存使用?
    PS如何將圖片的顏色提取並保存使用的?這個就必須通過web所用格式進行顏色的分解,一起來看看操作吧。1.首先我們導入圖片素材,然後點擊文件導出中的存儲為web所用格式選項。2.然後進入對話框,點擊下拉菜單,選擇GIF格式,這個時候下邊就會出現一片顏色區域。
  • 利用python計算三角形的面積
    利用python計算三角形的面積。(1)輸入三個數,作為三角形的三個邊長,利用海倫公式計算三角形的面積。海倫公式:假設在平面內,有一個三角形,邊長分別為 a、b、c,三角形的面積 S可由以下公式求得。b=float(input("請輸入第二條邊"))c=float(input("請輸入第三條邊"))p=(a+b+c)/2S=math.sqrt(p*(p-a)*(p-b)*(p-c))print("三角形({},{},{})的面積為
  • Python代碼使用OpenCV進行Blob檢測
    blob是圖像中一組共享的區域,它們具有一些共同的屬性(例如灰度值,形狀,尺寸等)blob檢測的目的是識別並標記一些特定區域,blob檢測在自動化工業領域比較常見。  OpenCV提供了一種方便的方法來檢測blob並根據不同的特徵對其進行過濾。
  • AI科技:如何利用圖片像素之間的相似度進行圖像分割?
    自答:這篇文章是CVPR2018上一篇關於弱監督語義分割的文章,也就是,數據集告訴你一堆圖片以及這些圖片裡面有什麼,你使用深度學習的方法將圖片中每一個物體的區域分割出來。問題②:這篇文章主要思路是什麼?