一、灰度處理
1.1 cvtColor函數(shù)
函數(shù)原型:
cv2.cvtColor(src, code[, dst[, dstCn]]) -> dst
功能
:轉(zhuǎn)換圖像顏色空間。參數(shù)
:
- src: 輸入圖像。
- code: 顏色空間轉(zhuǎn)換代碼。可以取常量cv2.COLOR_BGR2GRAY或cv2.COLOR_RGB2GRAY。
- dst: 輸出圖像。
- dstCn: 輸出圖像的通道數(shù),如果設置為0,則跟隨轉(zhuǎn)換代碼自動設置。
內(nèi)置函數(shù)示例代碼:
import cv2
img = cv2.imread("color.jpg")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray", img_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
灰度處理的原理是將彩色圖像轉(zhuǎn)換成灰度圖像
,通常使用的方法是將彩色圖像的RGB三個通道的值加權(quán)平均,得到一個灰度值,再用這個灰度值代替RGB三個通道的值,從而得到灰度圖像。常用的加權(quán)平均公式是:
g
r
a
y
=
0.299
×
R
+
0.587
×
G
+
0.114
×
B
gray = 0.299 \times R + 0.587 \times G + 0.114 \times B
gray=0.299×R+0.587×G+0.114×B
其中,
R
、
G
、
B
R、G、B
R、G、B分別是彩色圖像的紅、綠、藍通道的值,
0.299
、
0.587
、
0.114
0.299、0.587、0.114
0.299、0.587、0.114是加權(quán)系數(shù),這些系數(shù)是心理物理學中根據(jù)人眼對不同顏色敏感度的實驗結(jié)果得出的。這個公式也稱為亮度加權(quán)法,能夠比較好地保留彩色圖像的明暗對比度。
通過原理實現(xiàn)灰度處理代碼:
import cv2
img = cv2.imread('lean.jpg')
img = cv2.resize(img, (240, 240), interpolation=cv2.INTER_CUBIC)
height, width = img.shape[:2]
gray = np.zeros((height, width, 1), dtype="uint8")
for i in range(height):
for j in range(width):
gray[i][j] = img[i][j][0] * 0.114 + img[i][j][1] * 0.587 + img[i][j][2] * 0.299 # 加權(quán)值法
# gray[i][j] = (img[i][j][0] +img[i][j][1]+img[i][j][2])/3#平均值法
# gray[i][j] = max(img[i][j][0],img[i][j][1],img[i][j][2]) #最大值法
cv2.imshow("Gray", gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
上述代碼逐個像素點計算灰度值,然后用灰度值代替RGB三個通道的值,得到灰度圖像并顯示出來。值得注意的是,這種方法雖然簡單易懂,但計算每個像素點的灰度值,效率較低,不適用于處理較大的圖像。在實際中,我們可以使用OpenCV提供的函數(shù)來實現(xiàn)灰度處理,以提高程序的執(zhí)行效率。
注意:灰度圖像在Python中數(shù)據(jù)類型是numpy的uint8類型,即8位無符號整型。
二、圖像二值化處理
圖像二值化處理是將灰度圖像上的像素點轉(zhuǎn)化為黑白兩種顏色的處理方法。
其原理是將灰度圖像的像素值按一定的閾值進行分割,大于等于閾值的像素值設為一個值(通常是255),小于閾值的像素值設為另一個值(通常是0)。這樣得到的圖像就只有黑白兩種顏色,便于進行一些形態(tài)學處理和特征提取。
圖像二值化有兩種方法:全局閾值和自適應閾值
。全局閾值
是指將整個圖像的像素值都按照同一個閾值進行分割,而自適應閾值
則是將圖像分割成若干個小塊
,然后對每個小塊單獨
計算閾值,從而得到更準確的分割結(jié)果。下面分別介紹這兩種方法的實現(xiàn)方式。
2.1 全局閾值
在OpenCV中,使用cv2.threshold()
函數(shù)可以實現(xiàn)全局閾值二值化。函數(shù)原型如下:
retval, dst = cv2.threshold(src, thresh, maxval, type)
參數(shù)說明:
- src為輸入圖像,必須為灰度圖。
- dst為輸出圖像,尺寸和類型與原圖像相同。
- thresh為設定的閾值。
- maxval為最大值,當像素值大于閾值時,賦值為maxval。
- type為閾值處理的類型,包括以下幾種類型:
- cv2.THRESH_BINARY:二值化,當像素值大于閾值時,賦值為maxval,否則賦值為0。
- cv2.THRESH_BINARY_INV:反二值化,當像素值大于閾值時,賦值為0,否則賦值為maxval。
- cv2.THRESH_TRUNC:截斷,當像素值大于閾值時,賦值為閾值,否則不變。
- cv2.THRESH_TOZERO:閾值以下歸零,當像素值小于閾值時,置為0,否則不變。
- cv2.THRESH_TOZERO_INV:閾值以上歸零,當像素值大于閾值時,置為0,否則不變。
示例代碼如下:
import cv2
# 加載灰度圖
img_gray = cv2.imread('lena_gray.jpg', 0)
# 全局閾值二值化
retval, img_binary = cv2.threshold(img_gray, 128, 255, cv2.THRESH_BINARY)
# 顯示圖像
cv2.imshow('original', img_gray)
cv2.imshow('binary', img_binary)
cv2.waitKey()
cv2.destroyAllWindows()
其中,使用cv2.imread()加載灰度圖時,第二個參數(shù)必須設置為0,表示加載灰度圖。
2.2 自適應閾值
在OpenCV中,使用cv2.adaptiveThreshold()
函數(shù)可以實現(xiàn)自適應閾值二值化
。函數(shù)原型和前面的cv2.threshold()函數(shù)類似,但多了兩個參數(shù):
dst = cv2.adaptiveThreshold(src, maxval, adaptiveMethod, thresholdType, blockSize, C)
參數(shù)說明:
文章來源:http://www.zghlxwxcb.cn/news/detail-718326.html
- src為輸入圖像,必須為灰度圖。
- maxValue為最大值,當像素值大于閾值時,賦值為maxValue。
- adaptiveMethod為自適應閾值算法類型,包括以下兩種類型:
- cv2.ADAPTIVE_THRESH_MEAN_C:計算每個小區(qū)域的平均灰度值作為閾值。
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C:計算每個小區(qū)域的高斯加權(quán)平均灰度值作為閾值。
- thresholdType為閾值處理的類型,同全局閾值二值化函數(shù)。
- blockSize為塊大小,要求為奇數(shù),代表自適應閾值計算時使用的小區(qū)域大小。
- C為常數(shù),閾值減小的常數(shù)。
實例代碼如下:
import cv2
# 加載灰度圖
img_gray = cv2.imread('lena_gray.jpg', 0)
# 自適應閾值二值化
img_binary = cv2.adaptiveThreshold(
img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 127, 1)
# 顯示圖像
cv2.imshow('original', img_gray)
cv2.imshow('binary', img_binary)
cv2.waitKey()
cv2.destroyAllWindows()
其中,使用cv2.ADAPTIVE_THRESH_MEAN_C作為自適應閾值算法,計算每個小塊的平均值;使用cv2.THRESH_BINARY作為閾值處理的類型。閾值大小由blockSize
和C
兩個參數(shù)共同決定,可以通過調(diào)整這兩個參數(shù)來得到更適合的分割效果。文章來源地址http://www.zghlxwxcb.cn/news/detail-718326.html
到了這里,關于OpenCV常用功能——灰度處理和圖像二值化處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!