OpenCV-圖像閾值

簡單閾值法

????????此方法是直截了當的。如果像素值大于閾值,則會被賦為一個值(可能為白色),否則會賦為另一個值(可能為黑色)。使用的函數是 cv.threshold。第一個參數是源圖像,它應該是灰度圖像。第二個參數是閾值,用于對像素值進行分類。第三個參數是 maxval,它表示像素值大于(有時小于)閾值時要給定的值。opencv 提供了不同類型的閾值,由函數的第四個參數決定。不同的類型有:

  • cv.THRESH_BINARY
  • cv.THRESH_BINARY_INV
  • cv.THRESH_TRUNC
  • cv.THRESH_TOZERO
  • cv.THRESH_TOZERO_INV

獲得兩個輸出。第一個是 retval,稍后將解釋。第二個輸出是我們的閾值圖像。

代碼如下:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('gradient.png',0)
ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
ret,thresh2 = cv.threshold(img,127,255,cv.THRESH_BINARY_INV)
ret,thresh3 = cv.threshold(img,127,255,cv.THRESH_TRUNC)
ret,thresh4 = cv.threshold(img,127,255,cv.THRESH_TOZERO)
ret,thresh5 = cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in xrange(6):plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])
plt.show()

結果如下所示:

?

e89187f36837ba003d5c183d38f0f2e9.png

自適應閾值

????????在前一節中,我們使用一個全局變量作為閾值。但在圖像在不同區域具有不同照明條件的條件下,這可能不是很好。在這種情況下,我們采用自適應閾值。在此,算法計算圖像的一個小區域的閾值。因此,我們得到了同一圖像不同區域的不同閾值,對于不同光照下的圖像,得到了更好的結果。

它有三個“特殊”輸入參數,只有一個輸出參數。

Adaptive Method-它決定如何計算閾值。

  • cv.ADAPTIVE_THRESH_MEAN_C?閾值是指鄰近地區的平均值。
  • cv.ADAPTIVE_THRESH_GAUSSIAN_C?閾值是權重為高斯窗的鄰域值的加權和。

Block Size-它決定了計算閾值的窗口區域的大小。

C-它只是一個常數,會從平均值或加權平均值中減去該值。

下面的代碼比較了具有不同照明的圖像的全局閾值和自適應閾值:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('sudoku.png',0)
img = cv.medianBlur(img,5)
ret,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,\cv.THRESH_BINARY,11,2)
th3 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,\cv.THRESH_BINARY,11,2)
titles = ['Original Image', 'Global Thresholding (v = 127)','Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in xrange(4):plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])
plt.show()

結果如下所示:

?

c159b23f85161d1ff2de9764ab7aaa87.png

Otsu 二值化

????????在全局閾值化中,我們使用一個任意的閾值,那么,我們如何知道我們選擇的值是好的還是不好的呢?答案是,試錯法。但是考慮一個雙峰圖像(簡單來說,雙峰圖像是一個直方圖有兩個峰值的圖像)。對于那個圖像,我們可以近似地取這些峰值中間的一個值作為閾值,這就是 Otsu 二值化所做的。所以簡單來說,它會自動從雙峰圖像的圖像直方圖中計算出閾值。(對于非雙峰圖像,二值化將不準確。)

????????為此,我們使用了?cv.threshold?函數,但傳遞了一個額外的符號?cv.THRESH_OTSU?。對于閾值,只需傳入零。然后,該算法找到最佳閾值,并作為第二個輸出返回 retval。如果不使用 otsu 閾值,則 retval 與你使用的閾值相同。

????????查看下面的示例。輸入圖像是噪聲圖像。在第一種情況下,我應用了值為 127 的全局閾值。在第二種情況下,我直接應用 otsu 閾值。在第三種情況下,我使用 5x5 高斯核過濾圖像以去除噪聲,然后應用 otsu 閾值。查看噪聲過濾如何改進結果。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('noisy2.png',0)
# 全局閾值
ret1,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
# Otsu 閾值
ret2,th2 = cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
# 經過高斯濾波的 Otsu 閾值
blur = cv.GaussianBlur(img,(5,5),0)
ret3,th3 = cv.threshold(blur,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
# 畫出所有的圖像和他們的直方圖
images = [img, 0, th1,img, 0, th2,blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)','Original Noisy Image','Histogram',"Otsu's Thresholding",'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
for i in xrange(3):plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show()

結果如下:

?

0a80fe425de5290839313152e500ee41.png

?

?

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

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

相關文章

力扣300.最長遞增子序列

題目描述 題目鏈接300. 最長遞增子序列 給你一個整數數組 nums ,找到其中最長嚴格遞增子序列的長度。 子序列 是由數組派生而來的序列,刪除(或不刪除)數組中的元素而不改變其余元素的順序。例如,[3,6,2,7] 是數組 […

Vue CLI的作用

Vue CLI(Command Line Interface)是一個基于Vue.js的官方腳手架工具,其主要作用是幫助開發者快速搭建Vue項目的基礎結構和開發環境。以下是Vue CLI的具體作用: 1、項目模板與快速生成 Vue CLI提供了一系列預設的項目模板&#x…

【藍橋杯每日一題】掃雷

掃雷 知識點 2024-12-3 藍橋杯每日一題 掃雷 dfs (bfs也是可行的) 題目大意 在一個二維平面上放置這N個炸雷,每個炸雷的信息有$(x_i,y_i,r_i) $,前兩個是坐標信息,第三個是爆炸半徑。然后會輸入M個排雷火箭&#xff0…

【大數據學習 | 面經】Spark 3.x 中的AQE(自適應查詢執行)

Spark 3.x 中的自適應查詢執行(Adaptive Query Execution,簡稱 AQE)通過多種方式提升性能,主要包括以下幾個方面: 動態合并 Shuffle 分區(Coalescing Post Shuffle Partitions): 當 …

城電科技 | 光伏景觀長廊 打造美麗鄉村綠色低碳示范區 光伏景觀設計方案

光伏景觀長廊是一種結合了光伏發電技術和零碳景觀設計的新型公共公共設施,光伏景觀長廊頂上的光伏板不僅可以為周邊用電設備提供清潔電能,而且還能作為遮陽設施使用,為人們提供一個美麗又實用的休閑娛樂空間。 光伏景觀長廊建設對打造美麗鄉…

開發系統準備與開發環境配置總結

開發前系統配置及環境搭建 系統配置0 Github打不開、速度慢怎么辦1 WSL、Linux、Ubuntu、Docker都是什么鬼2 在Windows下安裝WSL和Ubuntu3 配置MySQL4 配置Redis并啟動服務5 Docker(Windows和Ubuntu下)6 Nginx 系統配置 你好! 這是你第一次使…

uniapp 添加loading

在uniapp中添加loading可以使用uni的API uni.showLoading 方法。以下是一個簡單的示例代碼 // 顯示loading uni.showLoading({title: 加載中 });// 假設這里是異步操作,比如網絡請求 setTimeout(function () {// 隱藏loadinguni.hideLoading(); }, 2000);

C++(九)

前言: 本文主要講述運算符的優先順序。 一,運算符的優先級。 請看以下表達式: a32*5 運算結果為:13. 可以看到,在此代碼中,先運行了2*5的結果,在此基礎上在進行3操作,因此結果…

Android 拍照(有無存儲權限兩種方案,兼容Q及以上版本)

在某些行業,APP可能被禁止使用存儲權限,或公司在寫SDK功能,不方便獲取權限 所以需要有 無存儲權限拍照方案。這里兩種方案都列出里。 對于寫入權限,在高版本中,已經廢棄, 不可用文件寫入讀取權限&#xf…

【Altium Designer 】AD如何使用嘉立創元器件的3D封裝

1.下載3D封裝 以STM32F407VGT6為例,進入嘉立創商城網站,找到需要的元器件封裝 復制編號,打開嘉立創EDA,編譯器選擇專業版,新建工程,點擊PCB1 復制編號在搜索框中,點擊搜索,然后放置…

爬蟲運行后數據如何存儲?

爬蟲運行后獲取的數據可以存儲在多種不同的存儲系統中,具體選擇取決于數據的規模、查詢需求以及應用場景。以下是一些常見的數據存儲方法: 1. 文件系統 對于小型項目或臨時數據存儲,可以直接將數據保存到本地文件中。常見的文件格式包括&…

【機器學習】機器學習的基本分類-監督學習-梯度提升樹(Gradient Boosting Decision Tree, GBDT)

梯度提升樹是一種基于**梯度提升(Gradient Boosting)**框架的機器學習算法,通過構建多個決策樹并利用每棵樹擬合前一棵樹的殘差來逐步優化模型。 1. 核心思想 Boosting:通過逐步調整模型,使后續的模型重點學習前一階段…

【機器學習 | 基于Lasso回歸和隨機森林的上海鏈家二手房房價預測】

文章目錄 🏳??🌈 1. 導入模塊🏳??🌈 2. Pandas數據處理2.1 讀取數據2.2 查看數據信息2.3 去除重復數據2.4 去除缺失數據2.5 面積、價格、單價、樓層、建筑時間數據提取2.6 朝向數據處理 🏳??🌈 3. 特…

【HarmonyOS NEXT】flexShrink屬性

一、背景 希望達到的布局效果是文字與按鈕左右對齊,居中顯示,但實際效果中按鈕的顯示與效果不符,如下圖所示 二、問題 按鈕是用row組件包裹的text,左右padding給的是一樣的大小,但是明顯右邊padding會比左邊padding大…

CentOS 7 上安裝 MySQL 8.0.40 (二進制安裝)

要在 CentOS 7 上安裝 MySQL 8.0.40,按照以下步驟操作: 下載安裝包。 https://dev.mysql.com/downloads/mysql/ 下載之前查看系統c版本 解壓安裝包 首先,解壓下載的 .tar.xz 安裝包。 cd /path/to/your/downloads tar -xvf mysql-8.0…

PHP語法學習(第六天)

💡依照慣例,回顧一下昨天講的內容 PHP語法學習(第五天)主要講了PHP中的常量和運算符的運用。 🔥 想要學習更多PHP語法相關內容點擊“PHP專欄” 今天給大家講課的角色是🍍菠蘿吹雪,“我菠蘿吹雪吹的不是雪,而…

Python Web 開發:使用 FastAPI 進行依賴注入與異常處理

Python Web 開發:使用 FastAPI 進行依賴注入與異常處理 目錄 🛠? 依賴注入與 FastAPI 高級特性?? 自定義異常類的實現與應用🚨 使用 HTTPException 處理常見錯誤🌍 全局異常處理器的設計與實現?? 異常處理與 API 響應的整合…

免押租賃系統助力資源共享新模式開創便捷租賃體驗

內容概要 免押租賃系統,聽起來是不是很酷?這個新模式不僅僅是為了讓你少花點錢,它的到來簡直就是個革命!以前,租東西時首先想到的就是那個令人心痛的押金,對吧?但現在,免押租賃系統…

oracle之用戶的相關操作

(1)創建用戶(sys用戶下操作) 簡單創建用戶如下: CREATE USER username IDENTIFIED BY password; 如果需要自定義更多的信息,如用戶使用的表空間等,可以使用如下: CREATE USER mall IDENTIFIED BY 12345…

第77期 | GPTSecurity周報

GPTSecurity是一個涵蓋了前沿學術研究和實踐經驗分享的社區,集成了生成預訓練Transformer(GPT)、人工智能生成內容(AIGC)以及大語言模型(LLM)等安全領域應用的知識。在這里,您可以找…