OpenCV閾值處理完全指南:從基礎到高級應用

引言

閾值處理是圖像處理中最基礎、最常用的技術之一,它能夠將灰度圖像轉換為二值圖像,為后續的圖像分析和處理奠定基礎。本文將全面介紹OpenCV中的各種閾值處理方法,包括原理講解、代碼實現和實際應用場景。

一、什么是閾值處理?

閾值處理(Thresholding)是通過設定一個或多個閾值,將圖像的像素值分為若干類的過程。對于灰度圖像,通常是選擇一個閾值,將像素分為"黑"和"白"兩類,從而創建二值圖像。

數學表達式:

dst(x,y) = maxVal if src(x,y) > thresh= 0      otherwise

二、OpenCV中的閾值處理函數

OpenCV提供了cv2.threshold()函數用于基本的閾值處理,其函數原型為:

retval, dst = cv2.threshold(src, thresh, maxval, type[, dst])

參數說明:

  • src:輸入圖像(必須為灰度圖)
  • thresh:閾值
  • maxval:當像素值超過閾值時賦予的最大值
  • type:閾值類型
  • retval:實際使用的閾值(某些方法會自動計算)
  • dst:輸出圖像

三、5種基本閾值處理方法

1. 二進制閾值化(THRESH_BINARY)

import cv2
import numpy as npimg = cv2.imread('image.jpg', 0)  # 以灰度模式讀取
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

效果:像素值>127設為255,否則設為0

2. 反二進制閾值化(THRESH_BINARY_INV)

ret, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)

效果:與THRESH_BINARY相反

3. 截斷閾值化(THRESH_TRUNC)

ret, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)

效果:像素值>127設為127,否則保持不變

4. 閾值化為0(THRESH_TOZERO)

ret, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)

效果:像素值>127保持不變,否則設為0

5. 反閾值化為0(THRESH_TOZERO_INV)

ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)

效果:與THRESH_TOZERO相反

四、自適應閾值處理

當圖像光照不均時,全局閾值效果不佳,此時可以使用自適應閾值:

thresh = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 11, 2)

參數說明:

  • adaptiveMethod:自適應方法
    • ADAPTIVE_THRESH_MEAN_C:鄰域均值
    • ADAPTIVE_THRESH_GAUSSIAN_C:鄰域加權和(高斯)
  • blockSize:鄰域大小(奇數)
  • C:從均值或加權和中減去的常數

五、Otsu’s二值化(大津算法)

對于雙峰圖像(直方圖有兩個明顯峰值),Otsu方法可以自動確定最佳閾值:

ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

六、實際應用案例

1. 文檔掃描與OCR預處理

def preprocess_for_ocr(image_path):img = cv2.imread(image_path, 0)# 使用Otsu方法自動閾值化_, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)# 去噪kernel = np.ones((3,3), np.uint8)processed = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)return processed

2. 工業檢測中的缺陷識別

def detect_defects(reference_img, test_img):# 轉換為灰度圖ref_gray = cv2.cvtColor(reference_img, cv2.COLOR_BGR2GRAY)test_gray = cv2.cvtColor(test_img, cv2.COLOR_BGR2GRAY)# 計算差異diff = cv2.absdiff(ref_gray, test_gray)# 自適應閾值處理thresh = cv2.adaptiveThreshold(diff, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 11, 2)# 尋找輪廓contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 繪制缺陷區域result = test_img.copy()for cnt in contours:if cv2.contourArea(cnt) > 10:  # 忽略小面積x,y,w,h = cv2.boundingRect(cnt)cv2.rectangle(result, (x,y), (x+w,y+h), (0,0,255), 2)return result

七、閾值處理的高級技巧

1. 多閾值處理

def multi_threshold(image):gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 定義三個閾值_, th1 = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY)_, th2 = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)_, th3 = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)# 組合結果result = np.zeros_like(gray)result[(gray >= 0) & (gray < 50)] = 0result[(gray >= 50) & (gray < 100)] = 100result[(gray >= 100) & (gray < 150)] = 200result[gray >= 150] = 255return result

2. 基于HSV空間的閾值處理

def hsv_threshold(image):hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# 定義顏色范圍(示例:紅色)lower_red = np.array([0, 120, 70])upper_red = np.array([10, 255, 255])mask1 = cv2.inRange(hsv, lower_red, upper_red)lower_red = np.array([170, 120, 70])upper_red = np.array([180, 255, 255])mask2 = cv2.inRange(hsv, lower_red, upper_red)# 合并maskmask = mask1 + mask2# 應用maskresult = cv2.bitwise_and(image, image, mask=mask)return result

八、性能優化

性能優化建議:

  1. 對小圖像使用全局閾值,對大圖像使用自適應閾值
  2. 在循環中處理視頻幀時,預先轉換為灰度圖
  3. 合理選擇blockSize(通常11-31之間的奇數)

九、總結

閾值處理是圖像分割和特征提取的基礎,掌握各種閾值處理方法能夠為更復雜的計算機視覺任務打下堅實基礎。本文介紹了OpenCV中的基本閾值處理方法、自適應閾值和大津算法,并提供了實際應用案例和高級技巧。希望通過本文的學習,您能夠根據不同的應用場景選擇合適的閾值處理方法。

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

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

相關文章

Java8到24新特性整理

本文整理了 Java 8 至 Java 24 各版本的新特性&#xff0c;內容包括每個版本的新增功能分類&#xff08;如語法增強、性能優化、工具支持等&#xff09;、詳細的代碼示例&#xff0c;并結合官方文檔資料&#xff0c;分析每項特性的應用場景及優缺點。Java 8 發布于 2014 年&…

輪詢仲裁器

參考視頻 https://www.bilibili.com/video/BV1VQ4y1w7Rr/?spm_id_from333.337.search-card.all.click&vd_sourceaedd69dc9740e91cdd85c0dfaf25304b 算法原理

Armijo rule

非精線搜索步長規則Armijo規則&Goldstein規則&Wolfe規則_armijo rule-CSDN博客 [原創]用“人話”解釋不精確線搜索中的Armijo-Goldstein準則及Wolfe-Powell準則 – 編碼無悔 / Intent & Focused

力扣HOT100之二叉樹:102. 二叉樹的層序遍歷

這道題太簡單了&#xff0c;相當于基礎的模板題&#xff0c;但凡涉及到層序遍歷一定會用到隊列來實現&#xff0c;其他的倒沒啥好說的&#xff0c;用兩層while循環來層序遍歷&#xff0c;外層while循環用于控制訪問二叉樹的每一層&#xff0c;而內層while循環則負責收割每一層的…

Ubuntu24.04 安裝 5080顯卡驅動以及cuda

前言 之前使用Ubuntu22.04版本一直報錯,然后換了24.04版本才能正常安裝 一. 配置基礎環境 Linux系統進行環境開發環境配置-CSDN博客 二. 安裝顯卡驅動 1.安裝驅動 按以下步驟來&#xff1a; sudo apt update && sudo apt upgrade -y#下載最新內核并安裝 sudo add…

WAS和Tomcat的對比

一、WAS和Tomcat的對比 WebSphere Application Server (WAS) 和 Apache Tomcat 是兩款常用的 Java 應用服務器&#xff0c;但它們有許多顯著的區別。在企業級應用中&#xff0c;它們扮演不同的角色&#xff0c;各自有其特點和適用場景。以下是它們在多個維度上的詳細對比&…

asp.net IHttpHandler 對分塊傳輸編碼的支持,IIs web服務器后端技術

IHttpHandler&#xff0c;不支持分塊傳輸編碼&#xff08;Chunked Transfer&#xff09;吧&#xff1f; IHttpHandler 對分塊傳輸編碼的支持 實際上&#xff0c;IHttpHandler 完全支持分塊傳輸編碼&#xff08;Chunked Transfer Encoding&#xff09;&#xff0c;但具體行為取…

為什么elasticsearch配置文件JVM配置31G最佳

Elasticsearch的JVM堆內存配置為32GB被視為最佳實踐&#xff0c;主要基于以下綜合技術原理和性能優化考量&#xff1a; 1. ?JVM指針壓縮機制優化內存效率? 當堆內存≤32GB時&#xff0c;JVM啟用?對象指針壓縮&#xff08;Compressed Ordinary Object Pointers, COOP&#…

Systemd基礎

1. 概述 Systemd 是一系列工具的集合&#xff0c;其作用也遠遠不僅是啟動操作系統&#xff0c;它還接管了后臺服務、結束、狀態查詢&#xff0c;以及日志歸檔、設備管理、電源管理、定時任務等許多職責&#xff0c;并支持通過特定事件&#xff08;如插入特定 USB 設備&#xf…

AI預測3D新模型百十個定位預測+膽碼預測+去和尾2025年5月16日第79彈

從今天開始&#xff0c;咱們還是暫時基于舊的模型進行預測&#xff0c;好了&#xff0c;廢話不多說&#xff0c;按照老辦法&#xff0c;重點8-9碼定位&#xff0c;配合三膽下1或下2&#xff0c;殺1-2個和尾&#xff0c;再殺6-8個和值&#xff0c;可以做到100-300注左右。 (1)定…

CentOS高手之路:從進階實戰到企業級優化

一、系統深度優化與性能調優 1. 內核參數調優 通過修改/etc/sysctl.conf文件調整內核參數&#xff0c;可顯著提升服務器性能。例如&#xff1a; net.ipv4.tcp_fin_timeout30&#xff08;快速釋放TCP連接&#xff09; vm.swappiness10&#xff08;減少交換分區使用&#xff0…

Docker 無法拉取鏡像解決辦法

問題 在linux終端中通過 docker pull 命令拉取鏡像&#xff0c;報錯無法拉取鏡像&#xff0c;這是因為 Docker 客戶端無法連接到 Docker 鏡像倉庫&#xff08;Docker Hub&#xff09; 解決方法 1、配置國內可用的 Docker鏡像加速器&#xff0c;這些鏡像加速器用于提高從Docke…

【Linux】序列化與反序列化、會話與進程組、守護進程

一.序列化和反序列化 協議其實就是結構化的數據。但是再網絡通信中&#xff0c;我們不直接發送結構化的數據給對方。我們一般會將結構化的數據序列化成字符串/字節流&#xff0c;然后通過網絡在發送出去。而接收方收到之后&#xff0c;要對收到的字符串/流式數據進行反序列化&…

提權腳本Powerup命令備忘單

1. 獲取與加載 從 GitHub 下載&#xff1a;(New-Object Net.WebClient).DownloadFile("https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Privesc/PowerUp.ps1", "C:\Temp\PowerUp.ps1")本地加載&#xff1a;Import-Module .\Power…

2025年Ai寫PPT工具推薦,這5款Ai工具可以一鍵生成專業PPT

上個月給客戶做產品宣講時&#xff0c;我對著空白 PPT 頁面熬到凌晨一點&#xff0c;光是調整文字排版就改了十幾版&#xff0c;最后還是被吐槽 "內容零散沒重點"。后來同事分享了幾款 ai 寫 PPT 工具&#xff0c;試完發現簡直打開了新世界的大門 —— 不用手動寫大綱…

部署docker上的redis,idea一直顯示Failed to connect to any host resolved for DNS name

參考了https://blog.csdn.net/m0_74216612/article/details/144145127 這篇文章&#xff0c;關閉了centos的防火墻&#xff0c;也修改了redis.conf文件&#xff0c;還是一直顯示Failed to connect to any host resolved for DNS name。最終發現是騰訊云服務器那一層防火墻沒…

QML元素 - OpacityMask

QML 的 OpacityMask 用于通過遮罩元素的 透明度&#xff08;Alpha 通道&#xff09; 裁剪源元素的可見區域&#xff0c;適用于創建不規則形狀的 UI 元素&#xff08;如圓形頭像、波浪形進度條&#xff09;或復雜視覺效果。以下是詳細使用技巧和常見場景示例&#xff1a; 1. 基本…

麒麟桌面系統文件保險箱快捷訪問指南:讓重要文件夾一鍵直達桌面!

往期文章鏈接&#xff1a;統信操作系統自定義快捷鍵配置音量調節功能指南 Hello&#xff0c;大家好啊&#xff0c;今天給大家帶來一篇麒麟桌面操作系統上配置文件保險箱內文件夾桌面快捷方式的文章&#xff0c;歡迎大家分享點贊&#xff0c;點個在看和關注吧&#xff01;在日常…

LLM筆記(三)位置編碼(1)

位置編碼理論與應用 1. 位置編碼如何解決置換不變性及其數學表現 在Transformer模型中&#xff0c;自注意力機制&#xff08;Self-Attention&#xff09;具有置換不變性&#xff08;permutation invariance&#xff09;&#xff0c;這意味著對輸入序列的詞元&#xff08;toke…

在人臉識別項目中ffmpeg有什么作用

在人臉識別項目中&#xff0c;FFmpeg 主要用于處理視頻文件或流媒體數據。盡管 FFmpeg 本身并不是直接用于人臉識別的工具&#xff0c;但它通過其強大的多媒體處理能力&#xff0c;在很多方面間接支持了人臉識別任務的執行。以下是 FFmpeg 在人臉識別項目中的幾個主要作用&…