视频图片操作

  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)