目錄
一、顏色加法
顏色加法
顏色加權加法
示例
二、顏色空間轉換?
RGB轉Gray(灰度)
RGB轉HSV
HSV轉RGB
示例
三、灰度化
最大值法
平均值法
加權平均值法
四、圖像二值化處理
?閾值法
反閾值法
截斷閾值法
低閾值零處理
超閾值法
OTSU
自適應二值化
均值
加權求和
五、圖像翻轉
總結
一、顏色加法
可以使用OpenCV的cv.add()函數把兩幅圖像相加,或者可以簡單地通過numpy操作添加兩個圖像,如res = img1 + img2。兩個圖像應該具有相同的大小和類型。
顏色加法
OpenCV加法和Numpy加法之間存在差異。OpenCV的加法是飽和操作,而Numpy添加是模運算。
# 飽和操作: cv.add(img1,img2) # Numpy直接相加是取模運算,如250+10 = 260%256 = 4 x = np.uint8([[250]]) y = np.uint8([[10]]) xy1 = cv.add(x,y) xy2 = x + y print(xy1,xy2)
xy1采用OpenCV中的飽和運算,最大值為255,因為250+10=260>255,所以xy1=255
xy2采用Numpy的加法,采用去摸運算,結果與256取模運算,260%255=4,所以xy2=4
顏色加權加法
cv.addWeighted(img1,alpha,img2,beta,gamma)
結果:img1*alpha+img2*beta+gammaimg1,img2為圖片數據(數組)
alpha,beta為權重
gamma為亮度調整值
gamma > 0
,圖像會變亮。
gamma < 0
,圖像會變暗。
gamma = 0
,則沒有額外的亮度調整。示例
import cv2 as cv import numpy as np# 讀取圖片 cao = cv.imread("../images/cao.png") pig = cv.imread("../images/pig.png") # 飽和操作: cv.add(img1,img2) dst1 = cv.add(cao,pig) # print(cao) # print(pig) # print(dst1) cv.imshow('dst1',dst1)# Numpy直接相加是取模運算,如250+10 = 260%256 = 4 dst2 = cao + pig cv.imshow('dst2',dst2)# 顏色加權加法: cv.addWeighted(img1,alpha,img2,beta,gamma) : img1*alpha+img2*beta+gamma dst3 = cv.addWeighted(pig,0.7,cao,0.3,0) cv.imshow('dst3',dst3)cv.waitKey(0) cv.destroyAllWindows()
二、顏色空間轉換?
cv.cvtColor(img,code)
RGB轉Gray(灰度)
code = cv.COLOR_BGR2GRAY
RGB轉HSV
code =?cv.COLOR_BGR2HSV
HSV轉RGB
code =?cv.COLOR_BGR2RGB
示例
import cv2 as cv
# 讀取圖片
img = cv.imread("../images/1.jpg")
# 顏色轉換 cv.cvtColor(img,code)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow('gray',gray)
# 轉HSV
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
cv.imshow('hsv',hsv)
# 轉RGB
rgb = cv.cvtColor(img,cv.COLOR_BGR2RGB)
cv.imshow('rgb',rgb)cv.waitKey(0)
cv.destroyAllWindows()
三、灰度化
最大值法
對于彩色圖像的每個像素,它會從R、G、B三個通道的值中選出最大的一個,并將其作為灰度圖像中對應位置的像素值。
import cv2 as cv
import numpy as np# 讀取圖片
pig = cv.imread("../images/pig.png")
img = np.zeros((pig.shape[0],pig.shape[1]),dtype=np.uint8)
# 循環遍歷
for i in range(pig.shape[0]):for j in range(pig.shape[1]):img[i,j] = max(pig[i,j,:])
cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()
平均值法
對于彩色圖像的每個像素,它會將R、G、B三個通道的像素值全部加起來,然后再除以三,得到的平均值就是灰度圖像中對應位置的像素值。
import cv2 as cv import numpy as np# 讀取圖片 pig = cv.imread("../images/pig.png") img = np.zeros((pig.shape[0],pig.shape[1]),dtype=np.uint8) # 循環遍歷 for i in range(pig.shape[0]):for j in range(pig.shape[1]):# int():轉為更大的數據類型,防止溢出img[i,j] = (int(pig[i,j,0])+int(pig[i,j,1])+int(pig[i,j,2]))//3cv.imshow('img', img) cv.waitKey(0) cv.destroyAllWindows()
注:圖像數據都是整數,需要轉換為int型,結果也必須為整數,所以整除
加權平均值法
對于彩色圖像的每個像素,它會按照一定的權重去乘以每個通道的像素值,并將其相加,得到最后的值就是灰度圖像中對應位置的像素值。
import cv2 as cv
import numpy as np# 讀取圖片
pig = cv.imread("../images/pig.png")
img = np.zeros((pig.shape[0],pig.shape[1]),dtype=np.uint8)
# 定義權重
wb,wg,wr=0.114,0.587,0.299# 循環遍歷
for i in range(pig.shape[0]):for j in range(pig.shape[1]):img[i,j] = round(wb*pig[i,j,0])+round(wg*pig[i,j,1])+round(wr*pig[i,j,2])cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()
四、圖像二值化處理
將某張圖像的所有像素改成只有兩種值之一
操作的圖像必須為灰度圖,所以處理前需要進行灰度化處理
_,binary = cv2.threshold(img,thresh,maxval,type)
img
:輸入圖像,要進行二值化處理的灰度圖。
thresh
:設定的閾值。當像素值大于(或小于,取決于閾值類型)thresh
時,該像素被賦予的值。
type
:閾值處理的類型。返回值:
第一個值(通常用下劃線表示):計算出的閾值,若使用自適應閾值法,會根據算法自動計算出這個值。
第二個值(binary):二值化后的圖像矩陣。與輸入圖像尺寸相同。
?閾值法
將灰度圖中的每一個像素值與該閾值進行比較,小于等于閾值的像素就被設置為0(通常代表背景),大于閾值的像素就被設置為maxval
type =?cv.THRESH_BINARY
反閾值法
與閾值法相反。反閾值法是當灰度圖的像素值大于閾值時,該像素值將會變成0(黑),當灰度圖的像素值小于等于閾值時,該像素值將會變成maxval
type =?cv.THRESH_BINARY_INV
截斷閾值法
截斷閾值法,指將灰度圖中的所有像素與閾值進行比較,像素值大于閾值的部分將會被修改為閾值,小于等于閾值的部分不變
type =?cv.THRESH_TRUNC
低閾值零處理
低閾值零處理,像素值小于等于閾值的部分被置為0(也就是黑色),大于閾值的部分不變。
type =?cv.THRESH_TOZERO
超閾值法
超閾值零處理,與低閾值零處理相反,就是將灰度圖中的每個像素與閾值進行比較,像素值大于閾值的部分置為0,像素值小于等于閾值的部分不變
type =?cv.THRESH_TOZERO_INV
OTSU
OTSU算法就是在灰度圖的像素值范圍內遍歷閾值T,使得g最大,基本上雙峰圖片的閾值T在兩峰之間的谷底。
g就是前景與背景兩類之間的方差,這個值越大,說明前景和背景的差別就越大,效果就越好。
THRESH_OTSU
通常與THRESH_BINARY
或THRESH_BINARY_INV
結合使用。type =?cv.THRESH_BINARY+cv.THRESH_OTSU? 或 cv.THRESH_BINARY_INV+cv.THRESH_OTSU
手動設置的thresh值無效,閾值通過OTSU函數自動計算
自適應二值化
自適應二值化更加適合用在明暗分布不均的圖片
自適應二值化方法會對圖像中的所有像素點計算其各自的閾值
與OTSU類似,必須且只能結合一個閾值法或反閾值法
cv2.adaptiveThreshold(image_np_gray, maxval , cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, blockSize , c)
blockSize
:選取的小區域的面積,如7就是7*7的小塊。c
:最終閾值等于小區域計算出的閾值再減去此值均值
根據選中點一定范圍內的平均值作為閾值
加權求和
根據高斯權重核求加權,對小區域內的像素進行加權求和得到新的閾值,其權重值來自于高斯分布
五、圖像翻轉
cv2.flip(img,flipcode)
參數
im. 要翻轉的圖像
flipcode: 指定翻轉類型的標志
flipcode=0: 垂直翻轉,圖片像素點沿x軸翻轉
flipcode>0: 水平翻轉,圖片像素點沿y軸翻轉
flipcode<0: 水平垂直翻轉,水平翻轉和垂直翻轉的結合
示例?
import cv2 as cv# 讀取圖片
face = cv.imread("../images/face.png")
cv.imshow("face",face)
# 圖像翻轉/鏡像旋轉 : 以圖像中心為原點 cv.flip(img,flipCode)
# flipCode = 0 : 垂直翻轉
flip_0 = cv.flip(face,0)
cv.imshow('flip_0', flip_0)
# flipCode = 1 : 水平翻轉
flip_1 = cv.flip(face,1)
cv.imshow('flip_1', flip_1)
# flipCode = -1 : 水平垂直翻轉
flip_2 = cv.flip(face,-1)
cv.imshow('flip_2',flip_2)cv.waitKey(0)
cv.destroyAllWindows()
?效果
總結
本文介紹了圖像預處理中的一些內容,顏色加法包括平均值和加權加法,其中平均值包括OpenCV飽和加法與Numpy模運算加法;顏色空間轉換包括灰度、RGB、HSV三者的轉換;灰度化處理包括最大值法、平均值法、加權平均值法;圖像二值化處理包括5種閾值方法和自適應二值化;圖像反轉包括水平翻轉、垂直翻轉、雙向翻轉。
以上就是本章所有內容,感謝觀看。