1. 程式人生 > >OpenCV-Python-(3)-影象預處理

OpenCV-Python-(3)-影象預處理

影象預處理:

  • cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) #邊界填充
  • cv2.add()                                                                                                   #相加
  • cv2.substract()                                                                                         #相減
  • cv2.bitwise_and(src1, src2, dst=None, mask=one)                             #與
  • cv2.bitwise_or(src1, src2, dst=None, mask=None)                             #或
  • cv2.bitwise_not(src1, src2, dst=None, mask=None)                           #非
  • cv2.bitwise_xor(src1, src2, dst=None, mask=None)                           
    #異或
  • cv2.cvtColor(img, flag) #可以RGB轉為GRAY&HSV

1.影象邊界填充

cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value)

  • src:源影象
  • top,bottem,left,right: 分別表示四個方向上邊界的長度
  • borderType: 邊界的型別,有以下幾種:

       BORDER_REFLICATE    # 直接用邊界的顏色填充

       BORDER_REFLECT    # 反轉

       BORDER_REFLECT_101  # 反轉,和上面類似,但在反轉時,會把邊界空開

       BORDER_WRAP       

       BORDER_CONSTANT    # 常量,增加的變數均為value填充的顏色

  • value - Color of border if border type is cv.BORDER_CONSTANT
import cv2 


img = cv2.imread(r'C:\Users\x\Desktop\11.jpg', cv2.IMREAD_ANYCOLOR)
green = [0,255,0]

replicate = cv2.copyMakeBorder(img,50,50,50,50,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img,50,50,10,10,cv2.BORDER_CONSTANT,value=green)

cv2.imshow("image", img)
cv2.imshow("replicate", replicate)
cv2.imshow("reflect", reflect)
cv2.imshow("reflect101", reflect101)
cv2.imshow("wrap", wrap)
cv2.imshow("constant", constant)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.影象運算:相加、相減、與、或、異或、非

  • cv2.add()
  • cv2.substract()
import cv2 
import numpy as np

img = cv2.imread(r'C:\Users\x\Desktop\11.jpg', cv2.IMREAD_ANYCOLOR)

#構建矩陣,進行cv2.add 與 cv2.substract運算
A = np.ones(img.shape, dtype='uint8')*100
 
add = cv2.add(img, A)
subtract = cv2.subtract(img, A)
 
cv2.imshow("image", img)
cv2.imshow("add", add)
cv2.imshow("subtract", subtract)

cv2.waitKey(0)
cv2.destroyAllWindows()

影象與運算-cv2.bitwise_and(src1, src2, dst=None, mask=one)

影象或運算-cv2.bitwise_or(src1, src2, dst=None, mask=None)

影象非運算-cv2.bitwise_not(src1, src2, dst=None, mask=None)

影象異或運算-cv2.bitwise_xor,一個二值圖,將黑色轉為白色,白色轉為黑

影象異或運算-cv2.bitwise_xor(src1, src2, dst=None, mask=None)
這四個運算,最少要有兩個引數,即src1,src2;dst:引數返回結果可選,mask:引數也是可選的,指定msk區域進行操作。

import cv2 
import numpy as np

# 生成矩形圖形
rectangle = np.zeros((300, 300, 3), dtype='uint8')
cv2.rectangle(rectangle, (25, 25), (275, 275), (255,255,255), -1)

#生成圓形
circle = np.zeros((300, 300, 3), dtype='uint8')
cv2.circle(circle, (150, 150), 150, (255,255,255), -1)

# 位運算
bitwise_and = cv2.bitwise_and(rectangle, circle) #與

bitwise_or = cv2.bitwise_or(rectangle, circle)   #或

bitwise_xor = cv2.bitwise_xor(rectangle, circle) #異或

bitwise_not = cv2.bitwise_not(rectangle)         #非

cv2.imshow("rectangle", rectangle)
cv2.imshow("circle", circle)
cv2.imshow("bitwise_and", bitwise_and)
cv2.imshow("bitwise_or", bitwise_or)
cv2.imshow("bitwise_xor", bitwise_xor)
cv2.imshow("bitwise_not", bitwise_not)

cv2.waitKey(0)
cv2.destroyAllWindows()

影象掩模處理mask

import cv2 
import numpy as np

img = cv2.imread(r'C:\Users\x\Desktop\47.jpg', cv2.IMREAD_ANYCOLOR)

mask = np.zeros(img.shape[:2], dtype='uint8')
(w, h) = (img.shape[1]//2, img.shape[0]//2)

cv2.rectangle(mask, (w-200, h-200), (w, h), 255, -1)
cv2.circle(mask, (w+20, h+90), 100, 255, -1)

masked = cv2.bitwise_and(img, img, mask=mask)
masked = cv2.bitwise_and(img, img, mask=mask)

cv2.imshow("image", img)
cv2.imshow("mask", masked)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.色彩空間

opencv中有多種色彩空間,包括 RGB、HSI、HSL、HSV、HSB、YCrCb、CIE XYZ、CIE Lab8種。

cv2.cvtColor(img, flag) 可以RGB轉為GRAY&HSV

  • img,源圖片
  • flag, 色彩空間轉換型別:cv2.COLOR_BGR2GRAY,cv2.COLOR_BGR2HSV等

HSV(Hue(色調), Saturation(飽和度) , Value(明度)):

  • n色度H:用角度度量,取值範圍為0~360,紅色開始按逆時針方向計算,紅色為0度,綠色為120度,藍色為240度

  • 飽和度S:接近光譜色的程度,顏色可以看成是光譜色與白色混合結果,光譜色佔的比例愈大,顏色接近光譜色的程度越高,顏色飽和度就越高。光譜色中白色成分為0,飽和度達到最高,取值範圍0%~100%,值越大,顏色越飽和

  • 明度V:表示顏色明亮的程度,對於光源色,明度值與發光體的光亮度有關;對於物體色,與物體的透射比有關,取值範圍為0%(黑)~100%(白)

在Opencv中
H色度取值範圍是[0,179]
S飽和度的取值範圍是[0,255]
V明度的取值範圍是[0,255]

import cv2 

img = cv2.imread(r'C:\Users\x\Desktop\47.jpg', cv2.IMREAD_ANYCOLOR)

GRAY = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
LAB = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)

cv2.imshow("image", img)
cv2.imshow("GRAY", GRAY)
cv2.imshow("HSV", HSV)
cv2.imshow("LAB", LAB)

cv2.waitKey(0)
cv2.destroyAllWindows()