写点什么

Opencv 入门篇:简介与基本使用 | 京东物流技术团队

  • 2023-10-17
    北京
  • 本文字数:3331 字

    阅读完需:约 11 分钟

Opencv入门篇:简介与基本使用 | 京东物流技术团队

1 Opencv 简介

Opencv 是计算机视觉中经典的专用库,其支持多语言,跨平台,功能强大。Opencv-Python 为 Opencv 提供了 Python 接口,使得使用者在 Python 中能够调用 C/C++,在保证易读性和运行效率的前提下,实现所需的功能。


Opencv 是由 Gray Bradsky 于 1999 年在英特尔创立,第一版于 2000 年问世。Vadim Pisarevsky 加入 Gary Bradsky,一起管理因特尔的俄罗斯软件 Opencv 团队。


2005 年,Opencv 用于 Stanley,该车赢得了 2005 年 DARPA 挑战赛的冠军。后来,在 Willow Garage 的支持下,它的积极发展得以继续,由 Gary Bradsky 和 Vadim Pisarevsky 领导了该项目。Opencv 现在支持与计算机视觉和机器学习有关的多种算法,并且正在日益扩展。


Opencv 支持多种编程语言,例如 C++, Python, Java 等,并且可以再 Windows , Linux , OS X , Android 和 IOS 等不同平台上使用。基于 CUDA 和 OpenCL 的高速 GPU 操作的接口也在积极开发中。


Opencv-Python 是用于 Opencv 的 Python API,结合了 Opencv C++ API 和 Python 语言的最佳特性。

1.1 Opencv-Python

Opencv-Python 是旨在解决计算机视觉问题的专用库


Python 是由 Guidovan Rossum 发起的通用编程语言,很快就非常流行,主要是因为他的简单性和代码可读性。它使得程序员可以用较少的代码行表达想法,而不会降低可读性。


与 C/C++之类的语言,Python 速度较慢。也就是说,可以使用 C/C++轻松扩展 Python,这使得我们能够用 C/C++编写计算机密集型代码并创建可用作 Python 模块的 Python 包装器。它给我们带来了两个好处: 首先,代码与原始 C/C++代码一样快(因为它是在后台运行的实际 C++代码), 其次,在 Python 中比 C/C++编写代码更容易。Opencv-Python 是原始 Opencv C++实现的 Python 包装器。


Opencv-Python 利用了 Numpy,这是一个高度优化的库,用于使用 MATLAB 样式的语言进行数值运算。所有 Opencv 数组结构都与 Numpy 数组相互转换。这也使与使用 Numpy 的其他库(例如 Scipy 和 Matplotlib)的集成变得更加容易。

1.2 应用领域

  • 人机互动

  • 物体识别

  • 图像分割

  • 人脸识别

  • 动作识别

  • 运动跟踪

  • 机器人

  • 运动分析

  • 机器视觉

  • 结构分析

  • 汽车安全驾驶


如上所述,opencv 的功能十分强大,在各个领域大放异彩,由浅入深,本次我们先介绍图像编辑,简单的字母数字识别的相关部分,日后会继续开始人脸识别,图像分割,图像定位等等功能;

2 opencv-python 安装与使用

首先我们需要安装一下环境


  1. python3:安装 python3:python 教程有详细的说明,网址安装 python

  2. numpy:安装 numpy:pip install numpy

  3. opencv-python:安装 opencv-python: pip install opencv-python


安装完 opencv-python 后命令行打开 python 交互式环境:import cv2 成功,便说明成功安装了 opencv-python

2.1 imread()

imread 函数读取数字图像,先看一下官网对于该函数的定义


cv2.imread(path_of_image, intflag)
复制代码


函数参数一: 需要读入图像的完整的路径


函数参数二: 标志以什么形式读入图像,可以选择一下方式:


  • cv2.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都将被忽略。它是默认标志

  • cv2.IMREAD_GRAYSCALE:以灰度模式加载图像

  • cv2.IMREAD_UNCHANGED:保留读取图片原有的颜色通道

  • 1 :等同于 cv2.IMREAD_COLOR

  • 0 :等同于 cv2.IMREAD_GRAYSCALE

  • -1 :等同于 cv2.IMREAD_UNCHANGED


color_img = cv2.imread("image_file/1.jpeg")print(color_img.shape)
gray_img=cv2.imread("image_file/1.jpeg", cv2.IMREAD_GRAYSCALE)print(gray_img.shape)
#把单通道图像保存后,再读取,仍然是3通道,相当于将单通道复制到3个通道保存cv2.imwrite("image_file/gray_1.jpeg",gray_img)
复制代码



2.2 threshold()

这个函数作用是将图片二值化,图像的二值化,就是将图像上的像素点的灰度值设置为 0 或 255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。二值化是图像分割的一种最简单的方法。二值化可以把灰度图像转换成二值图像。把大于某个临界灰度值的像素灰度设为灰度极大值,把小于这个值的像素灰度设为灰度极小值,从而实现二值化。


画图举例来说



cv.threshold()用来实现阈值分割,函数有 4 个参数:


  • 参数 1:要处理的原图,一般是灰度图,这也是上一步中处理的

  • 参数 2:设定的阈值

  • 参数 3:最大阈值,一般为 255

  • 参数 4:阈值的方式,主要有 5 种,分别为:THRESH_BINARY,THRESH_BINARY_INV,THRESH_TRUNC,THRESH_TOZERO 和 THRESH_TOZERO_INV


实例如下:


ret, th1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)


ret, th2 = cv.threshold(img, 127, 255, cv.THRESH_BINARY_INV)


ret, th3 = cv.threshold(img, 127, 255, cv.THRESH_TRUNC)


ret, th4 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO)


ret, th5 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO_INV)


titles = [‘Original’, ‘BINARY’, ‘BINARY_INV’, ‘TRUNC’, ‘TOZERO’, ‘TOZERO_INV’]


images = [img, th1, th2, th3, th4, th5]


使用 Matplotlib 显示


for i in range(6):


plt.subplot(2, 3, i + 1)


plt.imshow(images[i], ‘gray’)


plt.title(titles[i], fontsize=8)


plt.xticks([]), plt.yticks([]) # 隐藏坐标轴


plt.show()


实际输出:



对应的官方中说明


2.3 morphologyEx()

形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。需要输入两个参数,一个是原始图像,第二个被称为结构化元素或核,它是用来决定操作的性质的。


两个基本的形态学操作是腐蚀和膨胀。他们的变体构成了开运算,闭运算,具体概念如下:

1)腐蚀:

就像土壤侵蚀一样,这个操作会把前景物体的边界腐蚀掉(但是前景仍然是白色)。这是怎么做到的呢?卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是 1,那么中心元素就保持原来的像素值,否则就变为零。


这会产生什么影响呢?根据卷积核的大小靠近前景的所有像素都会被腐蚀掉(变为 0),所以前景物体会变小,整幅图像的白色区域会减少。这对于去除白噪声很有用,也可以用来断开两个连在一块的物体等。

2)膨胀:

与腐蚀相反,与卷积核对应的原图像的像素值中只要有一个是 1,中心元素的像素值就是 1。


所以这个操作会增加图像中的白色区域(前景)。一般在去噪声时先用腐蚀再用膨胀。因为腐蚀在去掉白噪声的同时,也会使前景对象变小。所以我们再对他进行膨胀。这时噪声已经被去除了,不会再回来了,但是前景还在并会增加。膨胀也可以用来连接两个分开的物体。

3)开运算:

先腐蚀,后膨胀。去除图像中小的亮点(CV_MOP_OPEN);

4)闭运算

先膨胀,后腐蚀。去除图像中小的暗点(CV_MOP_CLOSE);


kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 8))opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)cv.imshow("MORPH_OPEN_1", opening)cv2.waitKey(0)
复制代码



kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 8))closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)cv.imshow("MORPH_OPEN_1", closing)cv2.waitKey(0)
复制代码


3 应用案例

以上是 opencv 的简单使用,现在举一个实际应用的案例:识别验证码,其实按照上面 3 个步骤就可以将图片一步步处理,置灰,二值化,开运算,最后就可以识别了。那么首先原图如下:



1)首次处理效果,将图片灰度化,二值化,为提取轮廓做准备,二值化后,图片非黑即白两种,更有利于开闭运算处理


src = cv2.imread('image_file/before.png')gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)cv.imshow("Binarization", binary)cv2.waitKey(0)
复制代码



2)基础上面二值化图片,对结果图进行开运算处理,去除噪音部分


kernel = cv.getStructuringElement(cv.MORPH_RECT, (8, 1))open_out = cv.morphologyEx(binl, cv.MORPH_OPEN, kernel)cv.imshow("MORPH_OPEN_2", open_out)cv2.waitKey(0)
复制代码



3)最后一次处理,将背景置为白色,并且识别图片识别码


cv.bitwise_not(open_out, open_out)  cv.imshow("Transform", open_out)textImage = Image.fromarray(open_out)text = pytesseract.image_to_string(textImage)  cv2.waitKey(0)
复制代码



4)最后打印出验证码


4 总结

相信认真一起看完上述知识点,opencv-python 已经对于图像的基本操作可以熟练掌握了,接下来会对数字图像的一些其他概念进行介绍,敬请期待~


作者:京东物流 张伟男

来源:京东云开发者社区 自猿其说 Tech 转载请注明来源

发布于: 43 分钟前阅读数: 6
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
Opencv入门篇:简介与基本使用 | 京东物流技术团队_Python_京东科技开发者_InfoQ写作社区