OpenCv入门笔记(1)

一、OpenCv介绍
OpenCV是一个用于图像处理、分析、机器视觉方面的开源函数库.
无论你是做科学研究,还是商业应用,opencv都可以作为你理想的工具库,因为,对于这两者,它完全是免费的。
该库采用C及C++语言编写,可以在windows, linux, mac OSX系统上面运行。该库的所有代码都经过优化,计算效率很高,因为,它更专注于设计成为一种用于实时系统的开源库。opencv采用C语言进行优化,而且,在多核机器上面,其运行速度会更快。它的一个目标是提供友好的机器视觉接口函数,从而使得复杂的机器视觉产品可以加速面世。该库包含了横跨工业产品检测、医学图像处理、安防、用户界面、摄像头标定、三维成像、机器视觉等领域的超过500个接口函数。
近年来,在入侵检测、特定目标跟踪、目标检测、人脸检测、人脸识别、人脸跟踪等领域,opencv可谓大显身手,而这些,仅仅是其应用的冰山一角。

二、编译环境

直接pip安装
pip install opencv-python
注意:
1.安装的是opencv_python,但在导入的时候是import cv2。
2.OpenCV依赖一些库,比如Numpy和matplotlib,先安装上。

三、
(1)计算机眼中的图像
在图片中,每一个区域都由很多小格组成,如图:
OpenCv入门笔记(1)_第1张图片
1、 (2)中所示,每一个小格叫做一个像素点,在计算机中正是这些像素点构成了图像。
在(4)中,我们可以看到很多值,这些就是构成像素点的每一个值。在计算机中,像素点的值在0~255之间进行浮动,0~255表示,点的亮度,0的时候该点就是黑的,255的时候最亮,接近于白色。
2、 (2)中每一个小区域,分别与R G B中相应的区域的值一一对应,我们管R G B叫做图像的颜色通道,通常情况下,我们看到的图片一般都是R G B三颜色通道的,R表示在红色通道的颜色结果,G表示在绿色通道的颜色结果,B表示在蓝色通道的颜色结果,彩色图才会有这三个通道,灰度图(黑白图)没有,灰度图只需要一个通道表示亮度就足够了。
3、 这些像素点的形式类似于矩阵,比如图片的宽w=500,高h=500,那相应的R G B中对应的值矩阵也是500x500的,图像整体的shape维度写成[500,500,3],3表示在每一个通道中都是500x500。

图片的读入:
数据读取就是让计算机认识图片的过程,将图片转换成一个像素的矩阵,通过该矩阵使得计算机对图片进行识别、分析工作。
代码:
import cv2 #opencv读取的格式是BGR
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
img=cv2.imread(‘cat.jpg’)
cv2.imshow(“img”,img)#图像的显示,也可以创建多个窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCv入门笔记(1)_第2张图片

一般用[W,H,C]来表示当前图像的三个维度
(414,500,3)最后的3表示彩色图像的RGB三个维度
对于灰度图像只需要写成(414,500)的形式
在很多的图像检测任务或者识别任务中,我们都需要先把原始数据转化成灰度图,在灰度图中对图像进行各种预处理操作。在任意阶段我们都可以对彩色图和灰度图进行相互转换。
转换的代码:
img=cv2.imread(‘cat.jpg’.cv2.IMREAD_GRAYSCALE)
OpenCv入门笔记(1)_第3张图片

cv2.IMREAD_COLOR:彩色图像
cv2.IMREAD_GRAYSCALE:灰度图像

def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在这里定义了一个图像显示的函数,其中imshow()为显示函数;waitKey(0)等待时间为毫秒级,0表示任意键终止,括号中也可以是0以外的其他数值,可以决定图片显示的时间,1表示图片显示1ms,100表示图片可以显示100ms;destroyAllWindows()按下任意键便可关闭窗口。

保存图片的代码:
cv2.imwrite(‘mycat.png’,img)

图像的一些特征:
type(img)
numpy.ndarray

img.dtype
dtype(‘uint8’)

视频的读取与处理:
图像是静止的,视频是移动的,但其实视频也是由图片组成的,每一帧都是一副静止的图像
代码:
读入视频文件:
vc = cv2.VideoCapture(‘test.mp4’)#检查是否打开正确

if vc.isOpened():
open, frame = vc.read()
else:
open = False

对视频进行展示:
while open:
ret, frame = vc.read()
if frame is None:
break
if ret==True:gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#灰度图
cv2.imshow(‘result’, gray)
if cv2.waitKey(100) & 0xFF == ord(‘q’): break #若waitKey()括号中的数值太小会导致视频播放的很快,瞬间播放完,所以其中的数据决定视频播放速度
vc.release()
cv2.destroyAllWindows()

截取部分图像数据:
img=cv2.imread(‘cat.jpg’)
cat=img[0:200,0:200] #设置索引或切片,选择截取自己感兴趣的部分图像
cv_show(‘cat’,cat)
OpenCv入门笔记(1)_第4张图片

对图片进行颜色通道提取:
b,g,r=cv2.split(img)

b,g,r对于谁来说,图片的shape都是一样的不会变的,b.shape g.shape r.shape都是(414,500)

只保留R通道的代码(出现一个红色图像):
cur_img=img.copy()
cur_img[:, :, 0]=0
cur_img[:, :, 1]=0
cv_show(‘R’, cur_img)
OpenCv入门笔记(1)_第5张图片
只保留G通道的代码(出现一个绿色图像):
cur_img=img.copy()
cur_img[:, :, 0]=0
cur_img[:, :, 2]=0
cv_show(‘G’, cur_img)
OpenCv入门笔记(1)_第6张图片
只保留B通道的代码(出现一个蓝色图像):
cur_img=img.copy()
cur_img[:, :, 1]=0
cur_img[:, :, 2]=0
cv_show(‘B’, cur_img)
OpenCv入门笔记(1)_第7张图片

对图片进行颜色通道合并:
img=cv2.merge((b,g,r))

与split正好相反

边界填充:

top_size,bottom_size,left_size,right_size = (50,50,50,50) #上下左右填充的大小值

replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)
plt.subplot(231), plt.imshow(img, ‘gray’), plt.title(‘ORIGINAL’)
plt.subplot(232), plt.imshow(replicate, ‘gray’), plt.title(‘REPLICATE’)
plt.subplot(233), plt.imshow(reflect, ‘gray’), plt.title(‘REFLECT’)
plt.subplot(234), plt.imshow(reflect101, ‘gray’), plt.title(‘REFLECT_101’)
plt.subplot(235), plt.imshow(wrap, ‘gray’), plt.title(‘WRAP’)
plt.subplot(236), plt.imshow(constant, ‘gray’), plt.title(‘CONSTANT’)
OpenCv入门笔记(1)_第8张图片
plt.show()
对图片进行边界填充,主要是改变图片最外围的边框,共有五种方法:
BORDER_REPLICATE:复制法,也就是复制最边缘像素。
BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
BORDER_CONSTANT:常量法,常数值填充。

图像的融合:
img_cat=cv2.imread(‘cat.jpg’)
img_dog=cv2.imread(‘dog.jpg’)
img_dog = cv2.resize(img_dog, (500, 414))#将两个图片改为同样大小
res = cv2.addWeighted(img_cat, 0.4, img_dog, 0.6, 0)#猫占0.4权重,狗占0.6权重
plt.imshow(res)
OpenCv入门笔记(1)_第9张图片

改变图片的长宽比:
res = cv2.resize(img, (0, 0), fx=3, fy=1)
plt.imshow(res)
OpenCv入门笔记(1)_第10张图片
res = cv2.resize(img, (0, 0), fx=1, fy=3)
plt.imshow(res)
OpenCv入门笔记(1)_第11张图片

你可能感兴趣的:(笔记,opencv,人工智能,图像处理,计算机视觉)