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
        参数解析:
            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)
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值