計算機視覺(四):二值化

二值化,就是將圖像從彩色或灰度模式轉換為只有兩種顏色(通常是黑色和白色)的模式。這個過程的本質是設定一個閾值 (Threshold),將圖像中所有像素的灰度值與這個閾值進行比較。

基本原理

二值化的核心原理非常簡單:

  1. 灰度化:如果原始圖像是彩色的,首先需要將其轉換為灰度圖像。這是因為彩色圖像有三個通道(紅、綠、藍),而灰度圖像只有一個灰度通道,每個像素的值代表其亮度,從 0(最黑)到 255(最白)。
  2. 設定閾值:選擇一個介于 0 到 255 之間的數值作為閾值。這個閾值是二值化成功的關鍵。
  3. 像素比較與轉換:遍歷圖像中的每一個像素,執行以下操作:
    • 如果像素的灰度值大于設定的閾值,就將其灰度值設置為一個固定值(通常是 255,代表白色)。
    • 如果像素的灰度值小于或等于設定的閾值,就將其灰度值設置為另一個固定值(通常是 0,代表黑色)。

經過上述處理后,圖像中的所有像素都只剩下兩種可能的值:0 和 255,從而得到了一個黑白分明的二值化圖像。

為什么要進行二值化?

二值化是許多圖像處理和計算機視覺任務中的一個重要預處理步驟。它之所以重要,主要有以下幾個原因:

  • 簡化圖像數據:將圖像從多級灰度簡化為黑白兩色,極大地減少了數據量和處理的復雜性。這使得后續的算法(如邊緣檢測、輪廓提取)可以更快、更高效地運行。
  • 突出目標:通過合適的閾值,可以有效地將圖像中的前景目標(如文字、物體)從背景中分離出來,使其更加突出和易于識別。
  • 便于分析和識別:在光學字符識別(OCR)、條形碼識別、醫學圖像分析等領域,二值化是必不可少的步驟。它能幫助算法更準確地識別出字符或病變區域。

如何選擇合適的閾值?

選擇閾值是二值化的核心挑戰。錯誤的閾值會導致信息丟失或引入噪聲。根據不同的應用場景,選擇閾值的方法主要分為以下兩類:

  1. 全局閾值(Global Thresholding)
    • 概念:對整張圖像使用同一個固定的閾值。
    • 方法
      • 手動設置:根據經驗或對圖像的初步分析來設定一個固定的值。
      • 自動計算:通過算法自動尋找一個最優的閾值,例如大津法(Otsu’s method)。大津法的基本思想是找到一個閾值,使得前景和背景的方差最大化,從而實現最佳的分離效果。
    • 局限性:當圖像的光照不均勻時,全局閾值效果會很差。例如,如果圖像左側很亮而右側很暗,一個固定的閾值就無法同時正確地分離兩邊的目標。
  2. 局部閾值(Local/Adaptive Thresholding)
    • 概念:將圖像分割成許多小的區域,對每個小區域分別計算并應用不同的閾值。
    • 方法
      • 均值法(Mean):計算每個小區域內的像素平均值作為該區域的閾值。
      • 高斯法(Gaussian):在計算均值時,為中心像素附近的像素賦予更高的權重,從而得到一個加權平均值作為閾值。
    • 優勢:這種方法能很好地處理光照不均或背景復雜的情況,因為它能夠根據局部環境自動調整閾值。

灰度圖

灰度圖的本質

  • 單通道:彩色圖像通常有三個顏色通道(紅、綠、藍,即 RGB),每個像素由這三個通道的值組合而成,可以表示數百萬種顏色。而灰度圖只有一個通道,每個像素的值只代表其亮度灰度級別
  • 0-255 的數值:在 8 位灰度圖中,每個像素的取值范圍通常是 0 到 255。
    • 0 代表最黑。
    • 255 代表最白。
    • 0 到 255 之間的值則代表不同深淺的灰色,值越大,顏色越亮。
  • 黑白過渡:與只有純黑和純白的二值化圖像不同,灰度圖能夠平滑地表現出從黑到白的各種過渡,保留了圖像的更多細節信息。

為什么需要灰度圖?

將彩色圖轉換為灰度圖是許多圖像處理任務中的一個重要步驟,主要有以下幾個原因:

  1. 簡化數據:灰度圖的數據量比彩色圖小得多。彩色圖需要三個字節(RGB)來存儲一個像素,而灰度圖只需要一個字節。這可以大大減少存儲空間和處理時間。
  2. 突出亮度信息:在許多視覺任務中,例如邊緣檢測、輪廓識別、物體追蹤等,算法主要依賴于圖像的亮度或明暗變化。將圖像轉換為灰度圖可以去除不必要的顏色信息,使算法能更專注于分析亮度差異,從而提高效率和準確性。
  3. 預處理步驟:在進行二值化、直方圖均衡化等操作之前,通常需要先將圖像轉換為灰度圖。

如何從彩色圖得到灰度圖?

將一張彩色圖片轉換為灰度圖,最常見的方法是根據人眼對不同顏色的敏感度,對 RGB 三個通道的值進行加權平均

一個常用的轉換公式是:

灰度值=0.299×紅色值+0.587×綠色值+0.114×藍色值

這個公式反映了人眼對綠色最敏感,其次是紅色,對藍色最不敏感。OpenCV 等庫在進行彩色到灰度轉換時,通常會采用類似的加權平均方法。

如果是YUV 轉換為灰度圖,由于 Y 分量本身就直接代表了圖像的亮度信息,而灰度圖的本質就是亮度圖,因此,從 YUV 轉換為灰度圖只需要提取 Y 分量即可。

OpenCV實現YUV到灰度圖的轉換

import cv2
import numpy as np# 1. 加載一張彩色圖像 (OpenCV默認以 BGR 格式讀取)
bgr_img = cv2.imread('your_image_path.jpg')# 檢查圖像是否成功加載
if bgr_img is None:print("Error: Could not read the image.")
else:# 2. 將 BGR 圖像轉換為 YUV 格式# OpenCV 使用 YUV 而非 YCbCr,但原理相同yuv_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2YUV)# 3. 提取 Y 分量(亮度通道),作為灰度圖# Y 分量是 YUV 圖像的第一個通道gray_img = yuv_img[:,:,0]# 4. 顯示原始彩色圖像和生成的灰度圖像cv2.imshow('Original BGR Image', bgr_img)cv2.imshow('Gray Image from Y Channel', gray_img)# 等待按鍵,然后關閉所有窗口cv2.waitKey(0)cv2.destroyAllWindows()

opencv實現二值化

cv2.threshold() 函數

ret, dst = cv2.threshold(src, thresh, maxval, type)

參數解釋:

  • src: 原始圖像,必須是灰度圖
  • thresh: 設定的閾值
  • maxval: 當像素值超過(或低于)閾值時,所賦予的最大值。通常是 255。
  • type: 值的類型,決定了如何應用閾值。這是最關鍵的參數,常用的類型包括:
    • cv2.THRESH_BINARY: 最基礎的二值化。如果像素值大于 thresh,則設置為 maxval;否則設置為 0。
    • cv2.THRESH_BINARY_INV: 與 THRESH_BINARY 相反。如果像素值大于 thresh,則設置為 0;否則設置為 maxval
    • cv2.THRESH_TRUNC: 截斷。如果像素值大于 thresh,則設置為 thresh;否則保持不變。
    • cv2.THRESH_TOZERO: 如果像素值大于 thresh,則保持不變;否則設置為 0。
    • cv2.THRESH_TOZERO_INV: 與 THRESH_TOZERO 相反。如果像素值大于 thresh,則設置為 0;否則保持不變。

返回值:

  • ret: 設定的閾值。當使用 Otsu’s 或 Triangle 方法時,返回的是自動計算出的閾值。
  • dst: 二值化后的圖像

實現基礎二值化

import cv2
import numpy as np# 1. 加載圖像并轉換為灰度圖
img = cv2.imread('your_image_path.jpg', cv2.IMREAD_GRAYSCALE)# 檢查圖像是否成功加載
if img is None:print("Error: Could not read the image.")
else:# 2. 設定閾值并進行二值化處理# 設定閾值為127,最大值為255ret, binary_img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)# 打印返回的閾值(這里會是127)print(f"Threshold value returned: {ret}")# 3. 顯示原始圖像和二值化后的圖像cv2.imshow('Original Grayscale Image', img)cv2.imshow('Binary Image', binary_img)# 等待按鍵,然后關閉所有窗口cv2.waitKey(0)cv2.destroyAllWindows()

使用 Otsu’s 方法自動尋找閾值

import cv2
import numpy as np# 1. 加載圖像并轉換為灰度圖
img = cv2.imread('your_image_path.jpg', cv2.IMREAD_GRAYSCALE)if img is None:print("Error: Could not read the image.")
else:# 2. 使用 Otsu's 方法進行自動二值化# 注意:這里閾值參數傳入 0,類型與 cv2.THRESH_OTSU 按位或ret, binary_otsu = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 打印 Otsu's 算法自動計算出的閾值print(f"Otsu's threshold value: {ret}")# 3. 顯示圖像cv2.imshow('Original Grayscale Image', img)cv2.imshow('Otsu\'s Binary Image', binary_otsu)cv2.waitKey(0)cv2.destroyAllWindows()

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

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

相關文章

(二)設計模式(Command)

文章目錄項目地址一、設計模式1.1 Command Design1. 創建命令接口2. 創建支付的Command類3. CommandScheduler4. 使用1.2 Chain of Responsibility1. 接口創建2. 審批人3. 發起審批1.3 State Pattern1. 創建簡單的狀態機定義動作和狀態狀態機使用狀態機1.x Iterator1.x Observe…

現代C++性能陷阱:std::function的成本、異常處理的真實開銷

1. std::function 的成本 std::function 是一個通用的、類型擦除的函數包裝器,它非常方便,可以存儲和調用任何可調用對象(函數、lambda、函數對象、bind表達式等)。然而,這種靈活性是有代價的。 主要成本來源&#xff…

基于Spark的白酒行業數據分析與可視化系統的設計與實現

文章目錄有需要本項目的代碼或文檔以及全部資源,或者部署調試可以私信博主項目介紹一、項目背景與研究意義二、系統整體架構三、系統功能設計四、應用場景與價值五、項目特色與創新點六、總結與展望每文一語有需要本項目的代碼或文檔以及全部資源,或者部…

織夢會員中心模板調用某個欄目名和欄目下文檔的辦法

大家在用到織夢dedecms時候,需要在會員中心模板調用欄目的名稱和鏈接,還有某個欄目下的文檔要怎么操作呢? 我們都知道,在會員中心模板,直接用dede:type或者dede:arclist標簽是不行的,在會員中心調用只能用p…

區塊鏈的法律定位:技術、工具還是資產?

高鵬律師首席數據官,數字經濟團隊創作AI輔助當我們談論區塊鏈時,我們在談論什么?是那串不可篡改的哈希值,是去中心化的信仰圖騰,還是藏在代碼背后的權利密碼?今天,我們不聊技術迭代的炫酷&#…

LeetCode每日一題,2025-8-31

dfs搜索解數獨,重點是如何判斷當前這位置的board[x][y]是否可以填數字num public class T37 {public static void main(String[] args) {char[][] board new char[][]{{5, 3, ., ., 7, ., ., ., .},{6, ., ., 1, 9, 5, ., ., .},{., 9, 8, ., ., ., ., 6, .},{8, …

Linux 進程信號學習筆記:從概念到實操

一、Linux 信號基本概念1.1 生活角度理解信號我們可以把進程比作等待快遞的人,信號就像快遞:識別信號:就像我們知道快遞來了該 怎么處理,進程對信號的識別是內核程序員預先編寫的內置特性,即使信號沒產生,進…

解決多種類潮濕敏感元器件的多溫度、多時長的排潮烘干

鎧德科技ESD烘箱針對復雜電路產品的排潮烘干需求,可通過以下技術路徑實現多品類元器件的高效兼容處理:多溫區獨立控制系統采用蜂窩式加熱模塊陣列,每個0.6m獨立溫區可設置1℃精度支持同時運行3種不同溫度曲線(典型值:8…

obdumper和obloader遷移OceanBase業務庫(一):實施手冊

obdumper和obloader遷移OceanBase業務庫(一):實施手冊導出前準備全庫(模式)數據導出全庫(模式)數據導入導入后檢查環境信息:OceanBase v4.3.5單機部署,MySQL租戶OBDUMPER…

SQLSugar 快速入門:從基礎到實戰查詢與使用指南

目錄 ?編輯 一、SQLSugar 簡介 二、SQLSugar 環境搭建 2.1 安裝 SQLSugar 2.1.1 通過 Visual Studio NuGet 圖形化界面安裝 2.1.2 通過 NuGet 命令行安裝 2.2 引用 SQLSugar 命名空間 三、SQLSugar 核心初始化配置 3.1 基礎初始化(非 IOC 模式&#xff09…

Python與Rust語法對比詳解:從入門到精通

Python與Rust語法對比詳解:從入門到精通 前言 Python和Rust作為當今最受關注的編程語言,分別代表了動態類型和靜態類型語言的典型特征。本文將從語法層面深入對比這兩種語言,幫助開發者理解它們的設計理念和使用場景。1. 基礎語法結構 1.1 He…

視頻加水印_帶gif 加動態水印 gif水印 視頻浮動水印

如果你有一個視頻,你想給它加一個水印,讓水印浮動,而且加的還是 GIF 動態圖片水印,那么你可以使用這個工具。首先把你的兩個文件拖進來,然后點擊第三個按鈕。加好了,打開看一下,我們看到這個水印…

C# 字符和字符串

原文:C# 字符和字符串_w3cschool 請勿將文章標記為付費!!!!! C#字符和字符串 C#的 char 類型別名 System.Char 類型表示 Unicode 字符。 在單引號中指定char字面值: …

IntelliJ IDEA 反編譯JAR包記錄

本文記錄了使用 IntelliJ IDEA 內置反編譯工具對 JAR 包進行反編譯的詳細步驟,方便日后快速參考和使用。 🛠? 工具準備 反編譯工具使用的是 IntelliJ IDEA 內置的 Java 反編譯器,無需額外安裝其他工具。 工具路徑: /Applications…

KingbaseES JDBC 驅動詳解:連接、配置與最佳實踐

目錄KingbaseES JDBC 驅動詳解:連接、配置與最佳實踐引言一、JDBC 基礎與 KingbaseES 實現1.1 JDBC 技術概述1.2 KingbaseES JDBC 驅動特點二、環境配置與驅動獲取2.1 驅動包選擇與依賴管理2.2 國密算法支持2.3 驅動版本信息獲取三、數據庫連接管理3.1 使用 DriverM…

破解 Aspose.Words 24.12,跳過 License 校驗,實現 HTML 向 Word/PDF 的轉換,附帶 Demo。

說明 在Java生態中處理Office文檔時,開發人員常面臨格式兼容性和功能完整性的挑戰。商業組件Aspose以其卓越的文檔處理能力成為企業級解決方案之一,支持Word、Excel、PDF等多種格式的精準轉換與操作。 請勿用于商業用途,若侵權請聯系我。 參考…

php連接rabbitmq例子

首先確保安裝好了Rabbitmq服務器。1.新建一個空白php項目&#xff0c;安裝php客戶端庫&#xff1a;composer require php-amqplib/php-amqplib2.生產者然后添加生產者代碼 (producer.php)<?php require_once __DIR__ . /vendor/autoload.php;use PhpAmqpLib\Connection\AMQ…

Docker Swarm vs Kubernetes vs Nomad:容器編排方案對比與選型建議

Docker Swarm vs Kubernetes vs Nomad&#xff1a;容器編排方案對比與選型建議 在微服務和云原生時代&#xff0c;容器編排成為支持大規模容器化應用的關鍵技術。本文將從問題背景、方案對比、優缺點分析、選型建議以及實際應用效果驗證五個方面&#xff0c;對Docker Swarm、Ku…

似然函數對數似然函數負對數似然函數

目錄1. 似然函數的定義2. 對數似然函數的定義3. 負對數似然函數的定義4. 負對數似然函數的優化5. 具體應用示例5.1 邏輯回歸中的負對數似然函數5.2 優化邏輯回歸的負對數似然函數1. 似然函數的定義 似然函數L(θ∣X)L(\theta | X)L(θ∣X)是在給定參數θ\thetaθ 下&#xff0…

鴻蒙地址選擇庫(ArkTs UI)

功能點&#xff1a;支持三級聯動、點擊確認返回省市區code及name&#xff08;安心&#xff09;、布局可以高度自定義 實現&#xff1a;TextPicker讀取本地json&#xff08;也可用第三方的json 不過需要自行調整了&#xff09; 先上圖吧、廢話下面再說&#xff1a; 湊和看吧、…