Opencv基礎

  視頻圖片操作

  import cv2 as cv #導入opencv包

  cv.imread(path,flags) #加載圖片,其中第一個參數是絕對或者相對路徑,第二個參數爲0時加載灰度圖像,爲1時加載彩圖像。

  cv.imshow(path,flags) #顯示圖片,其中第一個參數是顯示窗口的名稱,第二個參數是打開的圖片

  cv.imwrite(name,flags)#保存圖片,第一個參數是途徑,第二個參數是要保存的圖片 返回boolean

  cv2.namedWindow 創建一個窗體,只需指定窗體名稱

  cv2.namedWindow()初始化默認標籤是cv2.WINDOW_AUTOSIZE。

  但是如果把標籤改成cv2.WINDOW_NORMAL就可以自由的調整窗體大小,

  當圖像維度太大,這將很有幫助。

  cv2.destroyWindow() 銷燬指定窗體

  cv2.destroyAllWindows() 銷燬所有窗體

  視頻

  cap = cv.VideoCapture(0)打開本地攝像頭

  cap = cv.VideoCapture(videoPath)讀取本地視頻

  import cv2 as cv

  cap = cv.VideoCapture(0)

  while cap.isOpened():

  status, frame = cap.read()

  k = cv.waitKey(25)

  # 圖片灰度化

  frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

  cv.imshow('video', frame)

  cv.destroyWindow('video')

  方法

  cv.shape打印形狀

  cv.size打印像素點個數

  cv.ndim打印維度

  cv.dtype打印數據類型

  cv.waitkey(0) 無限期的等待鍵盤按下

  cv.destroyWindow(name)#銷燬所有窗體,參數是需要銷燬窗體的名稱

  cv.destroyAllWindows()#銷燬所有窗體

  繪圖

  圓:cv.circle(畫板,圓心,半徑,顏色,粗細,cv.LINE_AA(抗鋸齒))

  線條:cv.line(畫板,起點,終點,顏色,粗細)

  橢圓:cv.ellipse(畫板,圓心,(長軸,短軸),逆時針旋轉的角度,橢圓弧沿順時針起始角度,結束角度,顏色,抗鋸齒)

  多邊形:`使用函數cv2.polylines在一副圖像中繪製多邊形示例代碼

  函數原型:polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]]) -> img

  img:要繪製的那張圖像

  pts:多邊形的頂點列表

  isClosed:默認爲True表示閉合, False表示不閉合

  繪製多邊形:

  使用函數cv2.polylines在一副圖像中繪製多邊形示例代碼

  函數原型:polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]]) -> img

  img:要繪製的那張圖像

  pts:多邊形的頂點列表

  isClosed:默認爲True表示閉合, False表示不閉合

  color:線段的顏色,傳一個元組,如紅色(0,0,255),如果是灰度圖請傳入灰度值

  thickness:線段的粗細,默認值-1,表示填充

  lineType:線段類型:默認8連線,cv2.LINE_AA表示抗鋸齒

  more help:help(cv2.polylines)`

  繪製矩形:

  使用函數cv2.rectangle()在一副圖像中繪製矩形示例代碼

  函數原型:rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) -> img

  img:要繪製的那張圖像

  pt1:矩形的左上角座標,如(0, 0)

  pt2:矩形右下角座標, 如(499, 499)

  color:線段的顏色,傳一個元組,如紅色(0,0,255), 如果是灰度圖請傳入灰度值

  thickness:線段的粗細,默認值-1,表示填充

  lineType:線段類型:默認8連線,cv2.LINE_AA表示抗鋸齒

  more help:help(cv2.rectangle)

  繪製文字:

  使用函數cv2.putText()在一副圖像中繪製文字

  函數原型:putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]]) -> img

  img:要繪製的那張圖像

  text:要繪製的文本

  org:繪製的位置座標

  fontFace:字體格式

  fontScale:字體大小

  color:線段的顏色,傳一個元組,如紅色(0,0,255),如果是灰度圖請傳入灰度值

  thickness:線段的粗細,默認值-1,表示填充

  lineType:線段類型:默認8連線,cv2.LINE_AA表示抗鋸齒

  bottomLeftOrigin 如果爲True則圖像位於原點的左下角

  more help:help(cv2.putText)

  圖片操作

  仿射變換:

  matScale = np.float32([[0.5,0,0],[0,0.5,0]])

  dst = cv.warpAffine(img,matScale,(width,height))

  RGB通道拆分:b, g, r = cv.split(img)

  RGB通道合併:img1 = cv.merge((B, g, r))

  圖片縮放:cv.resize(原圖,(heigth,width))

  圖片剪切:

  img = cv.imread('cat.jpg',1)

  dst = img[100:200,100:300] #起點(100,100)終點(200,200)

  cv.imshow('dst',dst)

  cv.waitKey(0)

  圖片移位:

  matShift = np.float32([[1,0,100],[0,1,200]])

  dst = cv.warpAffine(img,matShift,(height,width))

  cv.imshow('dst',dst)

  圖片仿射變換:

  matsrc = np.float32([[0,0],[0,height],[width,0]]) #原圖點位

  matdst = np.float32([[50,50],[100,height-100],[width-100,50]]) #目標點位

  matAffine = cv.getAffineTransform(matsrc,matdst) #仿射變換

  dst = cv.warpAffine(img,matAffine,(width,height))

  圖片旋轉:

  matRotate = cv.getRotationMatrix2D((height*0.5,width*0.5),45,0.5)# 參數(中心點,旋轉角度,縮放係數)RotationMatrix2D旋轉矩陣方法

  dst = cv.warpAffine(img,matRotate,(width,height))#放射變化

  圖片特效

  灰度處理:

  #方法一:

  img0 = cv.imread('cat.jpg',0) #灰度圖片

  img1 = cv.imread('cat.jpg',1)#彩圖

  #方法二:

  img = cv.imread('cat.jpg',1)

  dst = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

  #方法三:

  dst = np.zeros((height,width,3),np.uint8)

  for i in range(0,height):

  for j in range(0,width):

  (b,g,r) = img[i,j]

  gray = (int(b)+int(g)+int(r))/3

  dst[i,j] = gray

  print(np.uint(gray))

  #方法四

  dst = np.zeros((height,width,3),np.uint8)

  for i in range(0,height):

  for j in range(0,width):

  (b,g,r) = img[i,j]

  b = int(b)

  g = int(g)

  r = int(r)

  gray = r*0.229+g*0.587+r*0.114

  dst[i,j] = np.uint(gray)

  圖片邊緣檢測:

  #1.灰度圖像處理

  gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

  #2.高斯濾波

  imgG = cv.GaussianBlur(gray,(3,3),0)

  #3.卷積

  dst = cv.Canny(img,100,100)

  繪圖

  import numpy as np

  import matplotlib.pyplot as plt

  x = np.array([1,2,3,4,5,6,7,8])

  y = np.array([3,5,7,6,2,6,10,15])

  plt.plot(x,y,'r',lw = 10) #折線圖

  plt.bar(x,y,0.5,alpha = 1,color = 'b') #原主圖

  plt.show()

  圖片腐蝕:

  腐蝕操作:

  原理:

  如果卷積覈對應的原圖像的所有像素值都是1,那麼中心像素點就保持原來的值,

  否則變爲0。所以前景物體會變小,整幅圖像的白色區域會減少。

  erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst

  參數解析:鄭州人流醫院 http://www.zzzzyy120.com/

  element:腐蝕操作的內核。 如果不指定,默認爲一個簡單的 3x3 矩陣。

  否則,我們就要明確指定它的形狀,可以使用函數getStructuringElement()。

  anchor:默認爲Point(-1,-1),內核中心點。省略時爲默認值。

  iterations:腐蝕次數。省略時爲默認值1。

  borderType:推斷邊緣類型,具體參見borderInterpolate函數。默認爲BORDER_DEFAULT,省略時爲默認值。

  borderValue:邊緣值,具體可參見createMorphoogyFilter函數。可省略。

  作用:

  腐蝕對於去除白噪聲很有用,也可以用來斷開兩個連接在一個的物體

  代碼示例:

  kernel = np.ones((5, 5), np.float32)

  erosion = cv.erode(img, kernel, iterations=1)

  膨脹操作:

  膨脹操作:

  原理:

  與腐蝕相反,與卷積覈對應的原始圖像的像素值中只要有一個是1,

  中心像素的值就是1,所以膨脹操作增加白色區域(前景)。

  dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst

  參數解析:

  anchor:默認爲Point(-1,-1),內核中心點。省略時爲默認值。

  iterations:膨脹次數。省略時爲默認值1。

  borderType:推斷邊緣類型,具體參見borderInterpolate函數。默認爲BORDER_DEFAULT,省略時爲默認值。

  borderValue:邊緣值,具體可參見createMorphoogyFilter函數。可省略。

  作用:

  一般在去除圖像噪聲時可以先腐蝕然後在膨脹,

  這樣噪聲就已經被去除了,不會再回來,但前景會增加。

  膨脹也可以用連接兩個分開的物體。

  代碼示例:

  kernel = np.ones((5, 5), np.float32)

  dilate = cv.dilate(img, kernel, iterations=1)

  簡單閾值:

  全局閾值:

  def threshold_dem0(image):

  gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)

  ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)

  print("閾值",ret)

  cv.imshow('binary',binary)

  ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)

  ret = 閾值,binary = 閾值圖像

  參數(灰度圖像,閾值,255,閾值算法)

  局部閾值:

  def local_threshold(image):

  gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)

  binary = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,25,10)

  cv.imshow('biary',binary)

  binary = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,25,10)

  自定義閾值:

  def load_threshold(image):

  gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)

  h,w = gray.shape[:2]

  men = np.reshape(gray,[1,w*h])

  men1 = men.sum()/(w*h) #所有像素的均值

  are,binary = cv.threshold(gray,men1,255,cv.THRESH_BINARY)

  cv.imshow('biary',binary)

  開操作和閉操作:

  開運算:先腐蝕後膨脹, 去除噪聲,去除白色小點、空洞

  閉運算:先膨脹後腐蝕, 用來填充前景物體的小黑點

  形態學梯度:膨脹減去腐蝕, 可以得到前景物體的輪廓

  禮帽:原圖減去開運算

  黑帽:閉運算減去原圖

  使用函數morphologyEx()進行形態學其他操作

  函數原型爲:morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst

  op參數:

  cv.MORPH_OPEN:開運算

  cv.MORPH_CLOSE:閉運算

  cv.MORPH_GRADIENT:形態學梯度

  cv.MORPH_TOPHAT:禮帽

  cv.MORPH_BLACKHAT:黑帽

  def open_dem0(image):# 開操作

  print(image.shape)

  gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)

  ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV | cv.THRESH_OTSU)#閾值化

  cv.imshow('binary',binary)

  kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(3,3)#結構元素

  binarya = cv.morphologyEx(binary,cv.THRESH_TRUNC ,kernel) #形態學操作

  cv.imshow('binary2',binarya)

  def close_dem0(image):#閉操作

  print(image.shape)

  gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)

  ret,binay = cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU) #閾值化

  cv.imshow('binay',binay)

  kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15)) #結構元素

  binay = cv.morphologyEx(binay,cv.MORPH_CLOSE,kernel) #形態學操作

  cv.imshow('binay',binay)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章