日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

数字图像处理与Python实现笔记之图像特征提取

發布時間:2024/10/8 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数字图像处理与Python实现笔记之图像特征提取 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數字圖像處理與Python實現筆記

  • 摘要
  • 緒論
  • 1 數字圖像處理基礎知識
  • 2 彩色圖像處理初步
  • 3 空間濾波
  • 4 頻域濾波
  • 5 圖像特征提取
    • 5.1 圖像顏色特征提取
      • 5.1.1 顏色直方圖
        • 1 一般顏色直方圖
        • 2 全局累加直方圖
        • 3 主色調直方圖
      • 5.1.2 顏色矩
      • 5.1.3 顏色集
      • 5.1.4 顏色聚合向量
      • 5.1.5 顏色相關圖
    • 5.2 圖像紋理特征提取
      • 5.2.1 統計紋理分析方法
      • 5.2.2 Laws紋理能量測量法
      • 5.2.3 Gabor變換
      • 5.2.4 局部二值模式
    • 5.3 圖像形狀特征提取
      • 5.3.1 簡單形狀特征
      • 5.3.2 傅里葉描述符
      • 5.3.3 形狀無關矩
    • 5.4 圖像邊緣特征提取
      • 5.4.1 梯度邊緣檢測
      • 5.4.2 一階邊緣檢測算子
        • 1 羅伯特算子
        • 2 索貝爾算子
        • 3 Prewitt算子
      • 5.4.3 二階邊緣檢測算子
        • 1 拉普拉斯(Laplace)算子
        • 2 LoG邊緣檢測算子
    • 5.5 圖像點特征提取
    • 5.6 小結
  • 參考資料

摘要

  • 簡要介紹數字圖像處理涉及的一些基本概念、基本運算、基本類型,以及如何通過Python對數字圖像進行讀取和簡單操作。
  • 以彩色圖像為例對數字圖像處理的基本操作進行介紹,熟悉數字圖像處理的基本過程,主要包括顏色空間的基本概念、偽彩色圖像處理操作,彩色圖像處理簡單操作。
  • 瞄準在空間域中對圖像進行增強,介紹空間濾波的機理、基本概念以及使用的基本技術。本章內容包括空間濾波基本概念、基于空間濾波的圖像平滑處理、基于空間濾波的銳化操作以及混合空間增強。
  • 從頻域角度入手對圖像處理及增強方法展開介紹。因為頻域濾波所需的數學知識較多,所以本章采取由淺入深的策略,首先介紹一維傅里葉變換,其次介紹二維傅里葉變換和快速傅里葉變換,最后介紹圖像頻域濾波中出現的各種技術,其大體可分為低通濾波和高通濾波兩大類。
  • 從全局特征提取和局部特征提取兩方面入手,分別介紹顏色特征、紋理特征、形狀特征、邊緣特征、點特征的提取方法。本章內容是目前機器視覺和圖像處理領域的學者關注較多的內容,通過穿插較多的實例,幫助讀者理解圖像特征提取的基本技術。
  • 瞄準如何減少圖像傳輸及存儲數據大小,介紹主要使用的壓縮技術,包括有損壓縮和無損壓縮等,并使用JPEG壓縮技術串講全章知識點。
  • 介紹圖像的小波域表示及多分辨率表示。
  • 緒論

    • 人工智能是引領未來發展的戰略性技術,是新一輪科技革命和產業變革的重要驅動力量,將深刻地改變人類社會生活。

    • 促進人工智能和實體經濟的深度融合,構建數據驅動、人機協同、跨界融合、共創分享的智能經濟形態,更是推動質量變革、效率變革、動力變革的重要途經。

    • 進年來,我國人工智能新技術、新產品、新業態持續涌現,與農業、制造業、服務業等行業的融合步伐明顯加快,在技術創新、應用推廣、產業發展等方面成效初顯。

    • 人工智能技術并不是一個新生事物,它在最近幾年引起全球性關注并得到飛速發展的主要原因,在于它的三個基本要素(算法、數據、算力)的迅猛發展,其中又以數據和算力的發展尤為重要。

    • 物聯網技術的蓬勃發展使得數據累計的難度越來越低,而芯片算力的不斷提升,使得過去只能通過云計算才能完成的人工智能運算,現在可以下沉到最普通的設備上完成。

    • 物聯網技術為機器帶來感知能力,而人工智能則通過計算算力為機器帶來了決策能力,正如感知和大腦對自然生命進化所起到的必然性作用。

    1 數字圖像處理基礎知識

    https://hulin.blog.csdn.net/article/details/107570020

    2 彩色圖像處理初步

    https://hulin.blog.csdn.net/article/details/107578369

    3 空間濾波

    https://hulin.blog.csdn.net/article/details/107589248

    4 頻域濾波

    https://hulin.blog.csdn.net/article/details/107609844

    5 圖像特征提取

    • 圖像特征是指可以對圖像的內容或特點,進行表征的一系列數學的集合,主要包括圖像的自然特征(如亮度、色彩、紋理等)和圖像人為特征(如圖像頻譜、圖像直方圖等)。

    • 圖像特征提取可以視為廣義上的圖像變換,即將圖像從原始屬性空間轉化到特征屬性空間。

    • 圖像特征提取過程是指對圖像包含的信息進行處理和分析,并將其中不易受隨機因素干擾的信息,作為圖像的特征提取出來,進而實現將圖像的原始特征,表示為一組具有明顯的物理意義或統計意義的特征。

    • 圖像特征提取之后,通常還會伴隨圖像特征的選擇。圖像特征選擇過程是去除冗余信息的過程,其具有提高識別精度、減少運算量、提高運算速度等作用。

    • 良好的圖像特征通常具有以下3個特征。
      ① 代表性或可區分性
      圖像特征應能夠對該類別的圖像進行高效表達。不同類別的對象之間的特征差異越大越好,以滿足相應任務的要求。如在區分乒乓球和足球時,紋理特征就是一個不錯的特征,因為足球一般有六邊形紋理結構,而乒乓球沒有。在進行圖像分割時,圖像中的邊緣突變就是一個很好的特征,因為可以明確表示圖像的內容發生了改變。
      ② 穩定性
      同一類別圖像的特征應該具有類似的特征值,以保證類別內圖像的相似度大于類別間圖像的相似度。如在區分成熟蘋果和不成熟蘋果時,顏色是一個比較好的特征,因為不成熟的蘋果通常呈青色,而成熟的蘋果通常呈黃色或者紅色,尺寸大小這個特征在區分蘋果成熟與否時,不是一個穩定的特征。
      ③ 獨立性
      圖像特征應該彼此獨立,盡量減少彼此的關聯性,因為圖像特征之間的關聯性較強,會影響圖像內容的較好表達。如蘋果的直徑和重量就屬于關聯性較強的兩個特征,因為他們都可以反映蘋果的大小,因此同時使用大小和重量這兩個特征就會顯得冗余。

    • 圖像特征提取可以分為底層特征提取和高層語義特征提取。高層語義特征提取通常關注語義層次的特征,如識別任務中的人類識別,圖像分類等。底層特征提取通常關注圖像的顏色、紋理、形狀等一般特征。底層特征提取很少關注圖像的語義信息,通過底層特征提取獲得的信息一般比較普遍。

    • 高層語義特征提取通常需要關聯語義,如人臉識別中很多語義特征與人臉的部件相關,這能夠反映圖像中是否存在某類對象。高層語義特征提取以底層特征提取為基礎,輔以模式識別等方法,建立語義關聯,進而形成語義特征。深度學習的出現為語義特征提取提供了新的思路,實現了底層特征提取和高層語義關聯之間的銜接,極大地提升了圖像語義分析的效果。

    • 圖像特征提取根據其相對尺度,可分為全局特征提取和局部特征提取。全局特征提取關注圖像的整體表征。常見的全局特征包括顏色特征、紋理特征、形狀特征、空間位置關系特征等。局部特征提取關注圖像的某個局部區域的特殊性質。一幅圖像中往往包含若干興趣區域,從這些區域中可以提取出數量不等的若干個局部特征。和全局特征提取過程相比,局部特征提取過程首先需確定要描述的興趣區域,然后再對興趣區域進行特征描述。

    5.1 圖像顏色特征提取

    • 顏色特征是比較簡單但是應用廣泛的一種視覺特征。顏色特征往往和圖像中包含的對象或場景相關。
    • 與其他圖像特征相比,顏色特征對圖像的尺寸、方向、視角變化的依賴性較小,即相對于圖像的尺寸、方向、視角變化具有較好的健壯性。顏色特征是一種全局特征,能夠描述圖像或圖像區域對應的景物的表面性質。
    • 目前主要使用的顏色特征主要包括顏色直方圖、顏色矩、顏色集、顏色聚合向量以及顏色相關圖。

    5.1.1 顏色直方圖

    • 顏色直方圖用于描述圖像中像素顏色的數值分布情況,可以反映圖像顏色的統計分布和圖像基本色調。顏色直方圖僅可表征圖像中某一顏色值出現的頻數,無法描述圖像像素分布的空間位置信息。
    • 任意一幅圖像都能唯一給出一幅與它對應的顏色直方圖,但是不同的圖像可能有相同的顏色直方圖,因此直方圖與圖像存在一對多的關系。如將圖像劃分為若干個子區域,所有子區域的顏色直方圖之和等于全圖的顏色直方圖。
    • 一般情況下,由于圖像上的背景和前景物體的顏色分布明顯不同,顏色直方圖上會出現雙峰,但背景和前景物體的顏色較為接近的圖像,顏色直方圖不具有這一特性。

    1 一般顏色直方圖

    • 顏色直方圖是基本的顏色特征,它反映的是圖像中像素顏色值的組成分布,即出現了哪些顏色,以及各種顏色出現的概率。
    from matplotlib import pyplot as plt from skimage import data, exposure# 中文顯示工具函數 def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch() img = data.coffee() # 計算直方圖 histogram_r = exposure.histogram(img[:, :, 0], nbins=256) histogram_g = exposure.histogram(img[:, :, 1], nbins=256) histogram_b = exposure.histogram(img[:, :, 2], nbins=256)plt.figure() plt.subplot(221) plt.axis('off') plt.title('原始圖像') plt.imshow(img)plt.subplot(222) plt.axis('off') plt.title('R通道直方圖') plt.imshow(histogram_r)plt.subplot(223) plt.axis('off') plt.title('G通道直方圖') plt.imshow(histogram_g)plt.subplot(224) plt.axis('off') plt.title('B通道直方圖') plt.imshow(histogram_b) plt.show()
    • 彩色圖像的一般顏色直方圖
    • 一般顏色直方圖對圖像的旋轉、小幅平移、小幅縮放等變換不敏感,對圖像質量的變化(如增加噪聲也不敏感),所以一般顏色直方圖法適用于對難以進行語義分割的圖像和無需考慮空間位置的圖像進行描述。
    • 計算機的固有量化機制導致一般顏色直方圖法會忽略顏色間的相似性。

    2 全局累加直方圖

    • 當圖像中的顏色值不能取遍所有可能的顏色值時,一般顏色直方圖中就會出現一些零值。這些零值的出現會影響相似性的度量,進而使計算出的相似度不能準確反映圖像之間的顏色分布差異。
    • 為了彌補一般顏色直方圖的缺陷,再一般顏色直方圖的基礎上,通過對直方圖顏色進行累加,消除零值影響,形成全局累加直方圖。

    3 主色調直方圖

    • 在一幅圖像中,不同顏色值出現的概率不盡相同,且通常情況下少數幾種顏色就能涵蓋整幅圖像的主色調。
    • 基于該思想,主色調直方圖會計算出圖像中每種顏色出現的頻率,選擇出現頻率最高的幾種顏色并將其作為主色調。使用主色調直方圖,不會降低顏色直方圖匹配的效果,反而會抑制圖像非主要成分的噪聲,降低噪聲對圖像匹配的影響。

    顏色直方圖的優點和缺點如下。

    • 優點:計算簡單,對圖像的平移和旋轉變換不敏感,能簡單描述圖像中顏色的全局分布情況。
    • 缺點:無法捕捉(即丟失)顏色組成之間的空間位置關系。

    5.1.2 顏色矩

    • 矩是非常重要的統計量,用于表征數據分布的特點。在統計中,一階矩表示數據的均值,二階矩表示數據分布的方差,三階矩表示數據分布的偏移度。
    • 圖像的顏色矩用于對圖像內顏色分布進行表征,是重要的一種全局圖像特征表示。數字圖像中顏色分布的統計信息主要集中在低階矩中。
    • 圖像的顏色矩特征提取時主要瞄準圖像顏色矩中的一階矩、二階矩、三階矩,對圖像而言,這三種統計特征已經足以表達數字圖像的顏色分布。
    • 相對于顏色直方圖特征提取,顏色矩特征提取的優點是無須對顏色特征進提前量化。
    • 一階矩可以表征該顏色通道的平均響應強度,二階矩可以表示該顏色通道的響應方差,三階矩可以表征該顏色通道數據分布的偏移度。針對彩色圖像,圖像的顏色矩一共有9個分量,每個顏色通道均有3個低階矩。
    • 顏色矩僅使用少數幾個矩容易導致過多錯誤檢出,因而其通常和其他的幾個特征配合使用。
    from matplotlib import pyplot as plt from skimage import data, exposure import numpy as np from scipy import stats# 中文顯示工具函數 def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch()image = data.coffee() # 求RGB圖像的顏色矩特征,共9維特征 # 定義3*3數組,分別對RGB圖像的三個通道求均值、方差、偏移量 features = np.zeros(shape=(3, 3)) for k in range(image.shape[2]):mu = np.mean(image[:, :, k]) # 求均值delta = np.std(image[:, :, k]) # 求方差skew = np.mean(stats.skew(image[:, :, k])) # 求偏移量features[0, k] = mufeatures[1, k] = deltafeatures[2, k] = skew print(features)

    5.1.3 顏色集

    • 顏色集又可以稱為顏色索引集,是對顏色直方圖的一種近似。
    • 顏色集方法的步驟是:第一,將圖像從RGB圖像空間轉換到HSV顏色空間等視覺均衡的顏色空間,并將顏色空間量化為若干個邊長均等的小立方體。第二,使用基于顏色的自動分割技術,將圖像劃分為若干個子區域。第三,使用顏色量化空間中的某個顏色分類索引每個子區域,以將圖像表示為一個二進制的顏色索引集。
      ① 像素矢量表示
      ② 顏色空間轉換
      ③ 顏色集索引
      ④ 顏色集表示

    5.1.4 顏色聚合向量

    • 顏色聚合向量是在顏色直方圖上做進一步運算,其核心思想就是將屬于顏色直方圖的每個顏色量化區間的像素分為兩部分,如果該顏色量化區間中的某些像素,占據連續區域的面積大于指定閾值,則將該區域內的像素作為聚合像素,否則作為非聚合像素。
    • 顏色聚合向量除了包含顏色頻率信息外,也包含顏色的部分空間分布信息,因此其可以獲得比顏色直方圖過更好的效果。顏色聚合向量算法的具體步驟如下。
      ① 量化
      顏色聚合向量算法的第一步與求普通的顏色直方圖類似,即對圖像進行量化處理。一般采用均勻量化方法,量化的目標是使圖像中只保留有限個顏色空間。
      ② 連通區域劃分
      針對重新量化后的像素矩陣,根據像素間的連通性把圖像劃分為若干個連通區域。
      ③ 判斷聚合性
      統計每個連通區域中的像素數目,根據設定的閾值判斷該區域中的像素的聚合性
      ④ 聚合向量形成

    5.1.5 顏色相關圖

    • 顏色相關圖不僅可以顯示像素在圖像中的占比,也可以反映不同顏色對間的空間位置的相關性。
    • 顏色相關圖利用顏色對間的相對距離分布來描述空間位置信息。
    from matplotlib import pyplot as plt from skimage import data, exposure import numpy as np from scipy import stats# 中文顯示工具函數 def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch()def isValid(X, Y, point):"""判斷某個像素是否超出圖像空間范圍:param X::param Y::param point::return:"""if point[0] < 0 or point[0] >= X:return Falseif point[1] < 0 or point[1] >= Y:return Falsereturn Truedef getNeighbors(X, Y, x, y, dist):"""Find pixel neighbors according to various distances:param X::param Y::param x::param y::param dist::return:"""cn1 = (x + dist, y + dist)cn2 = (x + dist, y)cn3 = (x + dist, y - dist)cn4 = (x, y - dist)cn5 = (x - dist, y - dist)cn6 = (x - dist, y)cn7 = (x - dist, y + dist)cn8 = (x, y + dist)points = (cn1, cn2, cn3, cn4, cn5, cn6, cn7, cn8)Cn = []for i in points:if (isValid(X, Y, i)):Cn.append(i)return Cndef corrlogram(image, dist):XX, YY, tt = image.shapecgram = np.zeros((256, 256), dtype=np.int)for x in range(XX):for y in range(YY):for t in range(tt):color_i = image[x, y, t]neighbors_i = getNeighbors(XX, YY, x, y, dist)for j in neighbors_i:j0 = j[0]j1 = j[1]color_j = image[j0, j1, t]cgram[color_i, color_j] = cgram[color_i, color_j] + 1return cgramimg = data.coffee() dist = 4 cgram = corrlogram(img, dist) plt.imshow(cgram) plt.show()

    5.2 圖像紋理特征提取

    • 紋理是一種反映圖像中同質現象的視覺特征,它體現了物體表面的具有重復性或周期性變化的表面結構組織排列屬性。紋理有三大特點:重復性、周期性、同質性。
      ① 重復性
      圖像可以看作是某種局部元素在全局區域的不斷重復出現。
      ② 周期性
      圖像中元素并非隨機出現,而是按照一定的周期性重復出現。
      ③ 同質性
      重復出現的元素在結構和尺寸上大致相同。
    • 紋理是某種局部序列不斷重復、非隨機排列、在結構和尺寸上大致相同的統一體。
    • 不同于灰度、顏色等圖像特征,紋理特征通過像素及其周邊空間域像素的灰度分布進行描述,也就是局部紋理信息。局部紋理的反復排布呈現出的重復性,就是所謂的全局紋理信息。
    • 紋理信息在表現全局特征性質的同時,也體現了圖像或圖像所在區域對應景物的表面特性。紋理特征只是對物體表面特性進行描述,并不能反映物體的本質屬性,即圖像高層語義信息。
    • 紋理特征提取過程是通過一定的圖像處理技術抽取出紋理特征,從而獲得紋理的定量或定性描述的過程。紋理特征提取的基本過程如下。
      ① 紋理基元建模
      從像素出發,找出紋理基元(即紋理圖像中辨識能力比較強的特征),并根據紋理基元的排列信息,建立起紋理基元模型。
      ② 整體紋理模型構建
      利用紋理基元模型對紋理圖像進行特征提取,以支持對圖像的進一步分割、分類以及辨識,形成圖像整體紋理模型。
    • 常見的紋理特征提取方法可以分為如下4類。
      ① 統計分析法
      統計分析法又稱基于統計紋理特征的檢測方法,該方法假設紋理圖像在空間灰度分布上,存在某種重復性,通過對紋理圖像的灰度空間分布進行計算,從而得到紋理特征,主要包括灰度直方圖法、灰度共生矩陣法、灰度行程長度法、灰度差分統計、交叉對角矩陣、自相關函數法等。該類方法在木紋、沙地、草地之類的圖像分析上很有效。其主要優勢是:方法簡單,易于實現,典型的代表方法是灰度共生矩陣法,被認為是比較有效的紋理分析方法。
      ② 結構分析法
      結構分析法認為紋理基元之間存在某種結構規則關系,該類方法首先對圖像中的紋理基元進行分離,然后基于紋理基元的特征和空間排列規則對紋理進行表征,主要包括偏心度、面積、方向等特征,其主要目標是通過圖像結構特征和排列規則的描述,得到紋理特征的描述,此類算法主要適用于已知紋理基元的情況,對磚墻、纖維等紋理基元和排列規則都比較明顯的圖像有效。
      ③ 模型分析法
      模型分析法基于像素及其鄰域像素之間的關系建立模型,根據不同模型提取不同特征量,進行參數估計。典型的模型分析法包括自然回歸法、馬爾可夫條件隨機場法以及分形法等。
      ④ 頻譜分析法
      頻譜分析法又稱為信號處理法和濾波方法。該方法將紋理圖像從空間域變換到頻域,然后通過計算峰值處的面積、峰值與原點的距離平方、峰值處的相位、兩個峰值間的相角差等,獲得在空間域不易獲得的紋理特征,如周期、功率譜信息等,典型的頻譜分析法有二維傅里葉(變換)濾波方法,Gabor(變換)濾波變換和小波方法等。

    5.2.1 統計紋理分析方法

    • 統計紋理分析方法是較常用的紋理特征描述分析方法,通過統計圖像的空間頻率、邊界頻率以及空間灰度依賴關系等對紋理進行描述。
    • 細致的紋理有較高的頻率,例如,布匹的紋理是非常細致的紋理,其紋理基元較小,出現頻率較高。粗糙的紋理結構具有較低的空間頻率,如大理石紋理一般較粗糙,具有較大的紋理基元,出現頻率較低。
    • 紋理圖像的空間頻率可以作為紋理描述的一種方式。邊界頻率是另外一種基于統計的紋理圖像描述方法,邊界頻率越高,表明紋理越精細。空間灰度依賴關系方法通過描述紋理結構之間的空間依賴關系描述紋理。
    • 常用的統計紋理分析方法有自相關函數、邊界頻率、灰度共生矩陣等。統計紋理分析方法并不刻意精確描述紋理的結構。從統計學的角度看,紋理圖像是一些復雜的模式,通常通過獲得的統計特征集描述這些模式。
    • 灰度共生矩陣法也稱聯合概率矩陣法。該方法基于圖像中的灰度結構重復出現的概率,對圖像紋理特征進行描述。該方法的本質是使用條件概率表征紋理特征,通過對空間上,具有某種位置關系的一對像素成對出現的概率進行統計,得到灰度共生矩陣,然后從灰度共生矩陣中提取有意義的統計特征對紋理進行描述。
    from matplotlib import pyplot as plt from skimage.feature import greycomatrix, greycoprops from skimage import data import numpy as np# 中文顯示工具函數 def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch() PATCH_SIZE = 21 image = data.camera() # 選擇圖像中的草地區域 grass_locations = [(474, 291), (440, 433), (466, 18), (462, 236)] grass_patches = [] for loc in grass_locations:grass_patches.append(image[loc[0]:loc[0] + PATCH_SIZE, loc[1]:loc[1] + PATCH_SIZE])# 選擇圖像中的天空區域 sky_locations = [(54, 48), (21, 233), (90, 380), (195, 330)] sky_patches = [] for loc in sky_locations:sky_patches.append(image[loc[0]:loc[0] + PATCH_SIZE, loc[1]:loc[1] + PATCH_SIZE]) # 計算每個塊中灰度共生矩陣屬性 xs = [] ys = [] for patch in (grass_patches + sky_patches):glcm = greycomatrix(patch, [5], [0], 256, symmetric=True, normed=True)xs.append(greycoprops(glcm, 'dissimilarity')[0, 0])ys.append(greycoprops(glcm, 'correlation')[0, 0]) # 創建繪圖 fig = plt.figure(figsize=(8, 8)) # 展現原始圖像,以及圖像塊的位置 ax = fig.add_subplot(3, 2, 1) ax.imshow(image, cmap=plt.cm.gray, interpolation='nearest', vmin=0, vmax=255) for (y, x) in grass_locations:ax.plot(x + PATCH_SIZE / 2, y + PATCH_SIZE / 2, 'gs') for (y, x) in sky_locations:ax.plot(x + PATCH_SIZE / 2, y + PATCH_SIZE, 'bs') ax.set_xlabel('原始圖像') ax.set_xticks([]) ax.set_yticks([]) ax.axis('image') # 對于每個塊,plot(dissimilarity,correlation) ax = fig.add_subplot(3, 2, 2) ax.plot(xs[:len(grass_patches)], ys[:len(grass_patches)], 'go', label='Grass') ax.plot(xs[:len(sky_patches)], ys[:len(sky_patches)], 'bo', label='Sky') ax.set_xlabel('灰度共生矩陣相似性') ax.set_ylabel('灰度共生矩陣相關度') ax.legend() # 展示圖像 for i, patch in enumerate(grass_patches):ax = fig.add_subplot(3, len(grass_patches), len(grass_patches) * 1 + i + 1)ax.imshow(patch, cmap=plt.cm.gray, interpolation='nearest', vmin=0, vmax=255)ax.set_xlabel('Grass %d' % (i + 1)) for i, patch in enumerate(sky_patches):ax = fig.add_subplot(3, len(sky_patches), len(sky_patches) * 2 + i + 1)ax.imshow(patch, cmap=plt.cm.gray, interpolation='nearest', vmin=0, vmax=255)ax.set_xlabel('Sky %d' % (i + 1)) # 展示圖像塊并顯示 fig.suptitle('Grey level co-occurrence matrix features', fontsize=14) plt.show()
    • 基于灰度共生矩陣的紋理描述方法

    5.2.2 Laws紋理能量測量法

    • Laws紋理能量測量法是一種典型的一階紋理分析方法,在紋理分析領域有一定影響。
    • Laws紋理能力測量的基本思想是創建兩個窗口:一個是微窗口,可為3×3、5×5或7×7,常取5×5測量以像元為中心的小區域的灰度的不規則性,以形成屬性,稱為微窗口濾波;另一個是宏窗口,為15×15或32×32,用來在更大的區域上求屬性的一階統計量(常為均值和標準偏差),稱為能量變換。
    • 整個紋理分析過程為:f(x,y)→微窗口濾波→F(x,y)→能量轉換→E(x,y)→分類

    5.2.3 Gabor變換

    • 大量心理和生理學研究發現,在人類的低級視覺中,輸入信號被一系列具有不同頻率和方位的線性空間濾波器分解成一組頻率和方位通道,Gabor分解可以很好的描述這一信號分解過程。
    • Gabor變換具有兩個重要的特性。一是其良好的空間域與頻域局部化性質。二是無論從空間域的起伏特性上,方位選擇特性上,空間域與頻域選擇上,還是從正交相位的關系上,二維Gabor基函數具有與大多數哺乳動物的視覺表皮簡單細胞的二維感知域模型相似的性質。
    • 可以借鑒人類處理信號的特性,用包含多個Gabor濾波器的濾波器組,對圖像進行不同中心頻率和方位的濾波處理,從而提取不同頻率成分和不同方位的特征,作為目標的非參數化特征,研究其不同分辨率目標的特征與圖像分辨率的關系。
    • Gabor濾波器濾波過程

    5.2.4 局部二值模式

    • 局部二值模式(Local Binary Pattern,LBP)的基本思想是將中心像素點的灰度值作為閾值,將其鄰域內的像素點灰度值與閾值進行比較,從而得到二進制編碼用以表述局部紋理特征。
    • LBP表示方法不易受圖像整體灰度線性變化的影響,當圖像的灰度值發生線性均勻變化時,其LBP特征編碼是不變的。
    • LBP特征計算簡單,表征能力強,在紋理特征描述上具有較好的效果。
    • 基本LBP算子:3*3的矩形塊,有一個中心像素和8個鄰域像素,分別對應9個灰度值。
    • 特征值:以中心像素的灰度值為閾值,將其鄰域的8個灰度值與閾值比較,大于中心灰度值的像素用1表示,反之用0表示。然后順時針方向讀出8個二進制值。
    • 經閾值化后的二值矩陣,可以看出一個二值紋理模式,用來刻畫鄰域內,像素點的灰度相對中心點的變化。
    • 因為人類視覺系統對紋理的感知與平均灰度(亮度無關),而局部二值模式方法注重像素灰度的變化,符合人類視覺對紋理感知的特點。
    import skimage.feature import skimage.segmentation import skimage.data import matplotlib.pyplot as plt# 中文顯示工具函數 def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch() img = skimage.data.coffee() for colour_channel in (0, 1, 2):img[:, :, colour_channel] = skimage.feature.local_binary_pattern(img[:, :, colour_channel], 8, 1.0, method='var') plt.imshow(img) plt.show()

    5.3 圖像形狀特征提取

    • 形狀和區域特征是圖像中的另一類重要特征。不同于顏色、紋理等底層特征,對形狀特征的描述必須以對圖像中的物體或區域對象的分割為前提。
    • 形狀特征的表示方法可以分為兩類:一是基于輪廓特征,典型方法是傅里葉描述符方法。二是基于區域特征,典型方法是形狀無關矩法。輪廓特征中只用到物體的邊界,而區域特征需要考慮整個形狀區域。

    5.3.1 簡單形狀特征

    • 矩形度。反應物體對外接矩形的充滿度,用物體的面積與其最小外接矩形的面積之比描述。
    • 球狀性。球狀性既可以描述二維目標,也可描述三維目標。
    • 圓形性。目標圓形性是指用目標區域R的所有邊界點定義的特征量。

    5.3.2 傅里葉描述符

    • 傅里葉描述符是用于單封閉曲線形狀特征描述的常用工具。傅里葉描述符將待描述目標曲線看組一維數值序列,使用傅里葉變換對該序列進行轉換,得到描述該曲線的一系列傅里葉系數。
    • 傅里葉描述符具有計算簡單、描述清晰等優點。相較于其他復雜的描述方法,傅里葉描述符更加直觀,易于理解。
    • 傅里葉描述方法一般分為兩步:首先,定義輪廓線的表示,把坐標的序列點看作復數,即s(k)=x(k)+jy(k),x軸作為實軸,y軸作為虛軸,邊界的性質不變。這種表示方法的優點是將一個二維邊緣描述問題,簡化為一個一維序列描述問題。其次,對一維序列s(k)進行傅里葉變換,并求得其傅里葉系數。

    5.3.3 形狀無關矩

    • 由于圖像區域的某些矩對于平移、旋轉、尺度等幾何變換具有一些不變的特性,使得矩的表示方法在物體的分類與識別方面具有重要的意義。

    5.4 圖像邊緣特征提取

    • 圖像邊緣具有方向和幅度兩個主要成分。沿邊緣方向移動,像素的灰度值變化速率較為平緩,而沿垂直于邊緣的方向移動,像素的灰度值變化率較為劇烈。這種劇烈的變化或者呈階躍狀(Step Edge),或呈屋頂狀(Proof Edge),分為稱為階躍狀邊緣和屋頂狀邊緣。根據邊緣的性質,一般用一階或二階導數對其進行描述和檢測。
    • 圖像中的邊緣可以通過對他們求導數確定,而導數可利用微分算子計算。對于數字圖像處理而言,通常利用差分近似微分。
    • 圖像邊緣檢測的基本步驟如下。
      ① 濾波
      邊緣檢測主要基于導數計算,但易受噪聲影響,濾波操作的主要目的是降低噪聲的干擾,但濾波在降低噪聲的同時,也會損失邊緣強度。
      ② 增強
      增強算法將局部鄰域中灰度值有顯著變化的點突出顯示,一般可通過計算梯度幅值完成。
      ③ 檢測
      有些圖像中梯度幅值較大的點并不是邊緣點,需要對其進行進一步篩選,最簡單的檢測方法是設定梯度幅值閾值。
      ④ 定位
      定位即精確確定邊緣的位置。
    • 傳統邊緣檢測的流程。

    5.4.1 梯度邊緣檢測

    • 梯度的方向(由梯度矢量的幅角表示)是函數f(x,y)增加最快的方向,定義為?(x,y)=arctan(Gy/Gx),從梯度原理出發,已經發展了很多邊緣檢測算子。

    5.4.2 一階邊緣檢測算子

    1 羅伯特算子

    • 羅伯特邊緣檢測算子,用對角線上相鄰像素之差代替梯度尋找邊緣。
    • 羅伯特邊緣檢測的步驟:
      (1)用兩個模板分別對圖像進行運算得到Rxf和Ryf,并計算|G(i,j)|=|Gx|+|Gy|;
      (2)判斷該相加結果是否大于某個閾值。如果滿足條件,則將其作為結果圖像中對應模板(i,j)位置的像素值;如果不滿足條件,則結合結果圖像中對應模板(i,j)位置的像素賦0值。
    import matplotlib.pyplot as plt from skimage.data import camera from skimage.filters import roberts# 中文顯示工具函數 def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch() image = camera() edge_roberts = roberts(image), fig, ax = plt.subplots(ncols=2, sharex=True, sharey=True, figsize=(8, 4)) ax[0].imshow(image, cmap='gray') ax[0].set_title('原始圖像')ax[1].imshow(edge_roberts, cmap='gray') ax[1].set_title('Roberts 邊緣檢測') for a in ax:a.axis('off') plt.tight_layout() plt.show()

    2 索貝爾算子

    • 索貝爾邊緣檢測的步驟:
      (1)用兩個模板分別對圖像進行計算,得出|G(i,j)|=Gx+Gy;
      (2)判別該相加結果是否大于或等于某個閾值,如果滿足條件,則將其作為結果圖像中對應模板(i,j)位置的像素值;如果不滿足條件,則給結果圖像中對應模板(i,j)位置的像素賦0值。
    import matplotlib.pyplot as plt from skimage.data import camera from skimage.filters import sobel, sobel_v, sobel_h# 中文顯示工具函數 def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch() image = camera() edge_sobel = sobel(image) edge_sobel_v = sobel_v(image) edge_sobel_h = sobel_h(image) fig, ax = plt.subplots(ncols=2, nrows=2, sharex=True, sharey=True, figsize=(8, 4))ax[0, 0].imshow(image, cmap=plt.cm.gray) ax[0, 0].set_title('原始圖像')ax[0, 1].imshow(edge_sobel, cmap=plt.cm.gray) ax[0, 1].set_title('Sobel 邊緣檢測')ax[1, 0].imshow(edge_sobel_v, cmap=plt.cm.gray) ax[1, 0].set_title('Sobel 垂直邊緣檢測')ax[1, 1].imshow(edge_sobel_h, cmap=plt.cm.gray) ax[1, 1].set_title('Sobel 水平邊緣檢測')for a in ax:for j in a:j.axis('off') plt.tight_layout() plt.show()

    • 索貝爾邊緣檢測算子在較好的獲得邊緣性效果的同時,對噪聲具有一定的平滑作用,減少了噪聲的敏感性。但索貝爾邊緣檢測的邊緣比較粗,會檢測出一些偽邊緣,邊緣檢測精度較低。

    3 Prewitt算子

    • Prewitt算子在方向和方向的梯度幅值上的形式,與索貝爾算子的形式完全相同,只是系數均為1,對應的3*3模板為

    • Prewitt算子的計算比索貝爾算子更簡單,但在噪聲抑制方面,索貝爾算子比Prewitt算子略勝一籌。

    • 梯度算子對噪聲有一定的敏感性,所以適用于圖像邊緣灰度值比較尖銳,且圖像中噪聲比較小的情況

    5.4.3 二階邊緣檢測算子

    • 在利用一階導數的邊緣檢測算子進行邊緣檢測時,有時會出現因檢測到的邊緣點過多,而導致邊緣線過粗的情況。
    • 通過去除一階導數中的非局部最大值,就可以檢測出更細的邊緣,而一階導數的局部最大值對應二階導數的零交叉點。所以,通過找圖像的二階導數的零交叉點,就能找到精確的邊緣點。

    1 拉普拉斯(Laplace)算子

    • 對階躍狀邊緣,其二階導數在邊緣點出現過零交叉,即邊緣點兩旁的二階導數取異號,據此可通過二階導數檢測邊緣點。
    • Laplace算子的邊緣檢測
    import matplotlib.pyplot as plt from skimage.data import camera, coffee from skimage.filters import laplace# 中文顯示工具函數 def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch() image_camera = camera() edge_laplace_camera = laplace(image_camera) image_coffee = coffee() edge_laplace_coffee = laplace(image_coffee) fig, ax = plt.subplots(ncols=2, nrows=2, sharex=True, sharey=True, figsize=(8, 6))ax[0, 0].imshow(image_camera, cmap=plt.cm.gray) ax[0, 0].set_title('原始圖像')ax[0, 1].imshow(edge_laplace_camera, cmap=plt.cm.gray) ax[0, 1].set_title('Laplace 邊緣檢測')ax[1, 0].imshow(image_coffee, cmap=plt.cm.gray) ax[1, 0].set_title('原始圖像')ax[1, 1].imshow(edge_laplace_coffee, cmap=plt.cm.gray) ax[1, 1].set_title('Laplace 邊緣檢測')for a in ax:for j in a:j.axis('off') plt.tight_layout() plt.show()
    • 邊緣檢測算子模板的基本特征是中心位置的系數為正,其余位置的系數為負,且模板的系數之和為0.
    • 它的使用方法是用圖中的兩個點陣之一作為卷積核,與原圖像進行卷積運算即可。
    • Lapace檢測模板的特點是各向同性,對孤立點及線端的檢測效果好,Laplace算子的缺點是會出現邊緣方向信息丟失,對噪聲敏感,整體檢測效果不如梯度算子,且與索貝爾算子相比,對圖像進行處理時,Laplace算子能使噪聲成分得到加強,對噪聲更敏感。

    2 LoG邊緣檢測算子

    • 實際應用中,由于噪聲的影響,對噪聲敏感的邊緣檢測點檢測算法(如拉普拉斯算子法)可能會把噪聲當邊緣檢測點檢測出來,而真正的邊緣點會被噪聲淹沒而未檢測出。
    • LoG算子基于Laplace算子和Gauss算子,也稱拉普拉斯-高斯邊緣檢測算子。
    • 由于平滑會導致邊緣的延展,因此在邊緣檢測時,僅考慮那些具有局部最大值的點為邊緣點。
    import matplotlib.pyplot as plt from skimage.data import camera, coffee from skimage.filters import laplace, gaussian# 中文顯示工具函數 def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch() image = camera() edge_laplace = laplace(image) gaussian_image = gaussian(image) edge_LoG = laplace(gaussian_image)fig, ax = plt.subplots(ncols=2, nrows=2, sharex=True, sharey=True, figsize=(8, 6))ax[0, 0].imshow(image, cmap=plt.cm.gray) ax[0, 0].set_title('原始圖像')ax[0, 1].imshow(edge_laplace, cmap=plt.cm.gray) ax[0, 1].set_title('Laplace 邊緣檢測')ax[1, 0].imshow(gaussian_image, cmap=plt.cm.gray) ax[1, 0].set_title('高斯平滑后的圖像')ax[1, 1].imshow(edge_LoG, cmap=plt.cm.gray) ax[1, 1].set_title('LoG 邊緣檢測')for a in ax:for j in a:j.axis('off') plt.tight_layout() plt.show()
    • 基于LoG的邊緣檢測效果

    5.5 圖像點特征提取

    • 如果圖像中一個非常小的區域的灰度值,與其鄰域值相比有明顯的差異,則稱這個非常小的區域為圖像點(一般意義上的孤立像素點)

    • 目前對圖像點特征提取的技術有多種,其中研究最多、應用最廣的是角點檢測算法。

    • 從直觀可視的角度出發,兩條直線相交的頂點可看作是角點;物體的幾個平面的相交處也可以看作角點。從圖像特征的角度出發,圖像中周圍灰度變化較劇烈的點可看作是角點;圖像邊界上曲率足夠高的點也可以看作是角點。

    • 常見的角點類型。

    • 角點的檢測方法有很多種,其檢測原理也多種多樣,但這些方法概括起來大體可分為3類:一是基于模板的角點檢測算法;二是基于邊緣的角點檢測算法;三是基于圖像灰度變化的角點檢測算法。其中,基于圖像灰度變化的角點檢測算法應用最廣泛。

    • SUSAN角點檢測算法選用圓形模板,將位于圓形窗口模板中心等待檢測的像素點稱為核心點。核心點的鄰域被劃分為兩個區域:亮度值相似于核心點亮度的區域即核值相似區和亮度值不相似于核心點亮度的區域。

    • SUSAN算法通過核值相似區的大小判別圖像角點,并實現圖像中角點特征的檢測和提取。

    • SUSAN算子實現代碼

    import matplotlib.pyplot as plt from skimage.data import camera import numpy as np# 中文顯示工具函數 def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falsedef susan_mask():mask = np.ones((7, 7))mask[0, 0] = 0mask[0, 1] = 0mask[0, 5] = 0mask[0, 6] = 0mask[1, 0] = 0mask[1, 6] = 0mask[5, 0] = 0mask[5, 6] = 0mask[6, 0] = 0mask[6, 1] = 0mask[6, 5] = 0mask[6, 6] = 0return maskdef susan_corner_detection(img):img = img.astype(np.float64)g = 37 / 2circularMask = susan_mask()output = np.zeros(img.shape)for i in range(3, img.shape[0] - 3):for j in range(3, img.shape[1] - 3):ir = np.array(img[i - 3:i + 4, j - 3:j + 4])ir = ir[circularMask == 1]ir0 = img[i, j]a = np.sum(np.exp(-((ir - ir0) / 10) ** 6))if a <= g:a = g - aelse:a = 0output[i, j] = areturn outputset_ch() image = camera() out = susan_corner_detection(image) plt.imshow(out, cmap='gray') plt.show()
    • 基于SUSAN算子的角點檢測響應圖像

    5.6 小結

    • 本章首先對圖像特征提取進行了簡單介紹,其次主要介紹了全局特征提取技術,如顏色、紋理、形狀特征提取,最后對局部特征提取技術(如邊緣檢測、角點檢測)進行了簡單介紹。

    參考資料

  • 岳亞偉《數字圖像處理與Python實現》人民郵電出版社
  • 總結

    以上是生活随笔為你收集整理的数字图像处理与Python实现笔记之图像特征提取的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。