OpenCV圖像處理之圖像的二值化解讀
圖像二值化( Image Binarization)就是將圖像上的像素點(diǎn)的灰度值設(shè)置為0或255,也就是將整個(gè)圖像呈現(xiàn)出明顯的黑白效果的過程。
二值化的原理
import cv2 img = cv2.imread('img/lena.jpg') # 轉(zhuǎn)為灰度圖 new_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) height, width = new_img.shape[0:2] # 設(shè)置閾值 thresh = 60 # 遍歷每一個(gè)像素點(diǎn) for row in range(height): for col in range(width): # 獲取到灰度值 gray = new_img[row, col] # 如果灰度值高于閾值 就等于255最大值 if gray > thresh: new_img[row, col] = 255 # 如果小于閾值,就直接改為0 elif gray < thresh: new_img[row, col] = 0 cv2.imshow('img', new_img) cv2.waitKey()
OpenCV提供的圖像二值化API
threshold()方法參數(shù):
- 圖片矩陣
- 閾值
- 圖片中的最大值
- 二值化的方式
二值化的方式:
THRESH_BINARY | 高于閾值改為255,低于閾值改為0 |
---|---|
THRESH_BINARY_INV | 高于閾值改為0,低于閾值改為255 |
THRESH_TRUNC | 截?cái)?高于閾值改為閾值,最大值失效 |
THRESH_TOZERO | 高于閾值不改變,低于閾值改為0 |
THRESH_TOZERO_INV | 高于閾值該為0,低于閾值不改變 |
import cv2 img = cv2.imread('img/lena.jpg', cv2.IMREAD_GRAYSCALE) thresh, new_img = cv2.threshold(img, 60, 255, cv2.THRESH_BINARY) print(thresh) cv2.imshow('img', img) cv2.imshow('NEW_IMG', new_img) cv2.waitKey()
自適應(yīng)閾值
使用一個(gè)全局值作為閾值。但是在所有情況下這可能都不太好。
如果圖像在不同區(qū)域具有不同的照明條件。
在這種情況下,自適應(yīng)閾值閾值可以幫助。這里,算法基于其周圍的小區(qū)域確定像素的閾值。
因此,我們?yōu)橥粓D像的不同區(qū)域獲得不同的閾值,這為具有不同照明的圖像提供了更好的結(jié)果。
adaptlive()方法參數(shù):
- 1.圖片矩陣
- 2.圖片灰度最大值
- 3.計(jì)算閾值的方法
- 4.閾值類型
- 5.處理塊大小
- 6.算法所用的常量C
cv2.ADAPTIVE_THRESH_MEAN_C
:該閾值是該附近區(qū)域減去恒定的平均Ç。
cv2.ADAPTIVE_THRESH_GAUSSIAN_C
:閾值是鄰域值減去常數(shù)C的高斯加權(quán)和。
import cv2 img = cv2.imread('img/lena.jpg', cv2.IMREAD_GRAYSCALE) thresh_img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 5) cv2.imshow('thresh_img', thresh_img) cv2.waitKey()
大津算法(最大類間方差法)
圖像分割中閾值選取的最佳算法
threshold(gaussian_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
import cv2 img = cv2.imread('img/lena.jpg', cv2.IMREAD_GRAYSCALE) # 使用255的閾值進(jìn)行二值化 ret, thresh_img = cv2.threshold(img, 255, 255, cv2.THRESH_BINARY) cv2.imshow('normal', thresh_img) # 使用高斯濾波模糊圖像 參數(shù)1: 圖片矩陣 參數(shù)2:卷積核 參數(shù)3: 越大越模糊 gaussian_img = cv2.GaussianBlur(img, (5, 5), 0) cv2.imshow('gaussian_img', gaussian_img) # 使用大津算法0閾值二值化經(jīng)過高斯濾波模糊后的圖像 ret, thresh_img = cv2.threshold(gaussian_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) cv2.imshow('otsu', thresh_img) cv2.imshow('img', img) cv2.waitKey()
原圖:
使用255的閾值進(jìn)行二值化 圖片全黑了:
使用高斯濾波模糊圖像:
圖片矩陣卷積核越大越模糊
使用0閾值的大津算法二值化經(jīng)過高斯濾波模糊后的圖像:
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python thread 并發(fā)且順序運(yùn)行示例
以上源文件是對(duì)python中的線程的一個(gè)簡單應(yīng)用,實(shí)現(xiàn)了對(duì)并發(fā)線程的順序運(yùn)行,也許對(duì)你會(huì)有小小幫助2009-04-04Matplotlib繪圖基礎(chǔ)之坐標(biāo)軸詳解
Matplotlib的坐標(biāo)軸是用于在繪圖中表示數(shù)據(jù)的位置的工具,也是為了幫助觀察者了解圖像中數(shù)據(jù)的位置和大小,下面小編就來和大家詳細(xì)聊聊Matplotlib繪圖時(shí)坐標(biāo)軸的具體使用吧2023-07-07關(guān)于你不想知道的所有Python3 unicode特性
我的讀者知道我是一個(gè)喜歡痛罵Python3 unicode的人。這次也不例外。我將會(huì)告訴你用unicode有多痛苦和為什么我不能閉嘴。我花了兩周時(shí)間研究Python3,我需要發(fā)泄我的失望。在這些責(zé)罵中,仍然有有用的信息,因?yàn)樗涛覀內(nèi)绾蝸硖幚鞵ython3。如果沒有被我煩到,就讀一讀吧2014-11-11ubuntu20.04運(yùn)用startup application開機(jī)自啟動(dòng)python程序的腳本寫法
這篇文章主要介紹了ubuntu20.04運(yùn)用startup application開機(jī)自啟動(dòng)python程序的腳本寫法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-10-10Pandas中DataFrame的分組/分割/合并的實(shí)現(xiàn)
這篇文章主要介紹了Pandas中DataFrame的分組/分割/合并的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07python-jwt用戶認(rèn)證食用教學(xué)的實(shí)現(xiàn)方法
這篇文章主要介紹了python-jwt用戶認(rèn)證食用教學(xué)的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01如何使用python傳入不確定個(gè)數(shù)參數(shù)
這篇文章主要介紹了如何使用python傳入不確定個(gè)數(shù)參數(shù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02