Opencv基础

视频图片操作

创新互联是一家网站设计公司,集创意、互联网应用、软件技术为一体的创意网站建设服务商,主营产品:成都响应式网站建设公司品牌网站制作全网整合营销推广。我们专注企业品牌在网站中的整体树立,网络互动的体验,以及在手机等移动端的优质呈现。网站设计、成都做网站、移动互联产品、网络运营、VI设计、云产品.运维为核心业务。为用户提供一站式解决方案,我们深知市场的竞争激烈,认真对待每位客户,为客户提供赏析悦目的作品,网站的价值服务。

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)


当前文章:Opencv基础
新闻来源:http://pwwzsj.com/article/ghpscc.html