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
  • 下麵是一個標準的IDistributedCache用例: public class SomeService(IDistributedCache cache) { public async Task<SomeInformation> GetSomeInformationAsync (string na ...
  • 這個庫提供了在啟動期間實例化已註冊的單例,而不是在首次使用它時實例化。 單例通常在首次使用時創建,這可能會導致響應傳入請求的延遲高於平時。在註冊時創建實例有助於防止第一次Request請求的SLA 以往我們要在註冊的時候實例單例可能會這樣寫: //註冊: services.AddSingleton< ...
  • 最近公司的很多項目都要改單點登錄了,不過大部分都還沒敲定,目前立刻要做的就只有一個比較老的項目 先改一個試試手,主要目標就是最短最快實現功能 首先因為要保留原登錄方式,所以頁面上的改動就是在原來登錄頁面下加一個SSO登錄入口 用超鏈接寫的入口,頁面改造後如下圖: 其中超鏈接的 href="Staff ...
  • Like運算符很好用,特別是它所提供的其中*、?這兩種通配符,在Windows文件系統和各類項目中運用非常廣泛。 但Like運算符僅在VB中支持,在C#中,如何實現呢? 以下是關於LikeString的四種實現方式,其中第四種為Regex正則表達式實現,且在.NET Standard 2.0及以上平... ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他們的程式記憶體會偶發性暴漲,自己分析了下是非托管記憶體問題,讓我幫忙看下怎麼回事?哈哈,看到這個dump我還是非常有興趣的,居然還有這種游戲幣自助機類型的程式,下次去大玩家看看他們出幣的機器後端是不是C#寫的?由於dump是linux上的程式,剛好win ...
  • 前言 大家好,我是老馬。很高興遇到你。 我們為 java 開發者實現了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何處理的,可以參考我的另一個項目: 手寫從零實現簡易版 tomcat minicat 手寫 ngin ...
  • 上一次的介紹,主要圍繞如何統一去捕獲異常,以及為每一種異常添加自己的Mapper實現,並且我們知道,當在ExceptionMapper中返回非200的Response,不支持application/json的響應類型,而是寫死的text/plain類型。 Filter為二方包異常手動捕獲 參考:ht ...
  • 大家好,我是R哥。 今天分享一個爽飛了的面試輔導 case: 這個杭州兄弟空窗期 1 個月+,面試了 6 家公司 0 Offer,不知道問題出在哪,難道是杭州的 IT 崩盤了麽? 報名面試輔導後,經過一個多月的輔導打磨,現在成功入職某上市公司,漲薪 30%+,955 工作制,不咋加班,還不捲。 其他 ...
  • 引入依賴 <!--Freemarker wls--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.30</version> </dependency> ...
  • 你應如何運行程式 互動式命令模式 開始一個互動式會話 一般是在操作系統命令行下輸入python,且不帶任何參數 系統路徑 如果沒有設置系統的PATH環境變數來包括Python的安裝路徑,可能需要機器上Python可執行文件的完整路徑來代替python 運行的位置:代碼位置 不要輸入的內容:提示符和註 ...