Python圖像處理之二值化處理
1、什么是二值化處理
我們都知道,圖像是由矩陣構(gòu)成,矩陣中每個點的RGB值都不一樣,呈現(xiàn)出來的色彩不一樣,最終整體呈現(xiàn)給我們的就是一張彩色的圖像。所謂”二值化處理“就是將矩陣中每個點的RGB值(0,0,0)[黑色]或者(255,255,255)[白色]
2、為什么要進行二值化處理
早期人們使用計算機處理圖像是,實在圖像灰度化處理的基礎(chǔ)上在進行操作的,但是當時的硬件水平不足,所以處理速度很慢,于是人們引入了圖像二值化處理。二值化處理使得原本顏色的取值范圍從256種變?yōu)?種,確實是提高了計算速度,但是丟失的信息也多了,因此具體采用什么方式處理,要根據(jù)具體情況來選擇。
3、如何進行二值化處理
(1)簡單閾值
簡單閾值是選取一個全局閾值,然后把整幅圖像分成非黑即白的二值圖像,灰度值大于閾值就賦為255反之為0。
ret,mask = cv2.threshold(img2gray,175,255,cv2.THRESH_BINAR)
返回值一: 閾值,(Otsu‘s二值化會用到)
返回值二: 處理以后的圖像
參數(shù)一: 初始圖像
參數(shù)二:我們自己設(shè)定的閾值
參數(shù)三: 當圖像像素置超過我們的設(shè)定的閾值時賦為255
參數(shù)四 : 我們設(shè)定的二值化類型
閾值 | 小于閾值 | 大于閾值 |
---|---|---|
THRESH_BINARY | 置0 | 置填充色 |
THRESH_BINARY_INV | 置填充色 | 0 |
THRESH_TRUNC | 保持原色 | 置灰色 |
THRESH_TOZERO | 置0 | 保持原色 |
THRESH_TOZERO_INV | 保持原色 | 置0 |
注:cv2.threshold最后一個參數(shù)可以寫為0,1,2,3,4按順序?qū)?yīng)表格中的五種
代碼如下
import cv2 import matplotlib.pyplot as plt img = cv2.imread('dog.jpeg', 0) # 直接讀為灰度圖像 ret, thresh1 = cv2.threshold(img, 127, 255, 0) ret, thresh2 = cv2.threshold(img, 127, 255, 1) ret, thresh3 = cv2.threshold(img, 127, 255, 2) ret, thresh4 = cv2.threshold(img, 127, 255, 3) ret, thresh5 = cv2.threshold(img, 127, 255, 4) titles = ['img', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV'] images = [img, thresh1, thresh2, thresh3, thresh4, thresh5] for i in range(6): plt.subplot(2, 3, i + 1), plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]), plt.yticks([]) plt.show()
注:將閾值大于127的像素值置為255
(2)自適應(yīng)閾值
簡單閾值的方式過于粗魯,自適應(yīng)閾值更趨向于局部性的閾值,也就是說,將像素點的像素值與該點所在的區(qū)域的像素值的平均值(最大值,中位數(shù)等)決定該店屬于0還是1
th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,0,11,2)
返回值: 處理后返回的圖像
參數(shù)一: 原始圖像
參數(shù)二:像素值上限
參數(shù)三:自適應(yīng)方法
— cv2.ADAPTIVE_THRESH_MEAN_C :領(lǐng)域內(nèi)均值
—cv2.ADAPTIVE_THRESH_GAUSSIAN_C :領(lǐng)域內(nèi)像素點加權(quán)和
參數(shù)四:賦值方式(參考簡單閾值中介紹的表格)
參數(shù)五:設(shè)定方陣的大?。ㄒ驗槭菍⒁粋€點與其周圍的方陣數(shù)據(jù)對比)
參數(shù)六:常數(shù),每個區(qū)域計算出的閾值的基礎(chǔ)上在減去這個常數(shù)作為這個區(qū)域的最終閾值,可以為負數(shù)
import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('dog.jpeg',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,0,11,2) th3 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,0,11,2) titles = ['Original Image', 'Global Thresholding (v = 127)', 'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding'] images = [img, th1, th2, th3] for i in range(4): plt.subplot(2,2,i+1),plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()
(3)Otsu’s二值化
對于簡單閾值,cv2.threshold()的第二個參數(shù)是我們自己設(shè)定的閾值范圍,一張圖片的最好的閾值分界線不是憑感覺看出來的,而是有合理的方式能找到的,threshold的第一個返回值就是處理圖片的閾值分界線。因此,只要在threshold函數(shù)的最后一個參數(shù)在原有的基礎(chǔ)上加上’cv2.THRESH_OTSU‘那么第一個返回值就是最佳閾值。直接看代碼更好理解。
注:OTSU非常適合灰度直方圖具有雙峰值的情況
import cv2 import matplotlib.pyplot as plt img = cv2.imread('cat.jpg', 0) # 直接讀為灰度圖像 # 簡單濾波 ret1, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) print(ret1) # Otsu 濾波 ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) print(ret2) plt.figure() plt.subplot(221), plt.imshow(img,'gray') plt.subplot(222), plt.hist(img.ravel(), 256) # .ravel方法將矩陣轉(zhuǎn)化為一維 plt.subplot(223), plt.imshow(th1,'gray') plt.subplot(224), plt.imshow(th2,'gray') plt.show()
4、參考文獻:
https://numpy.org/doc/stable/reference/generated/numpy.hstack.html
https://zhuanlan.zhihu.com/p/360824614
https://blog.csdn.net/jjddss/article/details/72841
https://blog.csdn.net/li_l_il/article/details/86767790
https://blog.csdn.net/JNingWei/article/details/77747959
https://blog.csdn.net/weixin_35732969/article/details/83779660
聲明:部分圖像源自網(wǎng)絡(luò),本文僅供學習交流使用,如果不妥,請聯(lián)系刪除。
到此這篇關(guān)于Python圖像處理之二值化處理的文章就介紹到這了,更多相關(guān)Python二值化處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
windows下python連接oracle數(shù)據(jù)庫
這篇文章主要為大家詳細介紹了windows下python連接oracle數(shù)據(jù)庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06Python實現(xiàn)數(shù)據(jù)的序列化操作詳解
在日常開發(fā)中,對數(shù)據(jù)進行序列化和反序列化是常見的數(shù)據(jù)操作,Python提供了兩個模塊方便開發(fā)者實現(xiàn)數(shù)據(jù)的序列化操作,即?json?模塊和?pickle?模塊。本文就為大家詳細講解這兩個模塊的使用,需要的可以參考一下2022-07-07Tensorflow分類器項目自定義數(shù)據(jù)讀入的實現(xiàn)
這篇文章主要介紹了Tensorflow分類器項目自定義數(shù)據(jù)讀入的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02通過Python實現(xiàn)Payload分離免殺過程詳解
這篇文章主要介紹了通過Python實現(xiàn)Payload分離免殺過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07