一看就會!Python OpenCV形態學操作基礎教程

形態學操作是圖像處理中基於圖像形狀的方法,核心通過結構元素與圖像交互,改變物體形狀特徵,主要用於二值圖像,實現去噪、連接物體、填充孔洞等功能。 基本類型包括:腐蝕(縮小亮區、擴大暗區,去噪但邊緣收縮)、膨脹(擴大亮區、填充暗洞,連接斷裂)、開運算(先腐蝕後膨脹,去噪保形)、閉運算(先膨脹後腐蝕,填洞優化邊緣)。 結構元素是定義操作形狀和大小的小型矩陣,OpenCV支持矩形、橢圓、十字形等,通過cv2.getStructuringElement創建。 代碼實現需讀取圖像、二值化、定義結構元素,執行腐蝕、膨脹、開/閉運算並顯示結果,還可通過形態學梯度、頂帽、黑帽等進階操作提取邊緣或噪點。 總結:形態學是基礎工具,用於去噪、連接物體、提取邊緣,初學者可從開/閉運算入手,通過調整結構元素大小和形狀練習不同場景應用。

閱讀全文
Python OpenCV濾鏡效果入門:模糊與銳化圖像處理

本文介紹數字圖像處理中模糊與銳化的基礎操作,適合初學者用Python+OpenCV實現。模糊用於去噪平滑,常用方法有:均值濾波(簡單平均,快速去噪但模糊細節)、高斯濾波(加權平均,自然模糊,去高斯噪聲)、中值濾波(中值替代,抗椒鹽噪聲且保邊緣)、雙邊濾波(保邊模糊,人像美顏)。銳化增強邊緣細節,方法包括:拉普拉斯算子(二階導數,通用銳化)、簡單像素疊加(直接突出邊緣)、Sobel算子(梯度計算,增強邊緣)。文章通過對比表總結方法特點,提供練習建議,是圖像處理入門基礎。

閱讀全文
零基礎學Python OpenCV:攝像頭即時捕獲與顯示

本文介紹了使用Python和OpenCV實現攝像頭即時捕獲與顯示的方法。選擇OpenCV(開源計算機視覺庫)和Python(語法簡潔)的原因在於其易用性和功能適配性,Python的opencv-python接口安裝便捷。 安裝步驟:需先安裝Python 3.6+,再通過`pip install opencv-python`安裝庫(必要時先裝numpy)。 核心流程:打開攝像頭(`cv2.VideoCapture(0)`)→循環讀取幀(`cap.read()`,返回ret和frame)→顯示圖像(`cv2.imshow()`)→按q鍵退出→釋放資源(`cap.release()`和`cv2.destroyAllWindows()`)。 關鍵代碼解釋:`cap.read()`檢查讀取狀態,`cv2.waitKey(1)`等待按鍵(q鍵退出),確保資源正確釋放避免佔用。文章還提及常見問題(如攝像頭無法打開)及擴展練習(灰度顯示、翻轉圖像等),爲後續複雜圖像處理奠定基礎。

閱讀全文
Python OpenCV圖像縮放與裁剪:初學者必學技巧

本文介紹Python OpenCV中圖像縮放和裁剪的基礎操作,幫助零基礎掌握核心技巧。 **圖像縮放**:使用`cv2.resize()`函數,支持兩種目標尺寸指定方式:按比例縮放(通過`fx`/`fy`控制,如`fx=0.5`縮小一半)或直接指定寬高(如`(200, 200)`)。插值方法建議:縮小用`INTER_AREA`,放大用`INTER_LINEAR`,避免變形。示例中需注意圖像路徑正確性及窗口操作(`waitKey`和`destroyAllWindows`)。 **圖像裁剪**:本質是NumPy數組切片,格式爲`img[y_start:y_end, x_start:x_end]`,需確保座標不越界(`y_end`≤高度,`x_end`≤寬度)。示例包括固定區域裁剪和中心區域裁剪(先計算中心偏移量`(w-target_w)//2`和`(h-target_h)//2`,再切片)。 **總結**:縮放需注意路徑和插值方法,裁剪需關注座標範圍。兩者常結合使用(如先裁剪再縮放),是圖像預處理

閱讀全文
手把手教你用Python OpenCV識別圖像輪廓

這篇文章介紹了用Python OpenCV實現圖像輪廓識別的方法。需先安裝OpenCV和NumPy庫。圖像輪廓是物體邊界線,用於定位目標物體(如人臉、圓形)。核心步驟包括:預處理(灰度化+二值化簡化圖像)、邊緣檢測(Canny算法,通過閾值確定邊界)、輪廓提取(findContours獲取座標)、篩選與繪製(按面積等篩選並可視化)。 實戰中以shapes.jpg爲例,演示流程:讀取圖像→灰度化+二值化→Canny邊緣檢測→findContours提取輪廓→按面積篩選最大輪廓並繪製。常見問題如輪廓不完整可調整Canny閾值,多餘輪廓通過面積過濾解決。還可擴展用圓形度等形狀特徵識別物體。 總結指出,輪廓識別是計算機視覺基礎,初學者可從簡單圖像入手,通過參數調整優化結果。

閱讀全文
輕鬆搞定!Python OpenCV邊緣檢測基礎教程

這篇文章介紹了圖像邊緣檢測的概念、Python OpenCV實現及核心算法。邊緣檢測用於識別圖像中像素強度顯著變化的區域(如物體輪廓),是計算機視覺基礎,廣泛應用於人臉識別、自動駕駛等領域。 環境準備需安裝Python和OpenCV(`pip install opencv-python`)。核心流程分三步:圖像預處理(灰度化、降噪)、邊緣檢測算法、結果可視化。 重點講解Canny邊緣檢測(John Canny 1986年提出),步驟爲:1.灰度化(減少計算量);2.高斯模糊(降噪,核大小5×5常見);3.計算梯度(Sobel算子);4.非極大值抑制(細化邊緣);5.雙閾值篩選(低閾值50-150、高閾值150-200,閾值影響邊緣敏感度)。Python代碼示例:讀取圖像→灰度化→模糊→Canny檢測→顯示結果。 其他算法包括Sobel(梯度計算)和Laplacian(二階導數),需先模糊降噪。實踐技巧:優先模糊、調整閾值;常見問題:圖像讀取失敗(檢查路徑

閱讀全文
從入門到實戰:Python OpenCV色彩空間轉換詳解

本文介紹了圖像色彩空間的概念及OpenCV在Python中的轉換應用。常見色彩空間有RGB(顯示用,紅/綠/藍通道)、BGR(OpenCV默認,藍/綠/紅順序)、HSV(色相H、飽和度S、明度V,適合顏色分割)。轉換原因:不同空間用途不同(RGB顯示,HSV利於顏色識別,BGR爲OpenCV原生)。核心工具爲`cv2.cvtColor()`,語法爲`cv2.cvtColor(img, cv2.COLOR_原空間2目標空間)`,如`cv2.COLOR_BGR2HSV`。實戰中,以紅色物體識別爲例:讀取圖像→轉HSV→定義紅色HSV範圍(H分0-10和160-179區間)→掩碼提取。還可擴展至攝像頭即時檢測。關鍵點:掌握轉換函數,注意BGR與RGB差異,HSV範圍需依光線調整。

閱讀全文
Python OpenCV入門:5分鐘掌握圖像二值化處理

圖像二值化是將像素按閾值分爲黑白兩類,簡化圖像便於分析,常用於文字識別等場景。核心是通過cv2.threshold()函數實現,需輸入灰度圖、閾值、最大值及類型,返回實際閾值和二值化圖像。常用閾值類型包括:THRESH_BINARY(像素>閾值變白)、THRESH_BINARY_INV(相反)、THRESH_OTSU(自動計算最優閾值)。閾值選擇:手動適用於亮度均勻圖像,Otsu適合高對比度場景;光照不均時用自適應閾值。關鍵步驟爲:讀取圖像轉灰度→選閾值類型→二值化處理→顯示。掌握二值化可支持邊緣檢測、目標分割等任務。

閱讀全文
零基礎學Python OpenCV:手把手教你讀取與顯示圖像

本文介紹Python OpenCV基礎操作,包括安裝、讀取與顯示圖像。OpenCV是開源計算機視覺庫,通過`pip install opencv-python`(或國內鏡像源加速)安裝,驗證時導入庫並打印版本號。讀取圖像用`cv2.imread()`,需指定路徑和參數(彩色、灰度、原始圖像),並檢查返回值是否爲`None`以確認成功。顯示圖像用`cv2.imshow()`,需配合`cv2.waitKey(0)`等待按鍵和`cv2.destroyAllWindows()`關閉窗口。常見問題:OpenCV默認讀取BGR通道,需用`cv2.cvtColor()`轉RGB避免顏色異常;路徑錯誤會導致讀取失敗,需用絕對路徑或確認圖像格式。核心步驟爲安裝、讀取、顯示,動手實踐可快速掌握。

閱讀全文
使用C++實現基數排序算法

基數排序是一種非比較型整數排序算法,採用最低有效位優先(LSD)方式,按數字每一位(個位、十位等)排序,無需比較元素大小。其核心思想是通過穩定的計數排序處理每一位,確保低位排序結果在高位排序中保持有序。 實現步驟:1. 找出數組最大數,確定需處理的最高位數;2. 從低位到高位,對每一位用計數排序處理:統計當前位數字頻次,計算位置,從後往前穩定放置元素,最後複製回原數組。 C++代碼中,`countingSort`輔助函數實現按位排序(統計頻次、計算位置、穩定放置),`radixSort`主函數循環處理每一位。時間複雜度爲O(d×(n+k))(d爲最大位數,n爲數組長度,k=10),適用於整數範圍較大的場景。其核心是利用計數排序的穩定性,確保低位排序結果在高位排序中不被破壞。測試結果顯示排序後數組有序,驗證了算法有效性。

閱讀全文
使用C++實現桶排序算法

桶排序是一種非比較型排序算法,通過將待排序元素分配到多個“桶”中,對每個桶內元素單獨排序後合併,實現整體排序。核心是合理劃分桶,使每個桶元素數量少,降低排序成本。 以[0,1)範圍內的浮點數爲例,算法步驟:1. 創建n個空桶(n爲數組長度);2. 按元素x的桶索引x*n(取整數部分)分配到對應桶;3. 各桶內用std::sort排序;4. 合併所有桶元素。 C++實現中,`bucketSort`函數通過vector<vector<double>>創建n個桶,遍歷元素分配,排序後合併。測試驗證了算法正確性。 複雜度:平均時間O(n)(元素均勻分佈時),最壞O(n log n)(所有元素入同一桶);空間O(n)。適用於數據分佈均勻、範圍明確的數值型數據,數據不均時性能退化。 該算法在數據分佈合理時高效,尤其適合統計分析中的區間數據排序。

閱讀全文
使用C++實現計數排序算法

**計數排序**是一種非比較型排序算法,核心思想是通過統計元素出現次數構建排序數組,適用於整數範圍不大的場景(如學生成績、年齡)。 **基本思路**:以數組`[4,2,2,8,3,3,1]`爲例,步驟爲:1. 確定最大值(8),創建計數數組`count`統計各元素出現次數(如`count[2]=2`);2. 按計數數組順序將元素插入結果數組,得到排序結果`[1,2,2,3,3,4,8]`。 **實現要點**:C++代碼中,先找最大值,統計次數,構建結果數組並複製回原數組。關鍵步驟包括計數數組初始化、統計次數、按次數填充結果數組。 **複雜度**:時間複雜度O(n+k)(n爲數組長度,k爲數據範圍),空間複雜度O(k)。 **適用場景**:非負整數且範圍小,需高效排序;負數可通過偏移量轉換(如加最小值)處理。 計數排序通過“計數-構建”邏輯實現線性時間排序,是處理小範圍整數

閱讀全文
使用C++實現歸併排序算法

歸併排序基於分治思想,核心是“分解-合併”:先遞歸將數組拆分爲單個元素(子數組有序),再合併兩個有序子數組爲更大有序數組。 分解過程:遞歸將數組從中間拆分,直到子數組僅含1個元素。合併過程:比較兩個有序子數組元素,取較小值依次放入結果數組,處理剩餘元素。 C++實現含兩個核心函數:`mergeSort`遞歸分解數組,`merge`合併兩個有序子數組。時間複雜度O(n log n),空間複雜度O(n)(需臨時數組)。 歸併排序穩定且高效,適合大規模數據排序。示例中數組`[5,3,8,6,2,7,1,4]`經分解合併後得到有序數組`[1,2,3,4,5,6,7,8]`,驗證算法正確性。

閱讀全文
使用C++實現堆排序算法

堆排序是基於堆數據結構的高效排序算法,時間複雜度O(n log n),空間複雜度O(1),適用於大規模數據。堆是特殊完全二叉樹,分大頂堆(父≥子)和小頂堆,排序常用大頂堆。其存儲爲數組,索引i的父節點爲(i-1)/2,左右子節點爲2i+1和2i+2。核心步驟:1.構建初始大頂堆(從最後非葉子節點向上調整);2.排序(交換堆頂與未排序末尾元素,調整堆,重複直至完成)。C++實現包含swap、max_heapify(迭代調整子樹爲大頂堆)、heap_sort(構建堆並排序)函數,主函數測試數組排序,輸出結果正確。

閱讀全文
使用C++實現選擇排序算法

選擇排序是簡單直觀的排序算法,核心思想是每次從待排序元素中選出最小(或最大)元素,將其放入已排序序列末尾,直至完成排序。基本思路分四步:外層循環控制當前待排序起始位置,內層循環在剩餘元素中尋找最小值,交換操作將最小值移至當前起始位置,重複直至所有元素排序完成。 以數組{64,25,12,22,11}爲例,演示過程:i=0時找到最小值11交換到首位,i=1找到12交換到第二位,i=2找到22交換到第三位,i=3無需交換,最終數組排序完成。 C++代碼通過兩層循環實現:外層循環控制位置i,內層循環找最小值索引minIndex,交換arr[i]與arr[minIndex]。時間複雜度O(n²),空間複雜度O(1)。 選擇排序實現簡單、無需額外空間,適合小規模數據排序,是理解排序算法的基礎。

閱讀全文
使用C++實現希爾排序算法

希爾排序是插入排序的改進版,又稱“縮小增量排序”,通過分組插入排序並逐步縮小增量實現高效排序。基本思路:選定初始增量`gap`(如數組長度的一半),按`gap`分組(子序列元素間隔`gap`),對各組子序列插入排序;重複縮小`gap`(通常減半),直至`gap=1`完成整體排序。 核心原理:大`gap`時分組減少移動次數,小`gap`時數組已部分有序,大幅降低最終插入排序的移動量。以數組`[12,34,54,2,3]`爲例,初始`gap=2`分組排序後數組漸趨有序,再`gap=1`完成最終排序。 代碼通過三層循環實現:外層控制`gap`,中層遍歷分組,內層移動元素。時間複雜度平均`O(n^1.3)`(依賴增量),最壞`O(n²)`,空間複雜度`O(1)`,不穩定。希爾排序通過分組優化插入排序,適用於較大數組,核心邏輯爲“分組→排序→縮小增量→最終排序”。

閱讀全文
使用C++實現插入排序算法

插入排序是簡單直觀的排序算法,核心思想是將元素逐個插入到已排序子數組的合適位置(類似整理撲克牌)。基本思路:從第二個元素開始,取當前元素,與前面已排序元素比較,若前面元素更大則後移,直到找到插入位置,插入後繼續處理下一個元素。 實現時,外層循環遍歷元素,內層循環用臨時變量保存當前元素,通過比較移動前面元素騰出位置,最後插入。時間複雜度最壞O(n²),最好O(n),空間複雜度O(1)。適用於小規模數據或基本有序數據,優點是穩定、簡單,是理解複雜排序的基礎。

閱讀全文
使用C++實現快速排序算法

快速排序基於分治法,平均時間複雜度O(n log n),在實際應用中廣泛使用。其核心思想爲:選擇基準元素(pivot),將數組分區爲小於和大於基準的兩部分,再遞歸排序子數組。分區採用Lomuto方案,以最右側元素爲基準,通過遍歷數組將小於基準的元素移至左側,最後交換基準至最終位置(i+1處)。 C++實現包含分區函數(partition)和遞歸排序主函數(quickSort),分區操作在原數組完成,實現原地排序。遞歸終止條件爲子數組長度≤1(left≥right)。時間複雜度平均O(n log n),最壞O(n²)(如已排序數組選最左/右爲基準),可通過隨機選基準優化。 關鍵特性:原地排序,無需額外空間;遞歸終止條件明確;平均高效,最壞情況可優化。快速排序是面試與開發高頻算法,掌握其分區邏輯和遞歸思想是理解高效排序的關鍵。

閱讀全文
使用C++實現冒泡排序算法

冒泡排序是經典入門排序算法,核心思想如氣泡上浮,通過重複比較相鄰元素並交換逆序對,使小元素逐步“冒”到數組頂端。基本過程:每輪從首元素開始,相鄰元素比較,逆序則交換,每輪確定一個最大元素位置,直至數組有序。 C++實現中,`bubbleSort`函數外層循環控制輪數(最多n-1輪),內層循環比較相鄰元素並交換,用`swapped`標記優化,若某輪無交換則提前退出。時間複雜度最壞/平均O(n²),最好O(n)(優化後),空間複雜度O(1),穩定排序。 其直觀易理解,雖效率不高,但掌握“比較交換”邏輯是學習排序基礎的關鍵,適合算法入門實踐。

閱讀全文
使用Python實現基數排序算法

基數排序是一種非比較型整數排序算法,核心思想是按數字每一位(從低位到高位)分桶收集。基本步驟:先確定數組中最大數的位數,再從最低位到最高位,對每一位數字進行“分桶”(0-9共10個桶)和“收集”操作,將當前位數字相同的元素放入同一桶,按桶順序收集更新數組,直至所有位處理完畢。Python實現通過循環位數、計算當前位數字分桶並收集,時間複雜度爲O(d×(n+k))(d爲最大數位數,n爲數組長度,k=10),空間複雜度O(n+k)。適合位數少的整數數組,處理負數時可先轉正數排序再恢復符號。

閱讀全文
使用Python實現桶排序算法

桶排序是基於分治思想的非比較型排序算法,通過分桶、桶內排序、合併實現整體有序。核心步驟:根據數據分佈特點分桶,桶內元素少,用簡單排序(如內置排序)處理,最後合併所有桶結果。 適用場景:數據均勻分佈且範圍有限時效率接近線性(O(n));分佈不均可能退化爲O(n²),性能低於快速排序。 Python實現(以0-1區間浮點數爲例):創建n個空桶(n爲數據長度),按`int(num*n)`分配數據到對應桶,桶內排序後合併所有桶元素。代碼簡潔,但需根據數據範圍調整桶索引計算,優化桶大小避免極端值集中。 總結:適合均勻分佈數據,利用分治降低複雜度,需關注數據分佈特性以避免性能退化。

閱讀全文
使用Python實現計數排序算法

計數排序是高效非比較型排序算法,適用於整數且取值範圍較小的場景,時間複雜度O(n+k)(n爲元素數,k爲數據範圍)。核心步驟:1.確定數據範圍(找min和max);2.構建計數數組統計各元素出現次數;3.按順序輸出計數數組元素(次數對應輸出次數)。它穩定(重複元素相對順序不變),內存佔用取決於數據範圍,適合重複元素多或範圍小的整數數據(如考試分數)。Python實現通過邊界處理、統計次數等完成排序,測試驗證對含重複元素及負數數組的適用性。

閱讀全文
使用Python實現歸併排序算法

歸併排序基於分治法,核心分三步:分解(將數組拆分爲左右子數組,直至單元素)、遞歸排序(各子數組遞歸排序)、合併(合併有序子數組爲整體有序數組)。 以數組[3,1,4,2]爲例,分解後遞歸排序各子數組,再合併爲[1,2,3,4]。Python實現含合併函數(按序合併兩個有序子數組)與遞歸排序函數(分解並遞歸調用合併)。 其特點:時間複雜度O(n log n),空間複雜度O(n)(需額外存儲合併結果),爲穩定排序(相等元素相對順序不變)。

閱讀全文
使用Python實現堆排序算法

堆排序是利用堆數據結構的高效排序算法,時間複雜度穩定爲O(n log n),空間複雜度O(1),適合大規模數據排序。堆是完全二叉樹,父節點值≥(最大堆)或≤(最小堆)子節點值。數組中堆的索引關係:父節點i的子節點爲2i+1、2i+2,子節點j的父節點爲(j-1)//2。 核心操作包括:1. **Heapify**:調整以i爲根的子樹爲最大堆,遞歸比較子節點並交換;2. **構建最大堆**:從最後非葉子節點(n//2-1)向上調整所有節點,確保整體滿足最大堆性質。 排序流程:先構建最大堆,再反覆交換堆頂(最大值)與堆尾元素,同時調用Heapify調整剩餘元素爲最大堆,最終得到有序數組。堆排序爲原地排序,適用於大數據量場景。

閱讀全文
使用Python實現選擇排序算法

選擇排序是簡單直觀的排序算法,核心思想是每次從待排序元素中選出最小(或最大)元素,放入已排序部分末尾,直至完成排序。步驟爲:初始化假設當前元素最小,遍歷未排序部分找更小元素,交換到已排序末尾,重複至結束。 Python實現中,外層循環變量i控制已排序部分末尾(從0到n-2),內層循環變量j遍歷未排序部分(從i+1到n-1)找最小元素位置min_index,最後交換arr[i]與arr[min_index]。測試數組[64,25,12,22,11]排序後爲[11,12,22,25,64]。 時間複雜度O(n²),空間複雜度O(1),原地排序。特點:簡單易理解,但不穩定(相同元素可能交換順序),適合小規模數據。

閱讀全文