詳解 OpenCV 形態學操作:從基礎到實戰(腐蝕、膨脹、開運算、閉運算、梯度、頂帽與黑帽)

在數字圖像處理領域,形態學操作是一套基于圖像形狀的非線性處理方法,核心是通過結構元素(Kernel)?與圖像進行交互,實現對圖像輪廓、細節的調整與提取。OpenCV 作為主流的計算機視覺庫,提供了豐富的形態學操作 API,本文將從原理到代碼實戰,詳細講解 7 種核心形態學操作(腐蝕、膨脹、開運算、閉運算、梯度運算、頂帽、黑帽),幫助你快速掌握并應用于實際項目。

一、形態學操作基礎:結構元素(Kernel)

在開始所有操作前,必須先理解結構元素(Kernel)?的概念 —— 它是形態學操作的 “工具”,本質是一個指定大小的矩陣(通常為奇數,如 3×3、5×5),矩陣元素值通常為 1(表示參與運算的區域)。

結構元素的大小和形狀直接影響操作效果:

  • 大小:3×3 適用于精細處理,5×5 及以上適用于更顯著的形態改變;
  • 形狀:除了代碼中常用的 “矩形(np.ones ())”,還有圓形、十字形等(可通過cv2.getStructuringElement()生成,例如cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))生成 5×5 圓形結構元素)。

代碼中生成 3×3 矩形結構元素的方式:

import numpy as np
kernel = np.ones((3, 3), np.uint8)  # 數據類型必須為uint8(無符號8位整數,符合圖像像素0-255的范圍)

二、核心形態學操作實戰

以下所有操作均基于 OpenCV-Python 實現,需提前安裝依賴(pip install opencv-python numpy)。每個操作將從 “原理”“作用”“代碼”“效果分析” 四部分展開,確保你知其然也知其所以然。

1. 圖像腐蝕(Erosion):“收縮” 前景目標

原理

腐蝕是最基礎的形態學操作之一,核心邏輯是 **“結構元素滑動遍歷圖像,僅當結構元素完全覆蓋前景區域(通常為白色像素)時,中心像素才保留為前景,否則變為背景(通常為黑色像素)”**。可以形象理解為 “用結構元素‘啃食’前景的邊緣,讓前景區域逐漸縮小”。

作用
  • 消除圖像中的細小噪聲(噪聲多為孤立的小前景像素,會被結構元素直接 “啃掉”);
  • 縮小前景目標尺寸,斷開相鄰目標間的細小連接;
  • 突出前景目標中的孔洞(孔洞周圍的前景被腐蝕后,孔洞會更明顯)。
OpenCV API 參數
cv2.erode(src, kernel, dst=None, anchor=None, iterations=1, borderType=None, borderValue=None)

關鍵參數解析:

  • src:輸入圖像(推薦灰度圖或二值圖,彩色圖會對 RGB 三個通道分別處理,可能導致顏色偏差);
  • kernel:結構元素(決定腐蝕的 “工具大小”);
  • iterations:腐蝕迭代次數(默認 1,次數越多,腐蝕越徹底,前景縮小越明顯);
  • anchor:結構元素的錨點(默認是中心,一般無需修改)。
實戰代碼
import cv2
import numpy as np# 1. 讀取圖像(以love.jpg為例,建議使用前景清晰的圖像)
sun = cv2.imread('love.jpg')
if sun is None:  # 避免圖像路徑錯誤導致程序崩潰print("圖像讀取失敗,請檢查文件路徑是否正確!")
else:# 2. 顯示原始圖像cv2.imshow('Original Image', sun)cv2.waitKey(0)  # 等待按鍵,按任意鍵繼續(0表示無限等待)# 3. 定義結構元素(5×5矩形,比3×3腐蝕效果更顯著)kernel = np.ones((5, 5), np.uint8)# 4. 執行腐蝕操作(迭代5次,強化腐蝕效果)erosion_result = cv2.erode(sun, kernel, iterations=5)# 5. 顯示腐蝕結果cv2.imshow('Erosion (5x5 Kernel, 5 Iterations)', erosion_result)cv2.waitKey(0)# 6. 釋放窗口資源(避免內存泄漏)cv2.destroyAllWindows()
效果分析
  • 原始圖像中的細線條(如文字邊緣、圖案紋理)會變細甚至斷裂—— 因為邊緣像素被結構元素 “啃食”;
  • 若將iterations從 1 改為 5,前景目標會持續縮小,小的細節(如愛心圖案的尖角)可能完全消失;
  • 若將kernel從 5×5 改為 3×3,腐蝕效果會減弱,前景縮小幅度更平緩。

2. 圖像膨脹(Dilation):“擴大” 前景目標

原理

膨脹與腐蝕是 “相反操作”,核心邏輯是 **“結構元素滑動遍歷圖像,只要結構元素與前景區域有任意一點重疊,中心像素就保留為前景”**。可以理解為 “用結構元素‘擴張’前景的邊緣,讓前景區域逐漸擴大”。

作用
  • 填補前景目標中的細小孔洞(孔洞邊緣的前景被擴張后,會逐漸覆蓋孔洞);
  • 連接相鄰的細小前景區域(原本斷開的前景,擴張后會拼接在一起);
  • 增強前景目標的輪廓(但會導致邊緣模糊,因為擴張會 “拉寬” 邊緣)。
OpenCV API 參數
cv2.dilate(src, kernel, dst=None, anchor=None, iterations=1, borderType=None, borderValue=None)

參數與cv2.erode()完全一致,核心差異是操作邏輯相反(一個收縮,一個擴張)。

實戰代碼
import cv2
import numpy as np# 1. 讀取圖像(以文字圖像wenzi.png為例,文字易受膨脹影響)
wenzi = cv2.imread('wenzi.png')
if wenzi is None:print("圖像讀取失敗,請檢查文件路徑!")
else:# 2. 顯示原始圖像cv2.imshow('Original Text Image', wenzi)cv2.waitKey(0)# 3. 定義結構元素(3×3矩形,適合精細膨脹)kernel = np.ones((3, 3), np.uint8)# 4. 執行膨脹操作(迭代2次,避免文字過度粘連)dilate_result = cv2.dilate(wenzi, kernel, iterations=2)# 5. 顯示膨脹結果cv2.imshow('Dilation (3x3 Kernel, 2 Iterations)', dilate_result)cv2.waitKey(0)# 6. 釋放窗口cv2.destroyAllWindows()
效果分析
  • 文字圖像經過膨脹后,文字會變粗—— 文字邊緣的像素被結構元素 “擴張”;
  • iterations改為 10,文字會嚴重粘連,單個字符無法區分(如 “你好” 可能變成一個黑色塊);
  • 若輸入圖像是二值圖(黑底白字),膨脹后文字的 “鋸齒邊緣” 會更明顯,因為擴張會放大邊緣的不規則性。

3. 開運算(Opening):先腐蝕后膨脹,消除 “小亮點”

原理

開運算 =?腐蝕操作 + 膨脹操作(先對原始圖像做腐蝕,再對腐蝕結果做膨脹)。
核心邏輯:先用腐蝕 “去掉” 小的前景噪聲(小亮點),再用膨脹 “恢復” 前景目標的原始大小(因為腐蝕縮小的前景,膨脹可以補回來,但被腐蝕掉的噪聲無法恢復)。

作用
  • 平滑前景目標的輪廓(消除細小的突出物,如 “毛刺”);
  • 斷開前景目標間的細小連接(如兩個相鄰的圓形,中間有細線條連接,開運算會斷開線條);
  • 消除圖像中的 “小亮點” 噪聲(前景噪聲),且不改變大前景目標的形狀和大小。
OpenCV API 參數

OpenCV 提供統一的形態學運算函數cv2.morphologyEx(),通過op參數指定操作類型:

cv2.morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=1, borderType=None, borderValue=None)
  • op=cv2.MORPH_OPEN:指定為開運算;
  • 其他參數與cv2.erode()一致,iterations表示 “腐蝕 + 膨脹” 的總次數(默認 1,即 1 次腐蝕 + 1 次膨脹)。
實戰代碼
import cv2
import numpy as np# 1. 讀取圖像(以指紋圖像zhiwen.png為例,指紋易有細小噪聲)
zhiwen = cv2.imread('zhiwen.png')
if zhiwen is None:print("圖像讀取失敗,請檢查文件路徑!")
else:# 2. 顯示原始圖像(可見指紋上有細小亮點噪聲)cv2.imshow('Original Fingerprint', zhiwen)cv2.waitKey(0)# 3. 定義結構元素(3×3矩形,適合精細去噪)kernel = np.ones((3, 3), np.uint8)# 4. 執行開運算(1次腐蝕+1次膨脹)opening_result = cv2.morphologyEx(zhiwen, cv2.MORPH_OPEN, kernel)# 5. 顯示開運算結果cv2.imshow('Opening (3x3 Kernel)', opening_result)cv2.waitKey(0)# 6. 釋放窗口cv2.destroyAllWindows()

效果分析
  • 原始指紋圖像中的 “小亮點” 噪聲會完全消失—— 因為腐蝕先去掉了噪聲,膨脹只恢復了指紋的主體紋理;
  • 開運算后,指紋的整體形狀和大小基本不變—— 膨脹補償了腐蝕造成的前景縮小;
  • 若結構元素改為 5×5,開運算會消除更大的亮點,但可能導致指紋的細紋理(如小分支)被誤刪。

4. 閉運算(Closing):先膨脹后腐蝕,填補 “小黑洞”

原理

閉運算 =?膨脹操作 + 腐蝕操作(先對原始圖像做膨脹,再對膨脹結果做腐蝕)。
核心邏輯:先用膨脹 “填補” 前景中的小孔洞(小黑洞),再用腐蝕 “恢復” 前景目標的原始大小(膨脹擴大的前景,腐蝕可以縮回來,但被填補的孔洞無法恢復)。

作用
  • 彌合前景目標中的細小孔洞(如圓形前景中的小黑點,閉運算會填補黑點);
  • 連接前景目標間的細小間斷(如指紋中的斷裂線條,閉運算會連接線條);
  • 消除圖像中的 “小黑洞” 噪聲(背景噪聲),且不改變大前景目標的形狀。
實戰代碼
import cv2
import numpy as np# 1. 讀取圖像(以有間斷的指紋圖像zhiwen_duan.png為例)
zhiwen = cv2.imread('zhiwen_duan.png')
if zhiwen is None:print("圖像讀取失敗,請檢查文件路徑!")
else:# 2. 顯示原始圖像(可見指紋有細小間斷和孔洞)cv2.imshow('Original Broken Fingerprint', zhiwen)cv2.waitKey(0)# 3. 定義結構元素(6×6矩形,比3×3更適合填補較大孔洞)kernel = np.ones((6, 6), np.uint8)# 4. 執行閉運算(1次膨脹+1次腐蝕)closing_result = cv2.morphologyEx(zhiwen, cv2.MORPH_CLOSE, kernel)# 5. 顯示閉運算結果cv2.imshow('Closing (6x6 Kernel)', closing_result)cv2.waitKey(0)# 6. 釋放窗口cv2.destroyAllWindows()
效果分析
  • 指紋中的細小間斷和孔洞會被填補—— 膨脹先擴大前景,覆蓋孔洞和間斷,腐蝕再縮回到原始大小;
  • 為什么用 6×6 的結構元素?因為結構元素越大,能填補的孔洞 / 連接的間斷越寬,3×3 結構元素可能無法覆蓋較大的孔洞;
  • iterations改為 2,閉運算會重復 2 次膨脹 + 2 次腐蝕,填補效果更強,但可能導致前景目標邊緣過度平滑。

5. 梯度運算(Morphological Gradient):提取前景邊緣

原理

梯度運算 =?膨脹結果 - 腐蝕結果
核心邏輯:膨脹會擴大前景,腐蝕會縮小前景,兩者的像素值差值,恰好對應前景目標的 “邊緣區域”—— 因為邊緣是 “膨脹新增的像素” 與 “腐蝕丟失的像素” 的交集,主體區域則會被抵消(膨脹和腐蝕的主體區域像素值相同,差值為 0)。

作用
  • 突出顯示圖像中強度變化劇烈的區域(即邊緣);
  • 用于目標輪廓提取(如文字邊緣、物體輪廓),是后續圖像分割、特征識別的基礎;
  • 相比 Canny 邊緣檢測,梯度運算更簡單,且能保留更完整的輪廓(但抗噪聲能力較弱)。
實戰代碼
import cv2
import numpy as np# 1. 讀取圖像(以文字圖像wenzi.png為例,文字邊緣清晰)
wenzi = cv2.imread('wenzi.png')
if wenzi is None:print("圖像讀取失敗,請檢查文件路徑!")
else:# 2. 顯示原始圖像cv2.imshow('Original Text Image', wenzi)cv2.waitKey(0)# 3. 定義結構元素(2×2矩形,邊緣提取更精細)kernel = np.ones((2, 2), np.uint8)# 4. 分別執行膨脹和腐蝕(驗證梯度的來源)dilate_wenzi = cv2.dilate(wenzi, kernel, iterations=1)erode_wenzi = cv2.erode(wenzi, kernel, iterations=1)cv2.imshow('Dilation Result', dilate_wenzi)  # 文字擴大cv2.waitKey(0)cv2.imshow('Erosion Result', erode_wenzi)    # 文字縮小cv2.waitKey(0)# 5. 執行梯度運算(直接用morphologyEx,無需手動計算差值)gradient_result = cv2.morphologyEx(wenzi, cv2.MORPH_GRADIENT, kernel)# 6. 顯示梯度結果(文字邊緣被突出,主體為黑色)cv2.imshow('Morphological Gradient (Edge)', gradient_result)cv2.waitKey(0)# 7. 釋放窗口cv2.destroyAllWindows()

效果分析
  • 梯度結果中,文字的主體部分消失(變為黑色),只保留了文字的邊緣(變為白色)—— 因為主體區域的膨脹和腐蝕像素值相同,差值為 0;
  • 結構元素越大,邊緣越—— 因為膨脹和腐蝕的差異更大,邊緣區域的像素更多;
  • 若輸入圖像是彩色圖,梯度結果會顯示彩色邊緣(因為 RGB 三個通道分別計算梯度后合并)。

6. 頂帽(Top Hat):提取 “比周圍亮的小區域”

原理

頂帽 =?原始圖像 - 開運算結果
核心邏輯:開運算會消除 “小亮點”(前景噪聲),并平滑前景輪廓。原始圖像減去開運算結果后,剩下的部分就是 “被開運算去掉的內容”—— 即 “比周圍背景亮的小區域”(如暗背景中的亮噪聲、前景的細小突出物)。

作用
  • 提取圖像中的亮噪聲(如黑底白字圖像中的小白點、夜景中的燈光亮點);
  • 增強暗背景下的亮細節(如醫學圖像中暗組織里的亮細胞);
  • 校正光照不均勻的圖像(若圖像局部偏暗,頂帽可突出該區域的亮細節)。
實戰代碼
import cv2
import numpy as np# 1. 讀取圖像(以sun.png為例,假設圖像有暗背景和亮噪聲)
sun = cv2.imread('sun.png')
if sun is None:print("圖像讀取失敗,請檢查文件路徑!")
else:# 2. 顯示原始圖像cv2.imshow('Original Image', sun)cv2.waitKey(0)# 3. 定義結構元素(2×2矩形,適合提取細小亮噪聲)kernel = np.ones((2, 2), np.uint8)# 4. 先執行開運算(驗證頂帽的來源)open_sun = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)cv2.imshow('Opening Result', open_sun)  # 亮噪聲已被消除cv2.waitKey(0)# 5. 執行頂帽運算tophat_result = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)# 6. 顯示頂帽結果(亮噪聲被突出,背景為黑色)cv2.imshow('Top Hat (Bright Noise)', tophat_result)cv2.waitKey(0)# 7. 釋放窗口cv2.destroyAllWindows()

效果分析
  • 頂帽結果中,主要顯示的是原始圖像中的亮噪聲—— 因為開運算消除了這些噪聲,原始圖像與開運算結果的差值就是噪聲;
  • 若原始圖像沒有亮噪聲,頂帽結果會接近全黑—— 原始圖像與開運算結果幾乎一致,差值很小;
  • 若結構元素改為 5×5,頂帽會提取更大的亮區域(如小的亮前景目標),而非細小噪聲。

7. 黑帽(Black Hat):提取 “比周圍暗的小區域”

原理

黑帽 =?閉運算結果 - 原始圖像
核心邏輯:閉運算會填補 “小黑洞”(背景噪聲),并平滑前景輪廓。閉運算結果減去原始圖像后,剩下的部分就是 “被閉運算填補的內容”—— 即 “比周圍背景暗的小區域”(如亮背景中的暗噪聲、前景的細小孔洞)。

作用
  • 提取圖像中的暗噪聲(如白底黑字圖像中的小黑點、白紙中的墨點);
  • 增強亮背景下的暗細節(如 X 光圖像中亮骨骼里的暗裂紋);
  • 突出前景目標中的孔洞(如零件圖像中的小孔、織物圖像中的紗線間隙)。
實戰代碼
import cv2
import numpy as np# 1. 讀取圖像(以sun.png為例,假設圖像有亮背景和暗噪聲)
sun = cv2.imread('sun.png')
if sun is None:print("圖像讀取失敗,請檢查文件路徑!")
else:# 2. 顯示原始圖像cv2.imshow('Original Image', sun)cv2.waitKey(0)# 3. 定義結構元素(2×2矩形,適合提取細小暗噪聲)kernel = np.ones((2, 2), np.uint8)# 4. 先執行閉運算(驗證黑帽的來源)close_sun = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)cv2.imshow('Closing Result', close_sun)  # 暗噪聲已被填補cv2.waitKey(0)# 5. 執行黑帽運算blackhat_result = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)# 6. 顯示黑帽結果(暗噪聲被突出,背景為黑色)cv2.imshow('Black Hat (Dark Noise)', blackhat_result)cv2.waitKey(0)# 7. 釋放窗口cv2.destroyAllWindows()

效果分析
  • 黑帽結果中,主要顯示的是原始圖像中的暗噪聲—— 因為閉運算填補了這些噪聲,閉運算結果與原始圖像的差值就是噪聲;
  • 若原始圖像沒有暗噪聲,黑帽結果會接近全黑—— 閉運算結果與原始圖像幾乎一致,差值很小;
  • 頂帽與黑帽的核心區別:頂帽提取 “亮小區域”,黑帽提取 “暗小區域”,兩者互為補充,常用于圖像噪聲的全面檢測。

三、總結:7 種形態學操作對比與應用場景

為了方便大家快速選型,下表整理了 7 種操作的核心邏輯、作用及典型應用場景:

操作名稱核心邏輯核心作用典型應用場景
腐蝕(Erosion)結構元素啃食前景邊緣縮小前景、去亮噪聲、斷連接指紋去噪、文字細化
膨脹(Dilation)結構元素擴張前景邊緣擴大前景、補暗孔洞、連間斷文字加粗、孔洞填補
開運算(Opening)腐蝕 + 膨脹去亮噪聲、平滑輪廓、斷連接車牌去噪、遙感圖像小亮點消除
閉運算(Closing)膨脹 + 腐蝕補暗孔洞、平滑輪廓、連間斷零件圖像孔洞填補、指紋斷紋連接
梯度運算膨脹結果 - 腐蝕結果提取前景邊緣、輪廓檢測物體輪廓提取、圖像分割預處理
頂帽(Top Hat)原始圖像 - 開運算結果提取亮小區域、增強暗背景亮細節夜景燈光檢測、醫學圖像亮細胞提取
黑帽(Black Hat)閉運算結果 - 原始圖像提取暗小區域、增強亮背景暗細節白紙墨點檢測、X 光圖像裂紋識別

四、常見問題與注意事項

  1. 圖像讀取失敗怎么辦?
    檢查文件路徑是否正確(絕對路徑如C:/images/love.jpg,相對路徑需確保圖像與代碼在同一文件夾),同時檢查圖像格式是否支持(OpenCV 支持 JPG、PNG、BMP 等)。

  2. 結構元素如何選擇?

    • 精細處理選 3×3/2×2,顯著處理選 5×5 及以上;
    • 處理圓形目標用圓形結構元素(cv2.MORPH_ELLIPSE),處理線性目標用十字形結構元素(cv2.MORPH_CROSS)。
  3. 迭代次數越多越好嗎?
    不是。迭代次數過多會導致前景目標嚴重變形(如腐蝕過度導致前景消失,膨脹過度導致前景粘連),建議從 1 開始逐步調整,觀察效果。

  4. 彩色圖與灰度圖哪個更適合形態學操作?
    優先用灰度圖或二值圖。彩色圖會對每個通道分別處理,可能導致顏色失真,且運算速度更慢;若必須用彩色圖,建議先轉灰度圖(cv2.cvtColor(src, cv2.COLOR_BGR2GRAY))。

通過本文的講解,相信你已經掌握了 OpenCV 形態學操作的核心原理與實戰技巧。建議結合實際圖像(如自己拍攝的文字、指紋、零件圖)反復測試,感受結構元素、迭代次數對結果的影響,逐步積累實戰經驗!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/99149.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/99149.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/99149.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

css的基本知識

一.CSS 選擇器1. 屬性選擇器屬性選擇器允許根據元素的屬性及屬性值來選擇元素:2. 偽類選擇器進階除了常見的:hover、:active,這些偽類也非常實用:3. 偽元素的妙用偽元素用于創建不在 DOM 中的虛擬元素,常用的有:二.盒模…

概率論第六講—數理統計

文章目錄考綱思維導圖統計量及其分布三大分布χ2\chi^2χ2分布(卡方分布)t分布F分布參數估計參數的點估計矩估計法最大似然估計法估計量的評價標準估計量的數字特征與收斂性參數的區間估計假設檢驗假設檢驗的兩類錯誤錯題考綱 這是概率論的最后一章,也是最重要的一章…

vLLM - EngineCoreClient

EngineCoreClient是與EngineCore進行交互的基類: API定義了同步和異步兩個版本。 class EngineCoreClient(ABC):abstractmethoddef shutdown(self):...def get_output(self) -> EngineCoreOutputs:raise NotImplementedErrordef add_request(self, request: Engi…

幾種排序算法(2)

幾種排序算法(2)1冒泡排序2.快速排序2.1hoare版本找基準值2.2lomuto前后指針3.非遞歸版本快速排序4.遞歸排序5.排序算法復雜度及穩定性分析我們已經詳解了插入排序和選擇排序,不了解的可以翻看我上一篇博客。1冒泡排序 void BubbleSort(int*…

Excel甘特圖

1. 創建表格(Excel2021)只有天數是使用公式計算的選中表格按Ctrl T,將表格設置為超級表格2. 創建堆積條形圖3. 添加設置圖例項3.1 添加開始時間3.2 修改圖例項順序 3.3 編輯軸標簽3.4 Y軸逆序類別 3.5 添加開始時間數據標簽選擇 所用橘色圖&…

基于OpenCV的答題卡自動識別與評分系統

引言 在教育考試場景中,手動批改答題卡效率低下且容易出錯。本文將介紹如何使用Python和OpenCV實現一個答題卡自動識別與評分系統,通過計算機視覺技術完成答題卡的透視校正、選項識別和得分計算。該系統可廣泛應用于學校考試、培訓測評等場景&#xff0c…

LLaMA-MoE v2:基于后訓練混合專家模型的稀疏性探索與技術突破

重新定義大型語言模型的效率邊界在人工智能飛速發展的今天,大型語言模型(LLMs)已成為推動技術進步的核心力量。然而,模型規模的不斷擴大帶來了驚人的計算成本和高昂的部署門檻,使得眾多研究機構和中小型企業難以承擔。…

R geo 然后讀取數據的時候 make.names(vnames, unique = TRUE): invalid multibyte string 9

setwd("K:/download/geo") # 替換為實際工作目錄 # 修改get_geo_data_local函數中的讀取部分 #file_path <- "K:/download/geo/raw_data/GEO/GSE32967_series_matrix_fixed.txt" file_path <- "K:/download/geo/data/GSE32967_series_matrix.t…

深入理解 Spring @Async 注解:原理、實現與實踐

在現代 Java 應用開發中&#xff0c;異步編程是提升系統吞吐量和響應速度的關鍵技術之一。Spring 框架提供的Async注解極大簡化了異步方法的實現&#xff0c;讓開發者無需手動管理線程即可輕松實現異步操作。本文將從底層原理到實際應用&#xff0c;全面解析Async注解的工作機制…

linux C 語言開發 (七) 文件 IO 和標準 IO

文章的目的為了記錄使用C語言進行linux 開發學習的經歷。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; linux C 語言開發 (一) Window下用gcc編譯和gdb調試 linux C 語言開發 (二) VsCode遠程開發 linux linux C 語言開發 (…

maven , mvn 運行 項目

提示&#xff1a;環境搭建 文章目錄前言一、使用步驟1. 以構建含有 pom.xml 的項目2.mvn 運行具體項目3.mvn 指定模塊>運行具體項目前言 提示&#xff1a;版本 spirngboot 3.2 jdk 21 mvn 3.9 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 一、使…

JVM垃圾回收的時機是什么時候(深入理解 JVM 垃圾回收時機:什么時候會觸發 GC?)

深入理解 JVM 垃圾回收時機&#xff1a;什么時候會觸發 GC&#xff1f;在 Java 開發中&#xff0c;我們常聽說 “JVM 會自動進行垃圾回收”&#xff0c;但很少有人能說清&#xff1a;GC 究竟在什么情況下會被觸發&#xff1f;是到固定時間就執行&#xff1f;還是內存滿了才會啟…

在Vue項目中Axios發起請求時的小知識

在Vue項目中Axios發起請求時的小知識 在Vue項目開發中&#xff0c;Axios作為基于Promise的HTTP客戶端&#xff0c;憑借其簡潔的API設計和強大的功能&#xff08;如請求/響應攔截、自動JSON轉換、取消請求等&#xff09;&#xff0c;已成為前端與后端通信的主流選擇。本文將深入…

GeoHash分級索引技術

GeoHash分級索引技術是一種將二維地理坐標轉換為一維字符串的空間索引方法,其核心是通過分級網格劃分和前綴編碼實現高效的空間數據檢索。以下從技術原理、實現細節到工程優化展開詳細解析: 一、編碼原理與分級結構 1. 經緯度二進制化 GeoHash通過遞歸二分地球表面生成網格…

HTML HTML基礎(4)

1.列表 (1).有序列表 概念&#xff1a;有順序或側重順序的列表。 <h2>要把大象放冰箱總共分幾步</h2> <ol> <li>把冰箱門打開</li> <li>把大象放進去</li> <li>把冰箱門關上</li> </ol> (2).無序列表 概念&a…

MySQL中的回表操作

在數據庫查詢&#xff08;尤其是基于 B樹索引 的關系型數據庫&#xff0c;如MySQL、PostgreSQL&#xff09;中&#xff0c;“回表”是一個核心且高頻出現的概念&#xff0c;直接影響查詢性能。要理解回表&#xff0c;需先理清索引結構與數據存儲的關聯&#xff0c;再拆解其發生…

QT子線程與GUI線程安全交互

在Qt應用程序開發中&#xff0c;涉及到多線程處理時&#xff0c;如何安全地從子線程更新UI界面是一個常見的問題。Qt的UI界面并不是線程安全的&#xff0c;意味著你不能直接在子線程中操作UI組件&#xff08;比如按鈕、標簽等&#xff09;。如果不遵循線程安全的規則&#xff0…

RL【10-2】:Actor - Critic

系列文章目錄 Fundamental Tools RL【1】&#xff1a;Basic Concepts RL【2】&#xff1a;Bellman Equation RL【3】&#xff1a;Bellman Optimality Equation Algorithm RL【4】&#xff1a;Value Iteration and Policy Iteration RL【5】&#xff1a;Monte Carlo Learnin…

開源大模型天花板?DeepSeek-V3 6710億參數MoE架構深度拆解

文章目錄認知解構&#xff1a;DeepSeek的定位與核心價值模型概述與發展歷程創立初期與技術奠基&#xff08;2023年7月-2024年11月&#xff09;里程碑一&#xff1a;MoE架構規模化突破&#xff08;2024年12月&#xff09;里程碑二&#xff1a;推理成本革命性優化&#xff08;202…

10 訓練中的一些問題

&#x1f31f; 大背景&#xff1a;訓練神經網絡 下山尋寶 訓練神經網絡就像你蒙著眼在一座大山里&#xff0c;想找最低點&#xff08;最小損失&#xff09;。你只能靠腳下的坡度&#xff08;梯度&#xff09;來決定往哪兒走。 你的位置 模型參數&#xff08;權重 www&#xf…