梯度直方圖:一種簡單但強大的圖像處理技術

一、梯度直方圖是什麼?

梯度直方圖是一種簡單但強大的圖像處理技術,常用於計算機視覺、機器學習、圖像處理等領域。梯度直方圖可以對圖像進行精細的特徵表示,從而能夠幫助我們更好地理解和處理圖像。

通俗地說,梯度直方圖就是將一張圖像的梯度信息(也就是像素亮度的變化情況)匯總為一個直方圖,從而反映了圖像中梯度信息的分布情況。這個分布信息可以幫助我們更好地理解圖像中的邊緣、紋理、形狀等特徵。

// 以下是基於OpenCV庫實現計算梯度直方圖的代碼示例
// 假設我們已經讀入了一張圖像img

// 1. 計算X方向和Y方向的梯度
Mat gradX, gradY;
Mat absGradX, absGradY;
int ddepth = CV_16S;
int scale = 1;
int delta = 0;
Sobel(img, gradX, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT);
convertScaleAbs(gradX, absGradX);
Sobel(img, gradY, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT);
convertScaleAbs(gradY, absGradY);

// 2. 合併X和Y方向的梯度
Mat grad;
addWeighted(absGradX, 0.5, absGradY, 0.5, 0, grad);

// 3. 計算直方圖
int histSize[] = {256};
float range[] = {0, 256};
const float *histRange[] = {range};
Mat hist;
calcHist(&grad, 1, 0, Mat(), hist, 1, histSize, histRange);

二、梯度直方圖的應用

梯度直方圖廣泛應用於計算機視覺、機器學習、圖像處理等領域。下面我們將從三個方面介紹梯度直方圖的應用:

1. 特徵提取

作為一種精細的特徵表示方式,梯度直方圖被廣泛應用於目標識別、圖像檢索等任務中。我們可以將每張圖像的梯度直方圖作為圖像的特徵向量,從而能夠實現更精確的圖像分類和檢索。

// 以下是基於Scikit-image庫實現提取梯度直方圖特徵的代碼示例
// 假設我們已經讀入了一張圖像img

// 1. 計算梯度
from skimage.filters import sobel_h, sobel_v
grad_x = sobel_h(img)
grad_y = sobel_v(img)
grad_abs = np.abs(grad_x) + np.abs(grad_y)

// 2. 計算直方圖特徵
from skimage.feature import hog
hist, _ = hog(grad_abs, orientations=8, pixels_per_cell=(16, 16),
              cells_per_block=(1, 1), visualize=True, multichannel=False)

2. 目標檢測

梯度直方圖可以幫助我們識別圖像中的物體邊緣和紋理信息,從而能夠用於目標定位和檢測。一般來說,我們可以通過計算圖像的梯度直方圖,並使用滑動窗口的方法在圖像中尋找梯度直方圖匹配度最高的區域,從而實現目標的精確定位。

// 以下是基於OpenCV庫實現目標檢測的代碼示例
// 假設我們已經讀入了一張圖像img和一個模板template

// 1. 計算圖像和模板的梯度直方圖
Mat hist_img, hist_temp;
calcHist(&img, 1, 0, Mat(), hist_img, 1, histSize, histRange);
calcHist(&temp, 1, 0, Mat(), hist_temp, 1, histSize, histRange);

// 2. 計算梯度直方圖相似度,並找到最佳匹配
double match_val = compareHist(hist_img, hist_temp, CV_COMP_CORREL);
Point match_loc;
minMaxLoc(match_val, NULL, NULL, NULL, &match_loc);

// 3. 在圖像中繪製匹配結果
rectangle(img, match_loc, Point(match_loc.x + temp.cols, match_loc.y + temp.rows), Scalar(0, 0, 255), 2);
imshow("Matching result", img);
waitKey(0);

3. 圖像增強

梯度直方圖還可以用於圖像增強。通過增強圖像中梯度信息的明暗對比度,我們可以使得圖像變得更加清晰、鮮明。

// 以下是基於OpenCV庫實現圖像增強的代碼示例
// 假設我們已經讀入了一張圖像img

// 1. 計算梯度
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y;
int ddepth = CV_16S;
int ksize = 3;
Sobel(img, grad_x, ddepth, 1, 0, ksize, BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
Sobel(img, grad_y, ddepth, 0, 1, ksize, BORDER_DEFAULT);
convertScaleAbs(grad_y, abs_grad_y);
Mat grad_mag = (abs_grad_x + abs_grad_y) / 2;

// 2. 計算梯度直方圖
int hist_size = 256;
float range[] = {0, 256};
const float* histRange = {range};
Mat hist;
calcHist(&grad_mag, 1, 0, Mat(), hist, 1, &hist_size, &histRange);

// 3. 增強圖像
Mat lut(1, 256, CV_8UC1);
for (int i=0; i<256; i++) {
    lut.at(i) = saturate_cast(i * pow(hist.at(i), 0.5));
}
Mat enhanced_img;
LUT(img, lut, enhanced_img);
imshow("Enhanced image", enhanced_img);
waitKey(0);

三、總結

梯度直方圖是一種簡單但強大的圖像處理技術,廣泛應用於計算機視覺、機器學習、圖像處理等領域。它可以幫助我們從多個角度理解和處理圖像,包括特徵提取、目標檢測、圖像增強等應用。我們可以使用各種圖像處理庫(如OpenCV、Scikit-image等)實現梯度直方圖相關的計算和應用,從而實現各種圖像處理任務。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/270717.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-16 13:38
下一篇 2024-12-16 13:38

相關推薦

  • 直方圖均衡Python

    對於圖像處理,直方圖均衡是一種很常用的圖像增強技術,可以將一幅圖像中灰度較低的區域和灰度較高的區域之間的灰度值差異增強,達到提高圖像對比度的目的。Python中也有相關庫函數可以實…

    編程 2025-04-29
  • Python最強大的製圖庫——Matplotlib

    Matplotlib是Python中最強大的數據可視化工具之一,它提供了海量的製圖、繪圖、繪製動畫的功能,通過它可以輕鬆地展示數據的分布、比較和趨勢。下面將從多個方面對Matplo…

    編程 2025-04-29
  • Python range: 強大的迭代器函數

    Python range函數是Python中最常用的內置函數之一。它被廣泛用於for循環的迭代,列表推導式,和其他需要生成一系列數字的應用程序中。在本文中,我們將會詳細介紹Pyth…

    編程 2025-04-29
  • 使用boofcv進行圖像處理和機器視覺

    本文將詳細介紹使用boofcv進行圖像處理和機器視覺的方法和實踐。首先,我們將介紹boofcv的概述和安裝方法,然後分別介紹它的圖像處理、相機校準和機器學習功能。 一、概述和安裝 …

    編程 2025-04-28
  • 預處理共軛梯度法

    預處理共軛梯度法是一種求解線性方程組的迭代方法,相比直接求解,其具有更高的效率和更快的速度。本文將從幾個方面對預處理共軛梯度法進行詳細的闡述,並給出完整的代碼示例。 一、預處理共軛…

    編程 2025-04-28
  • LuaEP:一款強大的Lua開發框架

    LuaEP是一個集成了可以快速開發web應用程序所需的組件的Lua開發框架。它以Lua語言為基礎,提供了許多常用接口和庫,使得開發者不需要從頭開始編寫web應用程序,而是專註於業務…

    編程 2025-04-28
  • Python邏輯回歸梯度下降法

    本文將通過Python邏輯回歸梯度下降法,對於邏輯回歸的原理、實現方法和應用進行詳細闡述。 一、邏輯回歸原理 邏輯回歸是一種常用的分類算法,其原理可以用線性回歸模型來描述,將線性回…

    編程 2025-04-27
  • 高德拾取——地圖API中的強大工具

    一、高德拾取介紹 高德拾取是高德地圖API中的一項重要工具,它可以幫助開發者在地圖上快速選擇經緯度點,並提供多種方式來獲取這些點的信息,例如批量獲取坐標的地理位置、測量兩個或多個點…

    編程 2025-04-25
  • Matlab局部放大——圖像處理的神器

    一、什麼是Matlab局部放大? Matlab是一個高級技術計算語言和交互式環境,常被用來進行科學計算和工程設計等領域的計算和可視化操作。局部放大指對一張圖像或視頻中感興趣的區域進…

    編程 2025-04-25
  • Python直方圖代碼詳解

    一、直方圖的作用 直方圖是數據可視化中的重要工具。它可以將數據按照一定的區間分組,統計每個區間中數據的數量,再以柱狀圖的形式展現出來。通過直方圖,我們可以直觀地看到數據的分布情況,…

    編程 2025-04-25

發表回復

登錄後才能評論