溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Opencv基礎(chǔ)

發(fā)布時(shí)間:2020-06-24 18:22:54 來(lái)源:網(wǎng)絡(luò) 閱讀:176 作者:nineteens 欄目:編程語(yǔ)言

  視頻圖片操作

  import cv2 as cv #導(dǎo)入opencv包

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

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

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

  cv2.namedWindow 創(chuàng)建一個(gè)窗體,只需指定窗體名稱

  cv2.namedWindow()初始化默認(rèn)標(biāo)簽是cv2.WINDOW_AUTOSIZE。

  但是如果把標(biāo)簽改成cv2.WINDOW_NORMAL就可以自由的調(diào)整窗體大小,

  當(dāng)圖像維度太大,這將很有幫助。

  cv2.destroyWindow() 銷毀指定窗體

  cv2.destroyAllWindows() 銷毀所有窗體

  視頻

  cap = cv.VideoCapture(0)打開本地?cái)z像頭

  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打印像素點(diǎn)個(gè)數(shù)

  cv.ndim打印維度

  cv.dtype打印數(shù)據(jù)類型

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

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

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

  繪圖

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

  線條:cv.line(畫板,起點(diǎn),終點(diǎn),顏色,粗細(xì))

  橢圓:cv.ellipse(畫板,圓心,(長(zhǎng)軸,短軸),逆時(shí)針旋轉(zhuǎn)的角度,橢圓弧沿順時(shí)針起始角度,結(jié)束角度,顏色,抗鋸齒)

  多邊形:`使用函數(shù)cv2.polylines在一副圖像中繪制多邊形示例代碼

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

  img:要繪制的那張圖像

  pts:多邊形的頂點(diǎn)列表

  isClosed:默認(rèn)為True表示閉合, False表示不閉合

  繪制多邊形:

  使用函數(shù)cv2.polylines在一副圖像中繪制多邊形示例代碼

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

  img:要繪制的那張圖像

  pts:多邊形的頂點(diǎn)列表

  isClosed:默認(rèn)為True表示閉合, False表示不閉合

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

  thickness:線段的粗細(xì),默認(rèn)值-1,表示填充

  lineType:線段類型:默認(rèn)8連線,cv2.LINE_AA表示抗鋸齒

  more help:help(cv2.polylines)`

  繪制矩形:

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

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

  img:要繪制的那張圖像

  pt1:矩形的左上角坐標(biāo),如(0, 0)

  pt2:矩形右下角坐標(biāo), 如(499, 499)

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

  thickness:線段的粗細(xì),默認(rèn)值-1,表示填充

  lineType:線段類型:默認(rèn)8連線,cv2.LINE_AA表示抗鋸齒

  more help:help(cv2.rectangle)

  繪制文字:

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

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

  img:要繪制的那張圖像

  text:要繪制的文本

  org:繪制的位置坐標(biāo)

  fontFace:字體格式

  fontScale:字體大小

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

  thickness:線段的粗細(xì),默認(rèn)值-1,表示填充

  lineType:線段類型:默認(rèn)8連線,cv2.LINE_AA表示抗鋸齒

  bottomLeftOrigin 如果為True則圖像位于原點(diǎn)的左下角

  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] #起點(diǎn)(100,100)終點(diǎn)(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]]) #原圖點(diǎn)位

  matdst = np.float32([[50,50],[100,height-100],[width-100,50]]) #目標(biāo)點(diǎn)位

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

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

  圖片旋轉(zhuǎn):

  matRotate = cv.getRotationMatrix2D((height*0.5,width*0.5),45,0.5)# 參數(shù)(中心點(diǎn),旋轉(zhuǎn)角度,縮放系數(shù))RotationMatrix2D旋轉(zhuǎn)矩陣方法

  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)

  圖片邊緣檢測(cè):

  #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()

  圖片腐蝕:

  腐蝕操作:

  原理:

  如果卷積核對(duì)應(yīng)的原圖像的所有像素值都是1,那么中心像素點(diǎn)就保持原來(lái)的值,

  否則變?yōu)?。所以前景物體會(huì)變小,整幅圖像的白色區(qū)域會(huì)減少。

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

  參數(shù)解析:鄭州人流醫(yī)院 http://www.zzzzyy120.com/

  element:腐蝕操作的內(nèi)核。 如果不指定,默認(rèn)為一個(gè)簡(jiǎn)單的 3x3 矩陣。

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

  anchor:默認(rèn)為Point(-1,-1),內(nèi)核中心點(diǎn)。省略時(shí)為默認(rèn)值。

  iterations:腐蝕次數(shù)。省略時(shí)為默認(rèn)值1。

  borderType:推斷邊緣類型,具體參見borderInterpolate函數(shù)。默認(rèn)為BORDER_DEFAULT,省略時(shí)為默認(rèn)值。

  borderValue:邊緣值,具體可參見createMorphoogyFilter函數(shù)??墒÷浴?/p>

  作用:

  腐蝕對(duì)于去除白噪聲很有用,也可以用來(lái)斷開兩個(gè)連接在一個(gè)的物體

  代碼示例:

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

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

  膨脹操作:

  膨脹操作:

  原理:

  與腐蝕相反,與卷積核對(duì)應(yīng)的原始圖像的像素值中只要有一個(gè)是1,

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

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

  參數(shù)解析:

  anchor:默認(rèn)為Point(-1,-1),內(nèi)核中心點(diǎn)。省略時(shí)為默認(rèn)值。

  iterations:膨脹次數(shù)。省略時(shí)為默認(rèn)值1。

  borderType:推斷邊緣類型,具體參見borderInterpolate函數(shù)。默認(rèn)為BORDER_DEFAULT,省略時(shí)為默認(rèn)值。

  borderValue:邊緣值,具體可參見createMorphoogyFilter函數(shù)??墒÷浴?/p>

  作用:

  一般在去除圖像噪聲時(shí)可以先腐蝕然后在膨脹,

  這樣噪聲就已經(jīng)被去除了,不會(huì)再回來(lái),但前景會(huì)增加。

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

  代碼示例:

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

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

  簡(jiǎn)單閾值:

  全局閾值:

  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 = 閾值圖像

  參數(shù)(灰度圖像,閾值,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)

  開操作和閉操作:

  開運(yùn)算:先腐蝕后膨脹, 去除噪聲,去除白色小點(diǎn)、空洞

  閉運(yùn)算:先膨脹后腐蝕, 用來(lái)填充前景物體的小黑點(diǎn)

  形態(tài)學(xué)梯度:膨脹減去腐蝕, 可以得到前景物體的輪廓

  禮帽:原圖減去開運(yùn)算

  黑帽:閉運(yùn)算減去原圖

  使用函數(shù)morphologyEx()進(jìn)行形態(tài)學(xué)其他操作

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

  op參數(shù):

  cv.MORPH_OPEN:開運(yùn)算

  cv.MORPH_CLOSE:閉運(yùn)算

  cv.MORPH_GRADIENT:形態(tài)學(xué)梯度

  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)#結(jié)構(gòu)元素

  binarya = cv.morphologyEx(binary,cv.THRESH_TRUNC ,kernel) #形態(tài)學(xué)操作

  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)) #結(jié)構(gòu)元素

  binay = cv.morphologyEx(binay,cv.MORPH_CLOSE,kernel) #形態(tài)學(xué)操作

  cv.imshow('binay',binay)


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI