20201121-cv01

1.图像的概念:
“图”是物体反射或透射光的分布,“像“是人的视觉系统所接受的图在人脑中所形版的印象或认识。
2.图像的种类:模拟图像和数字图像
模拟图像:连续存储的数据,
数字图像:分级存储的数据
3.数字图像的表示:
位数:计算机采用0/1编码的系统,数字图像也是利用0/1来记录信息,我们平常接触的图像都是8位数图像,包含0~255灰度,其中0,代表最黑,1,表示最白。
4.图像的分类:
二值图像:二维矩阵仅由0、1两个值构成,“0”代表黑色,“1”代白色。
灰度图:灰度图像通常用每个采样像素8位的非线性尺度来保存,这样可以有256级灰度(如果用16位,则有65536级)
彩色图:由红(R)、绿(G)、蓝(B)三个分量来表示的,分量介于(0,255)。
5.OpenCV简介:OpenCV是一款由Intel公司俄罗斯团队发起并参与和维护的一个计算机视觉处理开源软件库,支持与计算机视觉和机器学习相关的众多算法,并且正在日益扩展。
6.OpenCV的优势:

编程语言
OpenCV基于C++实现,同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Python API,结合了OpenCV C++
API和Python语言的最佳特性。
跨平台
可以在不同的系统平台上使用,包括Windows,Linux,OS X,Android和iOS。基于CUDA和OpenCL的高速GPU操作接口也在积极开发中
活跃的开发团队
丰富的API
完善的传统计算机视觉算法,涵盖主流的机器学习算法,同时添加了对深度学习的支持。

7.OpenCV-Python
OpenCV-Python是一个Python绑定库,旨在解决计算机视觉问题。
8.OpenCV部署方法:
安装:pip install opencv-python3.4.2.17
如果我们要利用SIFT和SURF等进行特征提取时,还需要安装:
安装:pip install opencv-contrib-python
3.4.2.17
9.OpenCV的模块

"""
其中core、highgui、imgproc是最基础的模块,该课程主要是围绕这几个模块展开的,分别介绍如下:

    core模块实现了最核心的数据结构及其基本运算,如绘图函数、数组操作相关函数等。
    highgui模块实现了视频与图像的读取、显示、存储等接口。
    imgproc模块实现了图像处理的基础方法,包括图像滤波、图像的几何变换、平滑、阈值分割、形态学处理、边缘检测、目标检测、运动分析和对象跟踪等。

对于图像处理其他更高层次的方向及应用,OpenCV也有相关的模块实现

    features2d模块用于提取图像特征以及特征匹配,nonfree模块实现了一些专利算法,如sift特征。
    objdetect模块实现了一些目标检测的功能,经典的基于Haar、LBP特征的人脸检测,基于HOG的行人、汽车等目标检测,分类器使用Cascade Classification(级联分类)和Latent SVM等。
    stitching模块实现了图像拼接功能。
    FLANN模块(Fast Library for Approximate Nearest Neighbors),包含快速近似最近邻搜索FLANN 和聚类Clustering算法。
    ml模块机器学习模块(SVM,决策树,Boosting等等)。
    photo模块包含图像修复和图像去噪两部分。
    video模块针对视频处理,如背景分离,前景检测、对象跟踪等。
    calib3d模块即Calibration(校准)3D,这个模块主要是相机校准和三维重建相关的内容。包含了基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性算法,3D信息的重建等等。
    G-API模块包含超高效的图像处理pipeline引擎"""

10.图像的IO操作
(1)读取、显示和保存图像

import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
# 读取
im = cv.imread("weixin.jpg")
# 显示
plt.imshow(imge[:,:,::-1])
# 保存
cv.imwrite("微信.jpg",imge)

为什么显示操作时,代码是这样的:plt.imshow(imge[:,:,::-1])
原因:

(2)绘制几何图像

  • 直线的绘制
    cv.line(img,start,end,color,thickness)

参数:

img:要绘制直线的图像
Start,end: 直线的起点和终点
color: 线条的颜色
Thickness: 线条宽度
  • 矩形绘制

cv.rectangle(img,leftupper,rightdown,color,thickness)
参数:

img:要绘制矩形的图像
Leftupper, rightdown: 矩形的左上角和右下角坐标
color: 线条的颜色
Thickness: 线条宽度
  • 圆形绘制

cv.circle(img,centerpoint, r, color, thickness)
参数:

img:要绘制圆形的图像
Centerpoint, r: 圆心和半径
color: 线条的颜色
Thickness: 线条宽度,为-1时生成闭合图案并填充颜色
  • 向图像中添加文字

cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)
参数:

img: 图像
text:要写入的文本数据
station:文本的放置位置
font:字体
Fontsize :字体大小
  • 效果展示
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 创建一个空白的图像
img = np.zeros((512,512,3), np.uint8)
# 2 绘制图形
# (0,0),(511,511):起点和终点
# (255,0,0):蓝色
# 5:显得粗细
cv.line(img,(0,0),(511,511),(255,0,0),5)
#绘制矩形图
# (384,2),(510,128):左上角坐标值,右上角坐标值
# (0,255,0):绿色
# 3:线粗
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
#绘制圆形图
# (447,63):圆心
# 63:半径
# (0,0,255):红色
# -1:填充
cv.circle(img,(447,63), 63, (0,0,255), -1)
# 添加文字
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
# 字体
font = cv.FONT_HERSHEY_SIMPLEX
# "OpenCv":显示的文字内容
# (10,500):写入的位置
# font:字体
# 4:字体大小
# (255,255,0):蓝色
# 2:线的粗细
# cv.LINE_AA:
cv.putText(img,"OpenCv",(10,500),font,4,(255,255,0),2,cv.LINE_AA)
plt.imshow(img[:,:,::-1])

(3)获取并修改图像中的像素点

import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg')
# 获取某个像素点的值
px = img[100,100]
# 仅获取蓝色通道的强度值
blue = img[100,100,0]
# 修改某个位置的像素值
img[100,100] = [255,255,255]

在这里插入图片描述(4)获取图像的属性
图像属性包括行数,列数和通道数,图像数据类型,像素数等。
在这里插入图片描述在这里插入图片描述(5) 图像通道的拆分与合并

import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
im= cv.imread("./image/dili.jpg")
plt.imshow(im[:,:,::-1])
#通道拆分
b,g,r = cv.split(im)
plt.imshow(b,cmap=plt.cm.gray)
plt.imshow(r,cmap=plt.cm.gray)
plt.imshow(g,cmap=plt.cm.gray)

在这里插入图片描述

hsv = cv.cvtColor(im,cv.COLOR_BGR2HSV)
plt.imshow(hsv)
hsv = cv.cvtColor(im,cv.COLOR_BGR2GRAY)
plt.imshow(hsv)

在这里插入图片描述
11.算数操作
在这里插入图片描述

1.图像的加法

import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv 
im1 = cv.imread("./image/view.jpg")
plt.imshow(im1[:,:,::-1])

在这里插入图片描述

2.图像的减法

im2 = cv.imread("./image/rain.jpg")
plt.imshow(im2[:,:,::-1])

在这里插入图片描述
3.图像的乘法

im_cheng = cv.multiply(im1,im2)
plt.imshow(im_cheng[:,:,::-1])

在这里插入图片描述4.图像的除法

im_chu = cv.divide(im1,im2)
plt.imshow(im_chu[:,:,::-1])

在这里插入图片描述5.图像混合

im_hun = cv.addWeighted(im1,0.7,im2,0.3,0)
plt.figure(figsize=(8,8))
plt.imshow(im_hun[:,:,::-1])
plt.show()

在这里插入图片描述
12.图像的几何变换
1.图像缩放
cv2.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR)
参数:

src : 输入图像

dsize: 绝对尺寸,直接指定调整后图像的大小

fx,fy: 相对尺寸,将dsize设置为None,然后将fx和fy设置为比例因子即可

interpolation:插值方法,

image-20191016161502727

在这里插入图片描述原图:
在这里插入图片描述在这里插入图片描述缩放后

在这里插入图片描述
2 图像平移

图像平移将图像按照指定方向和距离,移动到相应的位置。

API

cv.warpAffine(img,M,dsize)

参数:

img: 输入图像

M: 2∗*∗3移动矩阵

对于(x,y)处的像素点,要把它移动到(x+tx,y+tyx+t_x , y+t_yx+t​x​​,y+t​y​​)处时,M矩阵应如下设置:

M=[10tx01ty]M=\begin{bmatrix} 1&0&t_x\\ 0&1&t_y\\ \end{bmatrix}M=​⎣​⎡​​​1​0​​​​0​1​​​t​x​​​t​y​​​​​⎦​⎤​​

注意:将MMM设置为np.float32类型的Numpy数组。

dsize: 输出图像的大小

注意:输出图像的大小,它应该是(宽度,高度)的形式。请记住,width=列数,height=行数。
M = np.float32([[1,0,100],[0,1,50]])# 平移矩阵
dst = cv.warpAffine(im,M,(cols,rows))
plt.imshow(dst[:,:,::-1])

在这里插入图片描述
3 图像旋转
图像旋转是指图像按照某个位置转动一定角度的过程,旋转中图像仍保持这原始尺寸。图像旋转后图像的水平对称轴、垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换。

那图像是怎么进行旋转的呢?如下图所示:

image-20191023102648731
在这里插入图片描述
同时我们要修正原点的位置,因为原图像中的坐标原点在图像的左上角,经过旋转后图像的大小会有所变化,原点也需要修正。

假设在旋转的时候是以在这里插入图片描述
旋转中心为坐标原点的,旋转结束后还需要将坐标原点移到图像左上角,也就是还要进行一次变换。
API

cv2.getRotationMatrix2D(center, angle, scale)

参数:

center:旋转中心
angle:旋转角度
scale:缩放比例

返回:

M:旋转矩阵

调用cv.warpAffine完成图像的旋转
# 3.1 生成旋转矩阵
M = cv.getRotationMatrix2D((cols/2,rows/2),90,1)
# 3.2 进行旋转变换
dst = cv.warpAffine(im,M,(cols,rows))
plt.imshow(dst[:,:,::-1])

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值