视频图片操作
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)