iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0
自我挑戰組

數位影像處理系列 第 28

[Day 28]特徵擷取

  • 分享至 

  • xImage
  •  

最後幾天的時間,將介紹特徵擷取(Feature Extraction)技術。首先,將介紹基本概念,接著帶入幾個特徵擷取的相關技術實作,例如:輪廓搜尋、形狀特徵、輪廓特徵等等。


1.基本概念

 由於數位影像是由二維陣列或矩陣構成,牽涉的資料量相當龐大,不利於進一步的影像分析或物件辨識。因此,學術界的學者專家持續投入研究,希望在數位影像中擷取有用的資訊,稱為特徵(Feature)。

 所謂的特徵,其實沒有明確定義,通常是泛指有利於影像分析或物件辨識的相關資訊,或是指影像物件的表示法,可以提供量化的數據資料。

 特徵擷取(Feature Extraction)技術,目的是根據二維的數位影像,經過數學運算與處理,希望可以擷取一維的影像特徵資料,稱為特徵向量(Feature Vector)。這樣我們就可以根據擷取的特徵向量,進行後續的影像分析或物件辨識。

由於特徵擷取技術將二維的資料形成一維的資料,因此也牽涉降維度運算,例如:主成分分析(Principal Component Analysism PCA)等。


2.輪廓搜尋

 給定二值影像中的物件,輪廓(Contour)可以定義為:「沿著物件邊緣搜尋邊緣像素所形成的路徑。」

 也就是說,輪廓可以使用像素座標的序列表示,順序通常是採用順時針或逆時針方向,從物件邊緣左上角的像素開始搜尋,並依照8-相鄰(或4-相鄰)原則依序紀錄像素座標。搜尋輪廓所形成的像素座標序列,也可簡稱為鍊(Chain)。

 輪廓搜尋的目的即是根據二值影像,搜尋影像中物件的輪廓,並以特定的資料結構儲存,紀錄輪廓的相關資料,由於影像中可能包含多個物件,因此物件是以階層式(Hierarchy)的資料結構儲存。

 而在這裏的輪廓,指的是外部輪廓。若物件內部包含(Holes),則該物件在洞的邊緣所形成的輪廓,稱為內部輪廓。OpenCV提供搜尋羅克演算法,稱為findContours函式。
cv2.FindCointours(img, storage, mode = CV_RETR_LIST, method = CV_CHAIN_APPROX_SIMPLE, offset = (0, 0))

針對函式中的參數做以下講解:

  • img:輸入的二值影像。
  • contours:偵測的輪廓
  • mode:輪廓模式,含:
     (1) CV_RETR_EXTERNAL:擷取外部輪廓
     (2) CV_RETR_LIST:擷取所有輪廓
     (3) CV_RETR_CCOMP:擷取所有輪廓,但分成內部與外部輪廓兩階層。
     (4) CV_RETR_TREE:擷取所有輪廓,並重建階層架構
  • method:輪廓近似方法,含:
     (1) CV_CHAIN_APPROX_NONE:儲存所有輪廓點
     (2) CV_CHAIN_APPROX_SIMPLE:僅儲存輪廓在水平、垂直或對角線方向的端點。
  • offset:輪廓點的位移量(Optional)

程式碼如下:

import numpy as np
import cv2
import math

img1 = cv2.imread("D:/Desktop/IThome/text3.bmp", 0)
img2 = cv2.cvtColor(img1, cv2.COLOR_GRAY2BGR)
contours, hierarchy = cv2.findContours(img1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

cv2.drawContours(img2, contours, -1, (255, 0, 0), thickness = 2)

cv2.imshow("Original", img1)
cv2.imshow("After", img2)

cv2.waitKey()
cv2.destroyAllWindows()

結果如下:
https://ithelp.ithome.com.tw/upload/images/20221005/20152370r5pBN9Z8Pv.png


上一篇
[Day 27]JPEG影像壓縮
下一篇
[Day 29]輪廓特徵
系列文
數位影像處理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言