1、什么是二值化處理
我們都知道,圖像是由矩陣構成,矩陣中每個點的RGB值都不一樣,呈現(xiàn)出來的色彩不一樣,最終整體呈現(xiàn)給我們的就是一張彩色的圖像。所謂”二值化處理“就是將矩陣中每個點的RGB值(0,0,0)[黑色]或者(255,255,255)[白色]
2、為什么要進行二值化處理
早期人們使用計算機處理圖像是,實在圖像灰度化處理的基礎上在進行操作的,但是當時的硬件水平不足,所以處理速度很慢,于是人們引入了圖像二值化處理。二值化處理使得原本顏色的取值范圍從256種變?yōu)?種,確實是提高了計算速度,但是丟失的信息也多了,因此具體采用什么方式處理,要根據(jù)具體情況來選擇。
3、如何進行二值化處理
(1)簡單閾值
簡單閾值是選取一個全局閾值,然后把整幅圖像分成非黑即白的二值圖像,灰度值大于閾值就賦為255反之為0。
ret,mask = cv2.threshold(img2gray,175,255,cv2.THRESH_BINAR)
返回值一: 閾值,(Otsu‘s二值化會用到)
返回值二: 處理以后的圖像
參數(shù)一: 初始圖像
參數(shù)二:我們自己設定的閾值
參數(shù)三: 當圖像像素置超過我們的設定的閾值時賦為255
參數(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按順序對應表格中的五種
代碼如下
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)自適應閾值
簡單閾值的方式過于粗魯,自適應閾值更趨向于局部性的閾值,也就是說,將像素點的像素值與該點所在的區(qū)域的像素值的平均值(最大值,中位數(shù)等)決定該店屬于0還是1
th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,0,11,2)
返回值: 處理后返回的圖像
參數(shù)一: 原始圖像
參數(shù)二:像素值上限
參數(shù)三:自適應方法
— cv2.ADAPTIVE_THRESH_MEAN_C :領域內均值
—cv2.ADAPTIVE_THRESH_GAUSSIAN_C :領域內像素點加權和
參數(shù)四:賦值方式(參考簡單閾值中介紹的表格)
參數(shù)五:設定方陣的大?。ㄒ驗槭菍⒁粋€點與其周圍的方陣數(shù)據(jù)對比)
參數(shù)六:常數(shù),每個區(qū)域計算出的閾值的基礎上在減去這個常數(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ù)是我們自己設定的閾值范圍,一張圖片的最好的閾值分界線不是憑感覺看出來的,而是有合理的方式能找到的,threshold的第一個返回值就是處理圖片的閾值分界線。因此,只要在threshold函數(shù)的最后一個參數(shù)在原有的基礎上加上’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方法將矩陣轉化為一維
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文章來源:http://www.zghlxwxcb.cn/news/detail-453233.html
聲明:部分圖像源自網(wǎng)絡,本文僅供學習交流使用,如果不妥,請聯(lián)系刪除。文章來源地址http://www.zghlxwxcb.cn/news/detail-453233.html
到了這里,關于[2] 圖像處理之----二值化處理的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!