opencv閾值處理--threshold函數、自適應閾值處理、Otsu處理(大津法)

来源:https://www.cnblogs.com/pheasant/archive/2020/07/03/13232414.html
-Advertisement-
Play Games

opencv——threshold閾值處理、自適應閾值處理、otsu處理(大津法) ...


threshold函數

 

retval, dst = cv2.threshold(src, thresh, maxval, type)
'''
retval:返回的閾值;dst:閾值分割結果圖像
src:輸入圖像
thresh:閾值;maxval:需設定的最大值
type:閾值分割類型
'''

簡單的閾值分割類型有:

  • cv.THRESH_BINARY
  • cv.THRESH_BINARY_INV
  • cv.THRESH_TRUNC
  • cv.THRESH_TOZERO
  • cv.THRESH_TOZERO_INV
  1 import matplotlib.pyplot as plt
  2 import numpy as np
  3 import cv2 as cv
  4 
  5 img = cv.imread(r'Lena.png')
  6 imgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  7 t1, rst1 = cv.threshold(imgray,127,255,cv.THRESH_BINARY) # 二值化閾值處理。大於127的像素點會被處理為255,其餘處理為0
  8 t2, rst2 = cv.threshold(imgray,127,255,cv.THRESH_BINARY_INV) # 反二值化閾值處理。灰度值大於127的像素點處理為0,其餘為255
  9 t3, rst3 = cv.threshold(imgray,127,255,cv.THRESH_TRUNC) # 截斷閾值化處理。大於127的像素點處理為127,其餘保持不變
 10 t4, rst4 = cv.threshold(imgray,127,255,cv.THRESH_TOZERO_INV) # 超閾值零處理。大於127的像素點處理為0,其餘保持不變
 11 t5, rst5 = cv.threshold(imgray,127,255,cv.THRESH_TOZERO) # 低閾值零處理。大於127的像素點保持不變,其餘處理為0
 12 titles = ['Original','BINARY','BINARY_INV','TRUNC','TOZERO_INV','TOZERO']
 13 images = [imgray,rst1,rst2,rst3,rst4,rst5]
 14 for i in range(6):
 15     plt.subplot(2,3,i+1), plt.imshow(images[i],'gray')
 16     plt.title(titles[i])
 17     plt.xticks([]), plt.yticks([])
 18 plt.show()

效果圖

image

 

自適應閾值處理

 

上述閾值處理對於色彩均衡的圖像來說結果較為理想,但對於色彩不均衡的圖像來說,只使用一個閾值,無法得到較理想的閾值分割結果。自適應閾值處理通過計算每個像素點周圍臨近的加權平均值獲得閾值,能夠更好的處理由光照變化帶來影響的圖像。

dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
'''
src:輸入圖像。該圖像須是8位單通道圖像
maxValue:最大值
adaptiveMethod:自適應方法
thresholdType:閾值處理方式
blockSize:像素在計算其閾值時參考的鄰域尺寸大小,通常為3,5,7
C:常量
'''

閾值處理方法須為 cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV

自適應方法有 cv2.ADAPTIVE_THRESH_MEAN_C 和 cv2.ADAPTIVE_THRESH_GAUSSIAN_C 。前者領域所有像素點的權重值一致;後者與鄰域各個像素點到中心點的距離有關,通過高斯方程獲得各點的權重。

  1 import matplotlib.pyplot as plt
  2 import numpy as np
  3 import cv2 as cv
  4 
  5 img = cv.imread(r'exc.png')
  6 imgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  7 t, rst = cv.threshold(imgray,127,255,cv.THRESH_BINARY)
  8 athdMEAN = cv.adaptiveThreshold(imgray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,5,3)
  9 athdGAUS = cv.adaptiveThreshold(imgray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,5,3)
 10 titles = ['Original','Glbal Thresholding(v=127)','AdaptiveMean','AdaptiveGaussian']
 11 images = [imgray,rst,athdMEAN,athdGAUS]
 12 for i in range(4):
 13     plt.subplot(2,2,i+1)
 14     plt.imshow(images[i],'gray')
 15     plt.title(titles[i])
 16     plt.xticks([]), plt.yticks([])
 17 plt.show()

對一幅圖像分別使用二值化閾值處理和自適應閾值處理,效果圖:

image

 

Otsu處理(大津法)

 

當我們有一個圖像,其像素值矩陣如下矩陣時,此時將閾值設置為127時閾值處理的結果是失敗的。

image

但我們並不能觀察出最合適的閾值,Otsu處理能夠根據圖像給出最佳的分割閾值。

通過在函數 cv2.threshold() 中對 type 的類型多傳遞一個參數 cv2.THRESH_OTSU 即可實現Otsu。

註意在使用Otsu處理時需將閾值設為0。

  1 import numpy as np
  2 import cv2 as cv
  3 
  4 img = np.zeros((5,5),dtype=np.uint8)
  5 img[0:2,0:5] = 123
  6 img[2:5,0:5] = 126
  7 print('img=\n', img)
  8 t1, thd = cv.threshold(img,127,255,cv.THRESH_BINARY)
  9 t2, otsu = cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
 10 print('thd=\n', thd)
 11 print('otsu=\n', otsu)

對上述像素矩陣進行直觀處理

image

另外Otsu處理也返回了最佳閾值,上述該閾值為 t2 = 123。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、Java基礎知識 二、軟體 1. 軟體是什麼? 軟體=數據+指令[命令]+文檔 2. 軟體開髮指什麼? 軟體開發是根據用戶的需求創建出相應的軟體系統. 軟體開發是一個過程,包含需求的提取,需求分析,軟體的編寫,軟體測試. 三、人與電腦做交互 圖形化界面 vs 命令行方式 dir md rd c ...
  • 前言 剛回到家,又被公司群里的消息轟炸了。讓統計每個人最近是否去過石景山萬達廣場。 這基本上已經是每日必備了,只要有任何風吹草動,就需要我們填各種信息。 我們都知道,北京最近的疫情很不樂觀,從每天的數據就能看出來了。 也許很多小伙伴不在北京,是切實感受不到的。 就拿我自己舉例吧,在去公司的每一天,我 ...
  • 這篇博客還是整理從https://github.com/LyricTian/gin-admin 這個項目中學習的golang相關知識 作者在項目中使用了https://github.com/google/wire 做依賴註入,這個庫我之前沒有使用過,看了作者代碼中的使用,至少剛開始是看著優點懵,不知 ...
  • 轉載:https://blog.csdn.net/walkerJong/article/details/7946109 ...
  • # Definition for a binary tree node.class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = Nonea = TreeNode(1)b = TreeNode( ...
  • 編寫程式,讀取在1到100 之間的整數,然後計算每個數出現的次數。假定輸入是以0 結束的。 下麵是這個程式的一個運行示例: Write a program that reads the integers between 1and 100 and counts the occurrences of e ...
  • 安裝pandas 通過python pip安裝pandas pip install pandas pandas數據結構 pandas常用數據結構包括:Series和DataFrame Series Series是一種一維的數組型對象,包含一個值序列(與numpy中的數據類型相似),數據標簽(稱為索引 ...
  • pygame 圖像 / 圖形繪製 1. pygame 的圖像繪製 pygame 支持多種存儲圖像的方式(也就是圖片格式),例如 JPEG、PNG 等,具體支持 JPEG (一般擴展名為 .jpg 或者 .jpeg ,數位相機、網上的圖片基本上都是這種格式,這是一種有損壓縮方式,儘管對圖片的質量有所損 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...