[OpenCV][Python]使用 LBP(Local Binary Patterns)進行紋理分析和瑕疵檢測

閱讀時間約 9 分鐘

使用 LBP(Local Binary Patterns) 進行紋理分析和瑕疵檢測

Local Binary Patterns(LBP) 是一種用來描述圖像紋理的特徵提取技術。LBP 對於檢測表面紋理的異常具有很好的效果,尤其在檢測紋理一致的材料表面(例如紡織品、紙張、金屬)時,LBP 非常有用。LBP 的優勢在於它的計算效率高,並且對光照變化不敏感。

實驗圖

raw-image


結果圖

raw-image

1. LBP 的基本概念

LBP 是基於局部像素的灰度值來描述紋理的,通過比較中心像素與其鄰域像素的大小關係,將鄰域像素的比較結果轉換為二進制數,並將這些二進制數轉換成一個整數值來表徵該像素的紋理。


運算的步驟可以參考這篇 我覺得在網路看到解釋得很清楚的文章

LBP 運算的步驟:

  • Step 1:對每個像素選擇一個 P 個鄰域像素,形成一個環(通常是 8 個像素),半徑為 R
  • Step 2:比較每個鄰域像素與中心像素的灰度值,如果鄰域像素的灰度值大於或等於中心像素,記為 1,否則記為 0。
  • Step 3:將這些二進制結果組成一個 8 位的二進制數,並將這個二進制數轉換為十進制數,這就是 LBP 值。
  • Step 4:用該 LBP 值替換原來的中心像素,得到一張新的 LBP 紋理圖。




2. LBP 適用場景

  • 紋理分析:LBP 被廣泛用於紋理分析和分類,尤其在表面檢測中,LBP 能夠有效檢測到紋理的細微變化。
  • 瑕疵檢測:當表面的紋理一致性很高時(例如布料、紙張),LBP 能檢測到表面不規則的紋理變化,如異常的斑點或凹凸不平的瑕疵。
  • 人臉識別:LBP 也被應用於人臉識別系統,通過提取人臉的紋理特徵進行分類。


3. LBP 的優勢

  • 簡單高效:LBP 的計算過程相對簡單,對於實時應用來說是高效的。
  • 光照不變性:LBP 對光照變化具有較好的穩健性,因為它主要基於像素之間的比較,而不是絕對灰度值。

函式說明

local_binary_pattern(image, n_points, radius, method='uniform') 中的參數,這裡是每個參數的詳細說明:

  • n_points 決定參與比較的鄰域像素數。
  • radius 決定鄰域的範圍。
  • method 選擇 LBP 模式,其中 uniform 模式減少了特徵數量,適合大多數應用。
  1. image
    這是要應用 LBP 的輸入圖像,通常是灰度圖像(2D numpy 陣列)。LBP 是基於圖像中的像素進行紋理特徵提取的,因此需要輸入灰度圖像。
  2. n_points
    鄰域像素的數量,定義了 LBP 運算時,與中心像素比較的像素數量。它的典型設置是 8 * radius,即圍繞中心像素的 n_points 個鄰域點會參與比較。增加這個數量可以使 LBP 更加敏感於大範圍的紋理變化。
  3. radius
    定義鄰域範圍的半徑,這是從中心像素到鄰域像素的距離。較大的半徑可以捕捉更大範圍的紋理變化,而較小的半徑則專注於更細小的紋理。常用的值包括 1, 2, 3 等。
  4. method='uniform'
    LBP 的模式選擇,'uniform' 表示使用統一模式(Uniform Pattern)。統一模式是指當 LBP 模式中的 0 和 1 之間的轉換次數不超過兩次時,該模式被稱為「統一」。統一模式能夠減少 LBP 特徵的數量,提高特徵的可分性和計算效率。其他可選模式包括:
    • 'default':標準的 LBP 模式,沒有特別的模式簡化。
    • 'ror':旋轉不變的 LBP 模式,對於旋轉的紋理,該模式能夠提供不變性。
    • 'var':變異模式,使用方差來衡量紋理的變化。

4. LBP 的實現與應用

skimage 庫來計算 LBP,並展示如何用 LBP 來檢測瑕疵。

import cv2
import numpy as np
from skimage.feature import local_binary_pattern
import matplotlib.pyplot as plt

# LBP 參數
radius = 2 # 增大半徑以擴展感知範圍
n_points = 8 * radius # 鄰域像素的數量

# 讀取灰度圖像
image_path = 'F:/python/crab/LBP/1111.png' # 替換成你的圖像路徑
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

# 使用高斯濾波來平滑背景紋理
image_smooth = cv2.GaussianBlur(image, (5, 5), 0)

# 計算 LBP 特徵,使用統一模式
lbp = local_binary_pattern(image_smooth, n_points, radius, method='uniform')

# 調整 LBP 的閾值
_, lbp_binary = cv2.threshold(lbp, 0.4 * lbp.max(), 255, cv2.THRESH_BINARY)

# 使用形態學操作清除噪點
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (15, 15))
lbp_clean = cv2.morphologyEx(lbp_binary, cv2.MORPH_OPEN, kernel)

# 畫出輪廓到原始圖像
output_image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR) # 將灰度圖轉換為彩色以顯示輪廓
# 檢測瑕疵區域的輪廓
contours, _ = cv2.findContours(lbp_clean.astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 設置最小面積閾值(根據你的需求調整)
min_area = 1000
# 遍歷所有輪廓
for contour in contours:
area = cv2.contourArea(contour)
if area > min_area: # 如果輪廓面積大於閾值
# 計算輪廓的外接矩形
x, y, w, h = cv2.boundingRect(contour)
# 畫出矩形框
cv2.rectangle(output_image, (x, y), (x + w, y + h), (0, 255, 0), 2)

# 顯示結果
titles = ['Original Image', 'lbp', 'Binary LBP', 'Output with Contours and Rectangles']
images = [image, lbp, lbp_binary, output_image]

plt.figure(figsize=(10, 10)) # 調整窗口大小
for i in range(4):
plt.subplot(2, 2, i + 1)
if i == 3: # 最後一個是彩色圖像
plt.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB))
else:
plt.imshow(images[i], cmap='gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])

plt.show()

因應不同狀況可調整的部分

  • LBP 半徑 (radius) 和鄰域像素 (n_points):決定紋理感知範圍。
  • 高斯濾波核大小:決定背景平滑效果。
  • 二值化閾值:影響異常區域的檢測範圍。
  • 形態學結構元素:決定去噪效果及瑕疵形狀的處理。
  • 最小面積閾值:影響檢測瑕疵的最小大小。
  • 矩形框的顏色和厚度:影響可視化的顯示效果。








120會員
201內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
這個故事的開端是由,來越南出差第一次到河內玩時,只記得要注意小偷,沒想到也要注意路邊的擦鞋匠,一開始還以為向國外那樣學生假日打工擦鞋賺零用錢,沒想到卻是獅子大開口。但也不會因為這個小插曲而打壞的出遊的好心情,只是覺得很有趣。 後來同事才轉貼文章給我看網路上類似的故事,要大家多加小心留意。 故事的
0/5越南河內老城區
在一個典型的程式專案中,UI、Controller 和 Main 的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。 大部分典型的程式專案設計: UI (View):專注於用戶界面,展示數據,並將用
subprocess.run() 是 Python 3.5 之後引入的一個簡單且強大的函數,用來執行系統命令並等待命令完成。它是 subprocess 模組的高階 API,封裝了低階的 Popen(),提供了更簡便的方式來執行命令、捕獲輸出、處理錯誤等操作。
在有次使用cv2.resize時忽然報錯,就心血來潮不想重新安裝OpenCV,根據缺少的東西想辦法補齊。 在影像處理中,Zlib(以及 zlibwapi.dll)主要用於處理數據壓縮和解壓縮,特別是在處理大型影像文件時。 遺失原因 應用程序安裝過程中未能完整安裝所有所需的依賴項,尤其是 zli
在上一篇文章,使用CUDA加速運行OpenCV發現一個異常,抽絲剝繭找到原因了。 [Python]在 OpenCV 中啟用 CUDA 加速來運行 DNN 超分辨率模型 錯誤描述: Could not locate cublas64_11.dll. Please make sure it i
本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。 在CMake上這選項要開,才可支援DNN模組。 CMake編譯OpenCV教學文 連結 [OpenCV][Py
這個故事的開端是由,來越南出差第一次到河內玩時,只記得要注意小偷,沒想到也要注意路邊的擦鞋匠,一開始還以為向國外那樣學生假日打工擦鞋賺零用錢,沒想到卻是獅子大開口。但也不會因為這個小插曲而打壞的出遊的好心情,只是覺得很有趣。 後來同事才轉貼文章給我看網路上類似的故事,要大家多加小心留意。 故事的
0/5越南河內老城區
在一個典型的程式專案中,UI、Controller 和 Main 的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。 大部分典型的程式專案設計: UI (View):專注於用戶界面,展示數據,並將用
subprocess.run() 是 Python 3.5 之後引入的一個簡單且強大的函數,用來執行系統命令並等待命令完成。它是 subprocess 模組的高階 API,封裝了低階的 Popen(),提供了更簡便的方式來執行命令、捕獲輸出、處理錯誤等操作。
在有次使用cv2.resize時忽然報錯,就心血來潮不想重新安裝OpenCV,根據缺少的東西想辦法補齊。 在影像處理中,Zlib(以及 zlibwapi.dll)主要用於處理數據壓縮和解壓縮,特別是在處理大型影像文件時。 遺失原因 應用程序安裝過程中未能完整安裝所有所需的依賴項,尤其是 zli
在上一篇文章,使用CUDA加速運行OpenCV發現一個異常,抽絲剝繭找到原因了。 [Python]在 OpenCV 中啟用 CUDA 加速來運行 DNN 超分辨率模型 錯誤描述: Could not locate cublas64_11.dll. Please make sure it i
本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。 在CMake上這選項要開,才可支援DNN模組。 CMake編譯OpenCV教學文 連結 [OpenCV][Py
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
在某些特殊情況下,需要將圖片進行黑白反轉,例如Tesseract(OCR辨識引擎)就有建議黑底白字的狀況下辨識率較高。 本文將使用 NumPy 進行影像黑白反轉,並顯示反轉前後的影像。
Thumbnail
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
Thumbnail
此篇為上一篇文章的延伸,先辦別是螺絲還是螺母才擷取出影像。 [OpenCV應用][Python]利用findContours辨識螺絲還是螺母 因為可能會需要另外處理螺絲與螺母才可以準確地去做量測,所以第一步就是先分割出這兩種的圖像。
Thumbnail
先上成果圖,如果是螺母的話就標註 is circle來區分。 簡單的用圖表加文字說明AOI辨識 在此文章的範例中: 影像前處理:色彩空間轉換(灰階) -> 二值化閥值處理 演算法:尋找輪廓 數值判斷:長,寬,面積,周長 圖片來源 程式碼 import cv2 import nu
Thumbnail
色差檢測在許多應用中非常重要,如印刷、織物、塗料等。色差的測量通常使用 CIEDE2000 色差公式來計算兩個顏色之間的差異。 本文將檢測以下織物圖,分析出兩者的色差 程式範例 流程: 先利用K-Means分群的方式,分割出主要顏色,在用delta_e_cie2000來檢測色差 主要安裝
Thumbnail
形態學操作在影像處理中有多種應用,特別是在處理二值化影像(黑白影像)。 在影像處理應用上,基本上都由侵蝕,膨脹這兩種方法,組合搭配而成。 常見應用場景 物體檢測與分割: 形態學操作可以用於增強或改善二值化影像中的物體邊界,使得物體的檢測和分割更加準確。
Thumbnail
本文介紹OpenCV中的SimpleBlobDetector用於檢測斑點或圓,以及其與霍夫轉換找圓方法的差異。透過程式範例和解析,講解檢測到的關鍵點和設定參數,並整理SimpleBlobDetector與霍夫轉換的不同。最後,探討不同的應用場景和參數調整。
Thumbnail
本文將利用OpenCV的findContours函式,從找到的輪廓中來計算物件的面積,周長,邊界框等屬性,從而得到物體的寬度與高度。 一般來說,我們在進行輪廓檢測時,會先進行圖像二值化,將對象轉換為白色,背景為黑色。這樣,在找到輪廓後,輪廓的點就會以白色表示,背景為黑色。 結果圖 從圖中綠色框
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
在某些特殊情況下,需要將圖片進行黑白反轉,例如Tesseract(OCR辨識引擎)就有建議黑底白字的狀況下辨識率較高。 本文將使用 NumPy 進行影像黑白反轉,並顯示反轉前後的影像。
Thumbnail
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
Thumbnail
此篇為上一篇文章的延伸,先辦別是螺絲還是螺母才擷取出影像。 [OpenCV應用][Python]利用findContours辨識螺絲還是螺母 因為可能會需要另外處理螺絲與螺母才可以準確地去做量測,所以第一步就是先分割出這兩種的圖像。
Thumbnail
先上成果圖,如果是螺母的話就標註 is circle來區分。 簡單的用圖表加文字說明AOI辨識 在此文章的範例中: 影像前處理:色彩空間轉換(灰階) -> 二值化閥值處理 演算法:尋找輪廓 數值判斷:長,寬,面積,周長 圖片來源 程式碼 import cv2 import nu
Thumbnail
色差檢測在許多應用中非常重要,如印刷、織物、塗料等。色差的測量通常使用 CIEDE2000 色差公式來計算兩個顏色之間的差異。 本文將檢測以下織物圖,分析出兩者的色差 程式範例 流程: 先利用K-Means分群的方式,分割出主要顏色,在用delta_e_cie2000來檢測色差 主要安裝
Thumbnail
形態學操作在影像處理中有多種應用,特別是在處理二值化影像(黑白影像)。 在影像處理應用上,基本上都由侵蝕,膨脹這兩種方法,組合搭配而成。 常見應用場景 物體檢測與分割: 形態學操作可以用於增強或改善二值化影像中的物體邊界,使得物體的檢測和分割更加準確。
Thumbnail
本文介紹OpenCV中的SimpleBlobDetector用於檢測斑點或圓,以及其與霍夫轉換找圓方法的差異。透過程式範例和解析,講解檢測到的關鍵點和設定參數,並整理SimpleBlobDetector與霍夫轉換的不同。最後,探討不同的應用場景和參數調整。
Thumbnail
本文將利用OpenCV的findContours函式,從找到的輪廓中來計算物件的面積,周長,邊界框等屬性,從而得到物體的寬度與高度。 一般來說,我們在進行輪廓檢測時,會先進行圖像二值化,將對象轉換為白色,背景為黑色。這樣,在找到輪廓後,輪廓的點就會以白色表示,背景為黑色。 結果圖 從圖中綠色框