圖像紋理特徵提取

圖像紋理是圖像中像素之間的複雜關係,其反映了圖像的光滑、粗糙、混亂、有序等特徵。因此,對於許多圖像處理和分析任務,包括目標分類、目標檢測、圖像信息檢索等,從圖像紋理中提取特徵已成為一項重要的技術。

一、紋理特徵提取方法

在圖像紋理特徵提取方面,常用的方法可以分為基於結構的方法和基於統計的方法。

1.基於結構的方法

基於結構的方法主要關注圖像中重複的空間結構,並利用這些結構來提取特徵。其中一種常見的方法就是利用小波變換進行紋理分析。小波變換將信號分解為不同尺度和方向上的子帶,能夠很好地描述圖像中不同頻率的細節信息。因此,通過小波變換可以提取圖像紋理的局部結構特徵,如紋理點、線和方向等。

代碼示例:

import pywt
import cv2

img = cv2.imread('texture.jpg', 0)
coeffs = pywt.dwt2(img, 'haar') # 利用haar小波進行二維小波變換
cA, (cH, cV, cD) = coeffs # 獲取LL、LH、HL和HH係數

2.基於統計的方法

基於統計的方法則關注圖像中的紋理統計特徵,包括紋理的灰度分布、梯度方向、梯度幅值和空間結構等,這些特徵往往涵蓋一些局部的信息和全局的信息。由於統計特徵具有不變性和穩定性,因此這些特徵在目標分類和圖像檢索中具有廣泛應用。

代碼示例:

import cv2

img = cv2.imread('texture.jpg', 0)
mean = cv2.mean(img)[0] # 獲取圖像的灰度平均值
var = cv2.meanStdDev(img)[1][0][0] # 獲取圖像灰度方差
gX = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=3) # X方向梯度
gY = cv2.Sobel(img, cv2.CV_32F, 0, 1, ksize=3) # Y方向梯度
gMag, gDir = cv2.cartToPolar(gX, gY, angleInDegrees=True) # 計算梯度幅值和梯度方向

二、常用的紋理特徵描述方法

在圖像紋理特徵描述方面,常用的方法可以分為直方圖和統計方法兩種。

1.直方圖

直方圖通常用於描述圖像的灰度分布特徵,將灰度級分為若干個區間,統計每個區間內像素的個數,得到的直方圖表示了圖像的灰度分布情況。在紋理特徵描述中,可以利用直方圖來描述圖像紋理的灰度分布特徵和梯度分布特徵等。

代碼示例:

import cv2

img = cv2.imread('texture.jpg', 0)
hist = cv2.calcHist([img], [0], None, [256], [0, 256]) # 計算灰度直方圖
hist_norm = cv2.normalize(hist, hist) # 將直方圖歸一化到[0, 1]範圍

2.統計方法

統計方法則關注圖像中的紋理統計特徵,包括紋理的灰度分布、梯度方向、梯度幅值和空間結構等,這些特徵往往涵蓋一些局部的信息和全局的信息。統計方法常用的描述方法有灰度共生矩陣、灰度差異矩陣和局部二值模式等。

代碼示例:

import cv2

img = cv2.imread('texture.jpg', 0)
glcm = cv2.calcGLCM(img, [1], [0, np.pi/4, np.pi/2, 3*np.pi/4], symmetric=True) # 計算灰度共生矩陣
contrast = cv2.compareHist(cv2.normalize(glcm, glcm).flatten(), np.array([1]), cv2.HISTCMP_CHISQR_ALT) # 計算對比度
entropy = -np.sum(glcm*np.log2(glcm + 1e-10)) # 計算熵

三、常用的圖像紋理特徵分類演算法

在對圖像紋理特徵進行提取和描述之後,通常需要將這些特徵用於分類和識別。常用的分類演算法有:K近鄰演算法、支持向量機演算法、隨機森林演算法和神經網路演算法等。

1.K近鄰演算法

K近鄰演算法是一種基於實例的分類演算法,其基本思想是在訓練數據集中尋找與測試數據樣本最相似的K個鄰居,然後根據這K個鄰居的標籤信息對測試樣本進行分類。在使用K近鄰演算法進行圖像紋理分類時,可以利用某個像素周圍的紋理信息作為該像素的特徵,然後將這些特徵作為訓練數據進行分類。

代碼示例:

import cv2
from sklearn.neighbors import KNeighborsClassifier

def extract_features(img, x, y):
    # 提取以(x, y)為中心的9個像素的紋理特徵
    features = []
    for i in range(x-1, x+2):
        for j in range(y-1, y+2):
            if i != x and j != y:
                features.append(img[i, j])
    return features

img = cv2.imread('textures.jpg', 0)
h, w = img.shape
X = []
y = []
for i in range(1, h-1):
    for j in range(1, w-1):
        features = extract_features(img, i, j)
        X.append(features)
        y.append(label)

knn = KNeighborsClassifier(n_neighbors=3, weights='distance')
knn.fit(X, y)

2.支持向量機演算法

支持向量機演算法是一種二分類演算法,其基本思想是利用一個超平面將不同類別的樣本分開。在圖像紋理分類中,可以將提取的圖像紋理特徵作為樣本,然後利用支持向量機將這些特徵進行分類。

代碼示例:

import cv2
from sklearn.svm import SVC

img = cv2.imread('textures.jpg', 0)
h, w = img.shape
X = []
y = []
for i in range(1, h-1):
    for j in range(1, w-1):
        features = extract_features(img, i, j)
        X.append(features)
        y.append(label)

svm = SVC(kernel='linear', C=1, gamma='auto')
svm.fit(X, y)

3.隨機森林演算法

隨機森林演算法是一種集成學習演算法,其基本思想是將多個決策樹合併成一個森林,然後利用不同的隨機採樣和特徵採樣方法來增強模型的泛化能力。在圖像紋理分類中,可以將提取的圖像紋理特徵作為決策樹的訓練數據,然後利用隨機森林對這些特徵進行分類。

代碼示例:

import cv2
from sklearn.ensemble import RandomForestClassifier

img = cv2.imread('textures.jpg', 0)
h, w = img.shape
X = []
y = []
for i in range(1, h-1):
    for j in range(1, w-1):
        features = extract_features(img, i, j)
        X.append(features)
        y.append(label)

rf = RandomForestClassifier(n_estimators=100)
rf.fit(X, y)

4.神經網路演算法

神經網路演算法是一種常見的深度學習方法,其基本思想是通過多層神經元的計算和反向傳播演算法來訓練模型,實現從輸入到輸出的映射。在圖像紋理分類中,可以將提取的圖像紋理特徵作為神經網路的輸入,然後訓練神經網路進行分類。

代碼示例:

import cv2
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation

img = cv2.imread('textures.jpg', 0)
h, w = img.shape
X = []
y = []
for i in range(1, h-1):
    for j in range(1, w-1):
        features = extract_features(img, i, j)
        X.append(features)
        y.append(label)

model = Sequential()
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(X, keras.utils.to_categorical(y, num_classes=10), epochs=50, batch_size=32)

原創文章,作者:USMHH,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/362724.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
USMHH的頭像USMHH
上一篇 2025-02-27 19:28
下一篇 2025-02-27 19:28

相關推薦

  • 如何在Java中拼接OBJ格式的文件並生成完整的圖像

    OBJ格式是一種用於表示3D對象的標準格式,通常由一組頂點、面和紋理映射坐標組成。在本文中,我們將討論如何將多個OBJ文件拼接在一起,生成一個完整的3D模型。 一、讀取OBJ文件 …

    編程 2025-04-29
  • 如何實現圖像粘貼到蒙版

    本文將從多個方面介紹圖像粘貼到蒙版的實現方法。 一、創建蒙版 首先,在HTML中創建一個蒙版元素,用於接收要粘貼的圖片。 <div id=”mask” style=”widt…

    編程 2025-04-29
  • Python圖像黑白反轉用法介紹

    本文將從多個方面詳細闡述Python圖像黑白反轉的方法和技巧。 一、Pillow模塊介紹 Pillow是Python的一個圖像處理模塊,可以進行圖片的裁剪、旋轉、縮放等操作。使用P…

    編程 2025-04-28
  • Matlab二值圖像全面解析

    本文將全面介紹Matlab二值圖像的相關知識,包括二值圖像的基本原理、如何對二值圖像進行處理、如何從二值圖像中提取信息等等。通過本文的學習,你將能夠掌握Matlab二值圖像的基本操…

    編程 2025-04-28
  • Python實現圖像轉化為灰度圖像

    本文將從多個方面詳細闡述如何使用Python將圖像轉化為灰度圖像,包括圖像的概念、灰度圖像的概念、Python庫的使用以及完整的Python代碼實現。 一、圖像與灰度圖像 圖像是指…

    編程 2025-04-28
  • 圖像與信號處理期刊級別

    本文將從多個方面介紹圖像與信號處理期刊級別的相關知識,包括圖像壓縮、人臉識別、關鍵點匹配等等。 一、圖像壓縮 圖像在傳輸和存儲中佔據了大量的空間,因此圖像壓縮成為了很重要的技術。常…

    編程 2025-04-28
  • 加菲貓是什麼品種?解析加菲貓的品種特徵

    如果你對貓咪很感興趣,一定會聽說過加菲貓這個名字。那麼,加菲貓是什麼品種呢?加菲貓的特徵又有哪些呢?下面我們就來一一解答。 一、加菲貓的品種歷史 加菲貓是由艾爾達·埃爾斯曼女士於1…

    編程 2025-04-27
  • Python 文件內圖像重命名

    Python作為一門功能強大的編程語言,可以實現很多實用的操作。在基本編程操作中,經常會遇到需要對文件進行操作,而文件中的圖像也需要進行重命名。本文將從多個方面詳細介紹如何使用Py…

    編程 2025-04-27
  • Opencv圖像拼接

    一、拼接方法 Opencv圖像拼接方法主要有兩種,分別是水平拼接和垂直拼接。 水平拼接是將多張圖像在水平方向連接在一起,最終形成一張橫向拼接的長圖。垂直拼接是將多張圖像在垂直方向連…

    編程 2025-04-24
  • Image Watch: 提升Debug流程中的圖像可視化效果

    在軟體開發中,Debug是一個非常重要的環節,尤其在涉及到圖像或視頻數據處理的時候。Image Watch是一個能夠在Debug流程中提供圖像可視化效果的插件,能夠幫助開發者更方便…

    編程 2025-04-23

發表回復

登錄後才能評論