opencv python tutorials_OpenCV-Python Tutorials 笔记(二)

OpenCV官方有一个面向python的文档OpenCV-Python

Tutorials:

我根据此文档进行了实践学习,结合自己经验简单记录一下笔记。(续)

4、Image Processing in

OpenCV

4.1Changing

Colorspaces

转换颜色空间算是极其常用的操作了。不用说,cvtColor()。

相关参数:COLOR_BGR2GRAY、COLOR_BGR2HSV

等。注意这里不用 CV_BGR2GRAY了。

教程演示了一个用HSV颜色空间进行跟踪的例子,挺有意思的。拷贝代码:

cap = cv2.VideoCapture(0)

while(1):

# Take

each frame

_,

frame = cap.read()

#

Convert BGR to HSV

hsv =

cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

#

define range of blue color in HSV

lower_blue = np.array([110,50,50])

upper_blue = np.array([120,255,255])

#

Threshold the HSV image to get only blue colors

mask =

cv2.inRange(hsv, lower_blue, upper_blue)

#

Bitwise-AND mask and original image

res =

cv2.bitwise_and(frame,frame, mask= mask)

cv2.imshow('frame',frame)

cv2.imshow('mask',mask)

cv2.imshow('res',res)

k =

cv2.waitKey(5) & 0xFF

if k ==

27:

break

cv2.destroyAllWindows()

此外,讲了一下如何求出所需的HSV值。用图像编辑软件或者打两行代码都行。

>>> green = np.uint8([[[0,255,0 ]]])

>>> hsv_green =

cv2.cvtColor(green,cv2.COLOR_BGR2HSV)

>>> print hsv_green

[[[ 60 255 255]]]

4.2 Geometric Transformations of

Images

图像几何变换,尺度、平移、旋转、仿射、透视,等。需要相关的计算机视觉几何学背景。

在推荐书目里果然看到了这本书:“Computer Vision: Algorithms and Applications”,

Richard Szeliski

尺度变换最简单也最常用:resize()。自带几种算法。

Preferable interpolation methods are cv2.INTER_AREA for

shrinking and cv2.INTER_CUBIC (slow) & cv2.INTER_LINEAR for

zooming.

平移和旋转都是仿射变换,需要确定变换矩阵。函数:cv2.warpAffine()

平移矩阵最简单:

旋转矩阵就要计算一下了:函数

getRotationMatrix2D()

OpenCV里为了可以确定旋转后大小和中心位置,矩阵如下:

其中

综合起来的时候呢,仿射变换可以由三点确定(因矩形变换后一定是平行四边形)

只要你给出三个点在变换前后的坐标,就可以用函数getAffineTransform()计算2*3的仿射变换矩阵。

代码:

img = cv2.imread('drawing.png')

rows,cols,ch = img.shape

pts1 = np.float32([[50,50],[200,50],[50,200]])

pts2 = np.float32([[10,100],[200,50],[100,250]])

M = cv2.getAffineTransform(pts1,pts2)

dst =

cv2.warpAffine(img,M,(cols,rows))

透视变换:

getPerspectiveTransform()、warpPerspective()

透视变换矩阵是3*3的。给出四个点的坐标(任意三点不共线)可以进行计算。代码类似仿射的。

4.3 Image Thresholding

图像阈值化:简单阈值化、自适应阈值化(平均、高斯)、Ostu(最大类间差/大津法)

函数:cv2.threshold, cv2.adaptiveThreshold

一张图说明简单阈值化的五个参数,太有用了:

ostu法这个还真没有用过:

ret,th =

cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

后边讲了实现原理,暂不仔细看了。

4.4 Smoothing Images

图像平滑。

二维卷积(图像滤波操作):cv2.filter2D(),低通滤波去噪模糊,高通滤波锐化勾边。学过图像处理的都知道。

平滑卷积核例如:kernel

= np.ones((5,5),np.float32)/25

又如著名的拉普拉斯算子:kernel

= np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])

图像模糊/平滑有几个函数。blur、GaussianBlur、medianBlur、bilateralFilter等

4.5Morphological

Transformations

图像形态学处理:膨胀、腐蚀、开运算、闭运算、黑帽运算、顶帽运算、形态学梯度运算。

函数:cv2.erode(), cv2.dilate(),

cv2.morphologyEx() 等

函数调用时要紧的是构建一个核。

img = cv2.imread('j.png',0)

kernel = np.ones((5,5),np.uint8)

erosion = cv2.erode(img,kernel,iterations = 1)

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

也有专门构建核的函数:getStructuringElement,自带矩形核、椭圆核、十字核三种。

4.6 Image Gradients

图像梯度。函数:cv2.Sobel(), cv2.Scharr(), cv2.Laplacian()

注意Sobel函数要分别求XY然后相加。

这里教程特别说明了一下类型的问题。梯度运算时如果使用CV_8U会使得负数值化为零,丢失负向梯度。因此建议使用更高精度类型如CV_64F。

其余的不再赘述。有图像处理知识的人看看就明白了。

4.7 Canny Edge Detection

Canny 边缘检测。讲得比较详细。原理没细看,代码极其简单。

4.8 Image Pyramids

图像金字塔。很多算法的基础。函数:cv2.pyrUp(),

cv2.pyrDown()

得到的是高斯金字塔,向下是缩小,向上是放大。需要拉普拉斯金字塔时做差分就行了,没有专门函数。

教程里给了个利用六级金字塔融合图像的例子。(调试中发现图片需要满足边长能整除64。当然啦。)

看代码里边用到了几个python-Numpy函数没见过,记录一下:

BIF:zip,就是把2个数组糅在一起:

x=[1, 2, 3, 4, 5 ]

y=[6, 7, 8, 9, 10]

zip(x, y)就得到了

[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]

np.hstack,横向连接数组。vstack纵向连接。

挺洋气,以前没想到过图像还可以这样融合诶,效果还不错,当然就是模糊了点。

4.9 Contours in OpenCV

4.9.1 Contours : Getting Started

轮廓专题。轮廓在《学习OpenCV》第一版里可是用专门一章来讲的,好像挺复杂,不过我并没怎么看过。

函数cv2.findContours(), cv2.drawContours()

(未完待续)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

runltp出现问题 [

runltp 623行: if [ "$?" "0" ]; then 对[解析出了问题。 我灵机一动,是不是sh的问题。 which sh /bin/sh ls -l /bin/sh sh指向dash 果然不对 rm后 ln -s /bin/bash /bin/sh 再次运行,正确。 转载于:https://www.cnbl…

fork join框架_Java 7:Fork / Join框架示例

fork join框架Java 7中的Fork / Join Framework专为可分解为较小任务的工作而设计,并将这些任务的结果组合起来以产生最终结果。 通常,使用Fork / Join Framework的类遵循以下简单算法: // pseudocode Result solve(Problem problem) {if (p…

numpy T、transpose()函数、swapaxes()函数

目录 1 矩阵转置T,既线性代数中矩阵转置 2 transpose()函数 3 swapaxes()函数 1 矩阵转置T,既线性代数中矩阵转置 示例程序如下: import numpy as npa np.arange(0,24,2).reshape(3, 4)print(*****a****) print(a: \n, a) print(a.…

leetcode-54 螺旋矩阵

题目: 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:输入:[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]示例 2:输入:[ [1, 2, 3, 4], [5, 6, 7, 8], [9,…

米线店结账程序 装饰着模式_实验报告2_装饰者模式

序号:姓名:杨林燕学号:106专业:软件工程日期:成绩:实验二装饰者模式的运用一、实验目的:装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的…

Java的内置垃圾收集如何使您的生活更美好(大部分时间)

通过从应用程序中学习企业APM产品,发现更快,更高效的性能监控。 参加AppDynamics APM导览! “无需为用户编写将寄存器返回到自由存储列表的程序。” 该行(以及随后的十几行)被埋在约翰麦卡锡(John McCart…

PyOpenCV 坐标系统

pyOpenCV中的坐标系统,以图片左上角为原点(0,0),水平方向为x轴(也既图像的宽度width),竖直方向为y轴(也既图像的高度height),如下图所示: #图像中…

office 论文 页码_毕业论文必备技巧:Word页码从第三页开始设置方法

许多应届毕业生在排版毕业论文时候,都会按要求设置页码,第一页是封面,第二页是目录,那么正文内容就要从第三页正式开始了。按照正规设置方式,那么页码此时应该是第三页。但是按照论文格式规定,页码应该是从…

散列

一.什么是散列 散列使用一个散列函数,将一个键映射到一个索引上。散列非常高效。使用散列将耗费O(1)时间来查找、插入、及删除一个元素。 映射表是一种用散列实现的数据结构,映射表是一种存储条目的容器,每个条目包含两个部分:一个…

移动端触摸(touch)事件

目有个交互需要实现手指滑动的交互,pc端使用mousedown,mousemove,mouseup监听实现。 但在ios设备上mousemove是不好监听的,同类的方法是touchstart,touchmove,touchend。 项目需求,需要用到拖动事件。由于不需要考虑IE8等低端浏览器的兼容性&…

numcpp速度对比_PHP和C++性能对比.pdf

PHP 与C性能比较本文博客链接:http://keping.me/php_vs_cpp/PHP 是速度很快的脚本语言,但是用了框架以后好像感觉挺慢的。于是猜测会不会PHP 本身也不是很快。如果不是很快,能否采用 PHP 调用本地动态链接库的形式来提升速度。于是有了下面的…

jndi ldap_什么是JNDI,SPI,CCI,LDAP和JCA?

jndi ldapJNDI代表Java命名和目录接口 。 它是用于提供对目录服务(即,服务映射名称(字符串)与对象,对远程对象或简单数据的引用)访问的API。 这就是所谓的 约束力 。 绑定集称为上下文 。 应用程序使用JND…

PyOpenCV 基本操作

目录 1. 图片加载、显示和保存 2. 图像显示窗口创建与销毁 3. 图片宽、高、通道数获取 4. 图像像素数目和图像数据类型的获取 5. 生成指定大小的空图像, 生成指定大小的空图像 6. 访问和操作图像像素 7. 图像三通道分离和合并 8. 抓取摄像头 1. 图片加载、显示和保存 …

python中用于标识字符串的定界符_Python 基本数据类型

######################基本数据类型######################数字类型整数 int整数是用来表示整数数值,即没有小数部分的数值,包括正整数 负整数和0整数类型包括十进制整数 八进制整数 十六进制整数和二进制整数例如: 0 , 100 , 65205浮点数 float浮点数由整数部分和小数部分组成…

适用于Java开发人员的Elasticsearch:命令行中的Elasticsearch

本文是我们学院课程的一部分,该课程的标题为Java开发人员的Elasticsearch教程 。 在本课程中,我们提供了一系列教程,以便您可以开发自己的基于Elasticsearch的应用程序。 我们涵盖了从安装和操作到Java API集成和报告的广泛主题。 通过我们简…

系统间账号认证系统同步方案

系统间账号认证系统同步方案 基础原理:(基于Web) 浏览器在个请求传递cookie到服务器,服务器对cookie增删改查的操作, 写入JSessionId实现与服务器Session的绑定,保持会话 单机情况下:一个域名,对应一个cookie&#xff…

Pytorch 加载预训练模型参数时出现size mismatch错误

目录 1 不妨先研究一下’ resnet18-5c106cde.pth’里面存了什么东西以及它的数据类型 (1_1)’ resnet18-5c106cde.pth’的数据类型

python元类单例_python面向对象和元类的理解

1 python类对象与实例对象python中一切皆对象(广义上的对象),类也不例外,我们可以称类为类对象。python中内建函数type()可以返回对象的类型,例如type(int)会得到返回值,而int为类型工厂函数,是内置的类对象。如果对自…

Java命令行界面(第7部分):JCommander

这是我系列的第七篇文章,简要介绍了用于处理Java命令行参数的各种库。 这篇文章回到了基于注释的库的覆盖范围,该库似乎是在Java中可用于处理命令行参数的众多可用库中知名度最高和最受欢迎的库之一: JCommander 。 JCommander的网页上指出&…

Pytorch 加载部分预训练模型并冻结某些层

目录 1 pytorch的版本&#xff1a; 2 数据下载地址&#xff1a; 3 原始版本代码下载&#xff1a; 4 直接上代码&#xff1a; 1 pytorch的版本&#xff1a; 2 数据下载地址&#xff1a; <https://download.pytorch.org/tutorial/hymenoptera_data.zip> 3 原始…