以下提到的这些 Python 工具在编辑图像、 *** 作图像底层数据方面都提供了简单直接的方法。
-- Parul Pandey
当今的世界充满了数据,而图像数据就是其中很重要的一部分。但只有经过处理和分析,提高图像的质量,从中提取出有效地信息,才能利用到这些图像数据。
常见的图像处理 *** 作包括显示图像,基本的图像 *** 作,如裁剪、翻转、旋转;图像的分割、分类、特征提取;图像恢复;以及图像识别等等。Python 作为一种日益风靡的科学编程语言,是这些图像处理 *** 作的最佳选择。同时,在 Python 生态当中也有很多可以免费使用的优秀的图像处理工具。
下文将介绍 10 个可以用于图像处理任务的 Python 库,它们在编辑图像、查看图像底层数据方面都提供了简单直接的方法。
scikit-image 是一个结合 NumPy 数组使用的开源 Python 工具,它实现了可用于研究、教育、工业应用的算法和应用程序。即使是对于刚刚接触 Python 生态圈的新手来说,它也是一个在使用上足够简单的库。同时它的代码质量也很高,因为它是由一个活跃的志愿者社区开发的,并且通过了 同行评审(peer review)。
scikit-image 的 文档 非常完善,其中包含了丰富的用例。
可以通过导入 skimage 使用,大部分的功能都可以在它的子模块中找到。
图像滤波(image filtering):
使用 match_template() 方法实现 模板匹配(template matching):
在 展示页面 可以看到更多相关的例子。
NumPy 提供了对数组的支持,是 Python 编程的一个核心库。图像的本质其实也是一个包含像素数据点的标准 NumPy 数组,因此可以通过一些基本的 NumPy *** 作(例如切片、 掩膜(mask)、 花式索引(fancy indexing)等),就可以从像素级别对图像进行编辑。通过 NumPy 数组存储的图像也可以被 skimage 加载并使用 matplotlib 显示。
在 NumPy 的 官方文档 中提供了完整的代码文档和资源列表。
使用 NumPy 对图像进行 掩膜(mask) *** 作:
像 NumPy 一样, SciPy 是 Python 的一个核心科学计算模块,也可以用于图像的基本 *** 作和处理。尤其是 SciPy v110 中的 scipyndimage 子模块,它提供了在 n 维 NumPy 数组上的运行的函数。SciPy 目前还提供了 线性和非线性滤波(linear and non-linear filtering)、 二值形态学(binary morphology)、 B 样条插值(B-spline interpolation)、 对象测量(object measurements)等方面的函数。
在 官方文档 中可以查阅到 scipyndimage 的完整函数列表。
使用 SciPy 的 高斯滤波 对图像进行模糊处理:
PIL (Python Imaging Library) 是一个免费 Python 编程库,它提供了对多种格式图像文件的打开、编辑、保存的支持。但在 2009 年之后 PIL 就停止发布新版本了。幸运的是,还有一个 PIL 的积极开发的分支 Pillow ,它的安装过程比 PIL 更加简单,支持大部分主流的 *** 作系统,并且还支持 Python 3。Pillow 包含了图像的基础处理功能,包括像素点 *** 作、使用内置卷积内核进行滤波、颜色空间转换等等。
Pillow 的 官方文档 提供了 Pillow 的安装说明自己代码库中每一个模块的示例。
使用 Pillow 中的 ImageFilter 模块实现图像增强:
OpenCV(Open Source Computer Vision 库)是计算机视觉领域最广泛使用的库之一, OpenCV-Python 则是 OpenCV 的 Python API。OpenCV-Python 的运行速度很快,这归功于它使用 C/C++ 编写的后台代码,同时由于它使用了 Python 进行封装,因此调用和部署的难度也不大。这些优点让 OpenCV-Python 成为了计算密集型计算机视觉应用程序的一个不错的选择。
入门之前最好先阅读 OpenCV2-Python-Guide 这份文档。
使用 OpenCV-Python 中的 金字塔融合(Pyramid Blending)将苹果和橘子融合到一起:
SimpleCV 是一个开源的计算机视觉框架。它支持包括 OpenCV 在内的一些高性能计算机视觉库,同时不需要去了解 位深度(bit depth)、文件格式、 色彩空间(color space)之类的概念,因此 SimpleCV 的学习曲线要比 OpenCV 平缓得多,正如它的口号所说,“将计算机视觉变得更简单”。SimpleCV 的优点还有:
官方文档 简单易懂,同时也附有大量的学习用例。
文档 包含了安装介绍、示例以及一些 Mahotas 的入门教程。
Mahotas 力求使用少量的代码来实现功能。例如这个 Finding Wally 游戏 :
ITK (Insight Segmentation and Registration Toolkit)是一个为开发者提供普适性图像分析功能的开源、跨平台工具套件, SimpleITK 则是基于 ITK 构建出来的一个简化层,旨在促进 ITK 在快速原型设计、教育、解释语言中的应用。SimpleITK 作为一个图像分析工具包,它也带有 大量的组件 ,可以支持常规的滤波、图像分割、 图像配准(registration)功能。尽管 SimpleITK 使用 C++ 编写,但它也支持包括 Python 在内的大部分编程语言。
有很多 Jupyter Notebooks 用例可以展示 SimpleITK 在教育和科研领域中的应用,通过这些用例可以看到如何使用 Python 和 R 利用 SimpleITK 来实现交互式图像分析。
使用 Python + SimpleITK 实现的 CT/MR 图像配准过程:
pgmagick 是使用 Python 封装的 GraphicsMagick 库。 GraphicsMagick 通常被认为是图像处理界的瑞士军刀,因为它强大而又高效的工具包支持对多达 88 种主流格式图像文件的读写 *** 作,包括 DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM、TIFF 等等。
pgmagick 的 GitHub 仓库 中有相关的安装说明、依赖列表,以及详细的 使用指引 。
图像缩放:
边缘提取:
Cairo 是一个用于绘制矢量图的二维图形库,而 Pycairo 是用于 Cairo 的一组 Python 绑定。矢量图的优点在于做大小缩放的过程中不会丢失图像的清晰度。使用 Pycairo 可以在 Python 中调用 Cairo 的相关命令。
Pycairo 的 GitHub 仓库 提供了关于安装和使用的详细说明,以及一份简要介绍 Pycairo 的 入门指南 。
使用 Pycairo 绘制线段、基本图形、 径向渐变(radial gradients):
以上就是 Python 中的一些有用的图像处理库,无论你有没有听说过、有没有使用过,都值得试用一下并了解它们。
via: >
环境
矩形 *** 作是我们在 OpenCV 里最常用的 *** 作,其中最为常见的就是包围框( Bounding Box )和旋转矩形( Rotated Box )。 其中包围框是最为常见的,对应 OpenCV 中的 boundingRect() ,使用正矩形框处物体,一般多用在目标检测中。使用包围框框柱目标物体,这种 *** 作比较简单,但是通常框中也会有一些其他的区域。其次就是使用旋转矩形,也叫最小外接矩形,对应 OpenCV 中的 minAreaRect() ,用来使用旋转矩形最大限度的框出目标物体,减小背景干扰,在 OCR 任务中较为常用。
minAreaRect() 返回了所需区域的最小斜矩形的参数,与包围框直接返回四个顶点的坐标不同,最小外接矩形返回的是矩形的 ((x, y), (w, h), angle) ,对应了矩形的中心,宽度,高度和旋转角度。
旋转角度 angle 是水平轴( x 轴)逆时针旋转,与碰到的矩形的第一条边的夹角。并且这个边的边长是 width ,另一条边边长是 height 。也就是说,在这里 width 与 height 不是按照长短来定义的。
在 OpenCV 中,坐标系原点在左上角,相对于 x 轴,逆时针旋转角度为负,顺时针旋转角度为正,所以函数 minAreaRect() 返回的角度范围时 [-90~0) 。想象一个平放的长矩形,调用 minAreaRect() 返回的角度为 -90 度。如果我们旋转图像,直到矩形树立起来,这是调用 minAreaRect() 得到的角度依然是 -90 度。
第一种裁剪旋转矩形的方法是通过仿射变换旋转图像的方式。
仿射变换( Affine Transformation ) 是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”( straightness ,即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”( parallelness ,其实是指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变。)。
计算过程:
如果不做边长和角度的判断,则只会沿着 x 轴的顺时针方向做相同大小角度的旋转,不能保证旋转后的视角是正确的视角:
根据任务目标的类型,做边长和角度的判断并进行相应的调整,可以保证旋转后的视角是正确的视角:
第二种裁剪旋转矩形的方法是通过透视变换直接将旋转矩形的四个顶点映射到正矩形的四个顶点。
透视变换( Perspective Transformation )是将投影到一个新的视平面( Viewing Plane ),也称作投影映射( Projective Mapping )。
计算过程:
以上两种方法都可以用来抠取旋转矩形的内容。仿射变换方法需要预先对整张图进行旋转,通过观察旋转后的图像可以发现,有一部分图像被旋转出了图像边界,如果你要抠取的目标正好在图像边缘附近,那么很容易出界导致图像抠取的缺失。同时我们需要对宽、高和角度做出动态的调整;透视变换的方法直接对抠取区域进行了映射,这种方法可以省略旋转的步骤,并且不会出现抠取内容的缺失。同时我们只需要对4个顶点之间的映射关系做好定义即可,不需要考虑角度的问题。相对的,透视变换相对于仿射变换计算量更大一些,不过这在 c++ 的底层实现上带来的时延差距小于 ms 。
3分别得到两个相机的初始CameraMatrix
4双目视觉进行标定
整个结果看着还行哈。
根据标定结果,放置新的相机
方法有很多
只需要一步 *** 作就完成了,很简单
略,这些个在opencv/example/python中,应该都可以查看到。
基础
你们可能家里都会有一些老照片已经有黑点啊,划痕啊等。你有想过修复它们么?我们不能简单的在绘图工具里把他们擦除了就完了。因为这样只是把黑色的东西变成白色的而已,实际上没用。在这种情况下,会用到一种技术叫图像修复。基本的思想很简单:用周围的像素替换坏掉的像素,这样看上去就和周围一样了。比如下面这张:
很多算法被设计来干这个,OpenCV提供了两个,可以用同一个函数来访问: cv2inpaint()
第一个算法是基于论文" An Image Inpainting Technique Based on the Fast Marching Method"。 是基于快速匹配方法的。假设图像里的一个区域要修复。算法从这个区域的边界开始,逐渐地进入区域,把边界内的所有东西填充上。它取要修复的部分周围的一个像素周围的一小片邻居。这个像素被周围已知的像素的标准加权和替换掉。选择权重是很重要的。要修复的点周围像素的权重较高。和正常边界近的,还有在边界轮廓上的像素的权重较高。当像素被修复以后,它会通过快速匹配方法(FMM)移动到最近的像素。FMM保证那些已知像素周围的像素首先被修复,所以这个就像人工启发式的 *** 作一样。这个算法使用标志cv2INPAINT_TELEA开启。
第二个算法基于论文" Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting "这个算法基于流体动力学和偏微分方程。基本原则是启发式。它首从已知区域先沿着边缘到未知区域访问(由于边缘应该是连续的)。在匹配边要修复区域边界的梯度向量时持续画等值线(把相同亮度的点用线连起来,类似于轮廓线)。这时候用到流体动力学。之后会填充颜色以减小最小方差。这个算法用标志cv2INPAINT_NS启用。
编码
我们需要创建和输入图像相同大小的掩图,需要修复的区域对应的像素要非0剩下的就简单了。我的图像被一些黑色划痕给破坏了(实际上是我自己加的)。我用绘图工具对应的标记出来。
看下面的结果。第一个是输入图像,第二个是掩图,第三个是用第一种算法的结果,最后一张是第二种算法的结果。
END
Brute-Force匹配器基础
Brute-Force匹配器很简单,它取第一个集合里一个特征的描述子并用第二个集合里所有其他的特征和他通过一些距离计算进行匹配。最近的返回。
对于BF匹配器,首先我们得用cv2BFMatcher()创建BF匹配器对象它取两个可选参数,第一个是normType。它指定要使用的距离量度。默认是cv2NORM_L2。对于SIFT,SURF很好。(还有cv2NORM_L1)。对于二进制字符串的描述子,比如ORB,BRIEF,BRISK等,应该用cv2NORM_HAMMING。使用Hamming距离度量,如果ORB使用VTA_K == 3或者4,应该用cv2NORM_HAMMING2
第二个参数是布尔变量,crossCheck模式是false,如果它是true,匹配器返回那些和(i, j)匹配的,这样集合A里的第i个描述子和集合B里的第j个描述子最匹配。两个集合里的两个特征应该互相匹配,它提供了连续的结果,
当它创建以后,两个重要的方法是BFMatchermatch()和BFMatcherknnMatch()。第一个返回最匹配的,第二个方法返回k个最匹配的,k由用户指定。当我们需要多个的时候很有用。
想我们用cv2drawKeypoints()来画关键点一样,cv2drawMatches()帮我们画匹配的结果,它把两个图像水平堆叠并且从第一个图像画线到第二个图像来显示匹配。还有一个cv2drawMatchesKnn来画k个最匹配的。如果k=2,它会给每个关键点画两根匹配线。所以我们得传一个掩图,如果我们想选择性的画的话。
让我们各看一个SURF和ORB的例子(都使用了不同的距离度量)
使用ORB描述子的Brute-Force匹配
这里我们会看到如何匹配两个的里的特征。在这个例子里,我有一个查询图像和一个训练图像,我们用特征匹配来在训练图像里找查询图像。
我们使用SIFT描述子来匹配特征,所以让我们先加载图像,找到描述子。
接着我们用距离度量cv2NORM_HAMMING创建一个BFMatcher对象,crossCheck设为真。然后我们用Matchermatch()方法来获得两个图像里最匹配的。我们按他们距离升序排列,这样最匹配的(距离最小)在最前面。然后我们画出最开始的10个匹配(为了好看,你可以增加)
下面是结果:
什么是匹配器对象?
matches = bfmatch(des1, des2)的结果是DMatch对象列表。这个DMatch对象有下面的属性:
·DMatchdistance - 描述子之间的距离。越低越好
·DMatchtrainIdx - 训练描述子里的描述子索引
·DMatchqueryIdx - 查询描述子里的描述子索引
·DMatchimgIdx - 训练图像的索引
用SIFT描述子和比率测试的Brute-Force 匹配
这次,我们使用BFMatcherknnMatch()来获得k个最匹配的。在这个例子里,我们设置k=2这样我们可以应用比率检测。
看下面的结果
基于FLANN的匹配器
FLANN是快速估计最近邻的库。它包含了一些为大数据集内搜索快速近邻和高维特征的优化算法。它在大数据集的时候比BFMatcher更快。
对于基于FLANN的匹配器,我们需要传两个字典指定要用的算法,他们相关的参数等。第一个是IndexParams。对于更多算法,要传的信息参看FLANN的文档。作为总结,对于像SIFT,SURF等的算法,你可以传下面的:
当使用ORB,你可以传下面的。注释里的值是推荐的值。但是在有些情况下不提供需要的结果。其他的值工作正常。
第二个字典是SearchParams,它指定了索引里的树应该被递归遍历的次数。更高的值带来更高的准确率。但是也花更多时间,如果你想改变值,search_params = dict(checks=100)
通过这些信息,我们可以开始了:
结果:
END
首先分两个:第一个:
Python程序中如何导入OpenCV
解决方法:
找到opencv源代码中的cv2文件夹
复制到anaconda的lib文件夹中
再导入cv2,就好了。
然后python 37中导入
没有安装anaconda,只安装了python的也可以将cv2复制到python的安装路径下的(C:\Program Files\Python37\Lib\site-packages)文件夹中。
opencv430中的cv2
是opencv430可以看到,应该是其支持这几个版本的python。
现在仅仅是可以将cv2导入,但是由于python和opencv的版本支持问题,并不一定可以使用cv2中所有的方法,若遇到问题,可以在评论区写下,一起探索下奥。
以上内容为学习交流使用,纯属个人经验,采纳需谨慎!
解决方式如下:
解决方法:更换低版本matplotlib
pip3 uninstall matplotlib就可以解导入matplotlib库中的pyplot的问题了!
希望这些能帮助到你!
opencv是直接提供python接口的,以opencv2410为例,在opencv的build文件夹下包括提供了包括java,python、x86,x64的相应接口,在python接口中提供了pyd文件,供python语言使用。
以上就是关于10 个 Python 图像编辑工具全部的内容,包括:10 个 Python 图像编辑工具、python opencv安装教程 通过pip安装三方库、OpenCV Python实现旋转矩形的裁剪等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)