关于深度学习:恒源云opencv论文笔记

29次阅读

共计 6680 个字符,预计需要花费 17 分钟才能阅读完成。

文章起源 | 恒源云社区

原文地址 | opencv

原文作者 | instter


不逛不晓得,一逛有惊喜!哈哈哈哈哈,顺手一翻,就看见一位版主在社区发的新论文笔记,开屏就是颜值暴击啊啊啊,就冲着这份暴击,我也得不辞辛苦的搬运进去给大家伙瞅一瞅,接下来,和小编一起观赏精彩内容吧!

注释开始

一、opencv 简介

1 图像的起源

1.1 图像是什么

图像是人类视觉的根底,是天然风物的主观反映,是人类意识世界和人类自身的重要源泉。“图”是物体反射或透射光的散布,“像“是人的视觉零碎所承受的图在人脑中所形版的印象或意识,照片、绘画、剪贴画、地图、书法作品、手写汉学、传真、卫星云图、影视画面、X 光片、脑电图、心电图等都是图像。—姚敏. 数字图像处理:机械工业出版社,2014 年。

1.2 模仿图像和数字图像

图像起源于 1826 年前后法国科学家 Joseph Nicéphore Niépce 创造的第一张可永恒保留的照片,属于模仿图像。== 模仿图像又称间断图像 ==,它通过某种物理量(如光、电等)的强弱变动来记录图像亮度信息,所以是间断变换的。模拟信号的特点是 容易受烦扰,现在曾经根本全面被数字图像代替。

在第一次世界大战后,1921 年美国科学家创造了 Bartlane System,并从伦敦传到纽约传输了第一幅数字图像,== 其亮度用离散数值示意 ==,将图片编码成 5 个灰度级,如下图所示,通过海底电缆进行传输。在发送端图片被编码并应用打孔带记录,通过零碎传输后在接管方应用非凡的打印机复原成图像。
1950 年左右,计算机被创造,数字图像处理学科正式诞生。

模仿图像和数字图像的比照,咱们能够看一下:

2 数字图像的示意

2.1 位数

计算机采纳 0 / 1 编码的零碎,数字图像也是利用 0 / 1 来记录信息,咱们平时接触的图像都是 8 位数图像,蕴含 0~255 灰度,其中 0,代表最黑,1,示意最白。

人眼对灰度更敏感一些,在 16 位到 32 位之间。

2.2 图像的分类

二值图像:
一幅二值图像的二维矩阵仅由 0、1 两个值形成,“0”代表彩色,“1”代红色。因为每一像素(矩阵中每一元素)取值仅有 0、1 两种可能,所以计算机中二值图像的数据类型通常为 1 个二进制位。二值图像通常用于文字、线条图的扫描辨认(OCR)和掩膜图像的存储。

灰度图:
每个像素只有一个采样色彩的图像,这类图像通常显示为从最暗彩色到最亮的红色的灰度,只管实践上这个采样能够任何色彩的不同深浅,甚至能够是不同亮度上的不同色彩。灰度图像与黑白图像不同,在计算机图像畛域中黑白图像只有彩色与红色两种色彩;然而,灰度图像在彩色与红色之间还有许多级的色彩深度。灰度图像常常是在单个电磁波频谱如可见光内测量每个像素的亮度失去的,用于显示的灰度图像通常用每个采样像素 8 位的非线性尺度来保留,这样能够有 256 级灰度(如果用 16 位,则有 65536 级)。

黑白图:
每个像素通常是由红(R)、绿(G)、蓝(B)三个重量来示意的,重量介于(0,255)。RGB 图像与索引图像一样都能够用来示意彩色图像。与索引图像一样,它别离用红(R)、绿(G)、蓝(B)三原色的组合来示意每个像素的色彩。但与索引图像不同的是,RGB 图像每一个像素的色彩值(由 RGB 三原色示意)间接寄存在图像矩阵中,因为每一像素的色彩需由 R、G、B 三个重量来示意,M、N 别离示意图像的行列数,三个 M x N 的二维矩阵别离示意各个像素的 R、G、B 三个色彩重量。RGB 图像的数据类型个别为 8 位无符号整形,通常用于示意和寄存真彩色图像。

3 OPENCV-PYTHON

OpenCV-Python 是一个 Python 绑定库,旨在解决计算机视觉问题。

Python 是一种由 Guido van Rossum 开发的通用编程语言,它很快就变得十分风行,次要是因为它的简略性和代码可读性。它使程序员可能用更少的代码行表达思想,而不会升高可读性。

与 C / C++ 等语言相比,Python 速度较慢。也就是说,Python 能够应用 C / C++ 轻松扩大,这使咱们能够在 C / C++ 中编写计算密集型代码,并创立可用作 Python 模块的 Python 包装器。这给咱们带来了两个益处:首先,代码与原始 C / C++ 代码一样快(因为它是在后盾工作的理论 C ++ 代码),其次,在 Python 中编写代码比应用 C / C++ 更容易。OpenCV-Python 是原始 OpenCV C++ 实现的 Python 包装器。

OpenCV-Python 应用 Numpy,这是一个高度优化的数据库操作库,具备 MATLAB 格调的语法。所有 OpenCV 数组构造都转换为 Numpy 数组。这也使得与应用 Numpy 的其余库(如 SciPy 和 Matplotlib)集成更容易。

3.1 OpenCV 部署办法

装置 OpenCV 之前须要先装置 numpy, matplotlib。

创立 Python 虚拟环境 cv, 在 cv 中装置即可。

先装置 OpenCV-Python, 因为一些经典的算法被申请了版权,新版本有很大的限度,所以选用 3.4.3 以下的版本

pip install opencv-python==3.4.2.17

当初能够测试下是否装置胜利,运行以下代码无报错则阐明装置胜利。

import cv2
# 读一个图片并进行显示(图片门路需本人指定)
lena=cv2.imread("1.jpg")
cv2.imshow("image",lena)
cv2.waitKey(0)

如果咱们要利用 SIFT 和 SURF 等进行特征提取时,还须要装置:

pip install opencv-contrib-python==3.4.2.17
3.2 OPENCV 的模块

下图列出了 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 引擎

二、opencv 基本操作

1 图像的 IO 操作

这里咱们会给大家介绍如何读取图像,如何显示图像和如何保留图像。

1.1 读取图像

API

cv.imread()

参数:

  • 要读取的图像
  • 读取形式的标记

    1⃣️ cv.IMREAD*COLOR:以黑白模式加载图像,任何图像的透明度都将被疏忽。这是默认参数。

    2⃣️ cv.IMREAD*GRAYSCALE:以灰度模式加载图像

    3⃣️ cv.IMREAD_UNCHANGED:包含 alpha 通道的加载图像模式。

    能够应用 1、0 或者 - 1 来代替下面三个标记

  • 参考代码

    import numpy as np
    import cv2 as cv
    # 以灰度图的模式读取图像
    img = cv.imread('messi5.jpg',0)
1.2 显示图像

API

cv.imshow()

参数:

  • 显示图像的窗口名称,以字符串类型示意
  • 要加载的图像
    留神:在调用显示图像的 API 后,要调用 cv.waitKey()给图像绘制留下工夫,否则窗口会呈现无响应状况,并且图像无奈显示进去。
    另外咱们也可应用 matplotlib 对图像进行展现。
  • 参考代码

    # opencv 中显示
    cv.imshow('image',img)
    cv.waitKey(0)
    # matplotlib 中展现
    plt.imshow(img[:,:,::-1])
1.3 保留图像

API

cv.imwrite()

参数:

  • 文件名,要保留在哪里
  • 要保留的图像

参考代码:

cv.imwrite('messigray.png',img)
1.4 总结

咱们通过加载灰度图像,显示图像,如果按’s’并退出则保留图像,或者按 ESC 键间接退出而不保留。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 读取图像
img = cv.imread('messi5.jpg',0)
# 2 显示图像
# 2.1 利用 opencv 展现图像
cv.imshow('image',img)
# 2.2 在 matplotplotlib 中展现图像
plt.imshow(img[:,:,::-1])
plt.title('匹配后果'), plt.xticks([]), plt.yticks([])
plt.show()
k = cv.waitKey(0)
# 3 保留图像
cv.imwrite('messigray.png',img)

2 绘制几何图形

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

参数:

  • 列 img: 要绘制直线的图像
  • 列 Start,end: 直线的终点和起点
  • 列 color: 线条的色彩
  • 列 Thickness: 线条宽度
2.2 绘制圆形
cv.circle(img,centerpoint, r, color, thickness)

参数:

  • img: 要绘制圆形的图像
  • Centerpoint, r: 圆心和半径
  • color: 线条的色彩
  • Thickness: 线条宽度,为 - 1 时生成闭合图案并填充色彩
2.3 绘制矩形
cv.rectangle(img,leftupper,rightdown,color,thickness)

参数:

  • img: 要绘制矩形的图像
  • Leftupper, rightdown: 矩形的左上角和右下角坐标
  • color: 线条的色彩
  • Thickness: 线条宽度
2.4 向图像中增加文字
cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)

参数:

  • img: 图像
  • text:要写入的文本数据
  • station:文本的搁置地位
  • font:字体
  • Fontsize : 字体大小
2.5 成果展现

咱们生成一个全黑的图像,而后在外面绘制图像并增加文字

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 创立一个空白的图像
img = np.zeros((512,512,3), np.uint8)
# 2 绘制图形
cv.line(img,(0,0),(511,511),(255,0,0),5)
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
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)
# 3 图像展现
plt.imshow(img[:,:,::-1])
plt.title('匹配后果'), plt.xticks([]), plt.yticks([])
plt.show()

后果:

3 获取并批改图像中的像素点

咱们能够通过行和列的坐标值获取该像素点的像素值。对于 BGR 图像,它返回一个蓝,绿,红值的数组。对于灰度图像,仅返回相应的强度值。应用雷同的办法对像素值进行批改。

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 图像通道的拆分与合并

有时须要在 B,G,R 通道图像上独自工作。在这种状况下,须要将 BGR 图像宰割为单个通道。或者在其余状况下,可能须要将这些独自的通道合并到 BGR 图像。你能够通过以下形式实现。

# 通道拆分
b,g,r = cv.split(img)
# 通道合并
img = cv.merge((b,g,r))
6 色调空间的扭转

OpenCV 中有 150 多种色彩空间转换方法。最宽泛应用的转换方法有两种,BGR<=>Gray 和 BGR<=>HSV。

cv.cvtColor(input_image,flag)

参数:

  • input_image: 进行色彩空间转换的图像
  • flag: 转换类型

    1⃣️ cv.COLOR_BGR2GRAY : BGR<=>Gray

    2⃣️ cv.COLOR_BGR2HSV: BGR→HSV

三、算术操作

1. 图像的加法

你能够应用 OpenCV 的 cv.add() 函数把两幅图像相加,或者能够简略地通过 numpy 操作增加两个图像,如res = img1 + img2。两个图像应该具备雷同的大小和类型,或者第二个图像能够是标量值。

留神:OpenCV 加法和 Numpy 加法之间存在差别。OpenCV 的加法是饱和操作,而 Numpy 增加是模运算。

参考以下代码:

>>> x = np.uint8([250])
>>> y = np.uint8([10])
>>> print(cv.add(x,y) ) # 250+10 = 260 => 255
[[255]]
>>> print(x+y)          # 250+10 = 260 % 256 = 4
[4]

这种差异在你对两幅图像进行加法时会更加显著。OpenCV 的后果会更好一点。所以咱们尽量应用 OpenCV 中的函数。

咱们将上面两幅图像:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 1 读取图像
img1 = cv.imread("view.jpg")
img2 = cv.imread("rain.jpg")

# 2 加法操作
img3 = cv.add(img1,img2) # cv 中的加法
img4 = img1+img2 # 间接相加

# 3 图像显示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img3[:,:,::-1])
axes[0].set_title("cv 中的加法")
axes[1].imshow(img4[:,:,::-1])
axes[1].set_title("间接相加")
plt.show()

后果

2. 图像的混合

这其实也是加法,然而不同的是两幅图像的权重不同,这就会给人一种混合或者通明的感觉。图像混合的计算公式如下:\(g(x) = (1-\alpha)f_0(x)+\alpha f_1(x)\)

通过批改 \(α\) 的值(0 → 1),能够实现十分炫酷的混合。

当初咱们把两幅图混合在一起。第一幅图的权重是 0.7,第二幅图的权重是 0.3。函数 cv2.addWeighted() 能够按上面的公式对图片进行混合操作。\(dst=α⋅ing1+β⋅img2+γ\)

这里 γ 取为零。
参考以下代码:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 1 读取图像
img1 = cv.imread("view.jpg")
img2 = cv.imread("rain.jpg")

# 2 图像混合
img3 = cv.addWeighted(img1,0.7,img2,0.3,0)

# 3 图像显示
plt.figure(figsize=(8,8))
plt.imshow(img3[:,:,::-1])
plt.show()

正文完
 0