opencv和pil读取一样吗(opencv和pil读取图像的区别)

      最后更新:2022-11-08 14:57:38 手机定位技术交流文章

      python matplotlib.pyplot 可以显示opencv、PIL读取的图像,反过来opencv、PIL怎么读取plt包绘制的图像?

      可以考虑使用plt.savefig()保存图片,再用opencv来读取就好了
      python matplotlib.pyplot 可以显示opencv、PIL读取的图像,反过来opencv、PIL怎么读取plt包绘制的图像?

      opencv 用imread读取多张图片(图片大小相同)时,读取时间不同

      因为图片格式都是压缩格式的数据,并不是说总像素相同两个图像就相同。一张内容丰富的图片个一张纯白色图片占用的空间是不一样的。也就是说opencv在解压图像时需要处理的数据量和计算量是不同的。所以,依据图像的不同,加载图像的时间也是不一样的。
      因为机械磁盘是个速度相当不稳定的东西。另外显示尺寸相同的图片的文件大小会有差别。而且某些压缩格式不同的图片解压速度也会差很多,不过这个一般不会到100倍的级别。
      这个与计算机的硬件和运行状态(内存占用)也有关系,可以运行多次取平均时间!
      嗯,读取的时间会有不同。计时方法都是有精度的,cpu不同时刻运算效率也不一样的。
      opencv 用imread读取多张图片(图片大小相同)时,读取时间不同

      Python的各种imread函数在实现方式和读取速度上有何区别

      一看到题主的问题,其实就有个猜想,其实底层应该都是一样的,或者说没几个独立的实现吧?主要是关注开源软件一段时间之后,就会发现开源界其实挺缺人的,现有这些人也都挺懒的。挖坑的人多,填坑的人少。说是这活谁都可以参与,但其实真没多少人实际做。一个活有一个人干了,其他人一般就懒得再重复了。以下就是从源码来看这些开源库的具体实现。 1. PIL.Image.open代码在这里:Pillow/Image.py at 3.1.x · python-pillow/Pillow · GitHubopen() 函数打开图像,但并不读入,直到有操作发生。具体的读取操作是在 ImageFile.py 写的。大体流程是先检测文件类型,整块地读入文件内容,然后调用解码器解码,做了很多优化,效率应该还是很高的。2. scipy.ndimage.imread代码在这里:scipy/io.py at v0.17.1 · scipy/scipy · GitHubimread 调用 scipy.misc.pilutil.imread。从名字就能看出来其实调用的还是 Pillow。根据 pilutil 代码:scipy/pilutil.py at v0.17.1 · scipy/scipy · GitHub确实是调用 pil.image.open(),然后返回一个 fromimage()。3. scipy.misc.imreadmisc 的 __init__.py 在这里:scipy/__init__.py at v0.17.1 · scipy/scipy · GitHub调用的还是 pilutil 中的 imread相关代码如下try:from .pilutil import *from . import pilutil__all__ += pilutil.__all__del pilutilexcept ImportError:pass也算是学了一招,从 pilutil 导入其所有函数添加到当前空间,然后又删除了 pilutil 消除影响。4. skimage.io.imread代码在这里:scikit-image/_io.py at master · scikit-image/scikit-image · GitHub是通过插件 plugin 来读入不同的文件,而且会试用几个不同的 plugins 来找到合适的。使用 call_plugin 来调用,代码在这里:scikit-image/manage_plugins.py at master · scikit-image/scikit-image · GitHub可以根据如下代码查看插件调用的优先级# For each plugin type, default to the first available plugin as defined by# the following preferences.preferred_plugins = {# Default plugins for all types (overridden by specific types below).'all': ['pil', 'matplotlib', 'qt', 'freeimage'],'imshow': ['matplotlib'],'imshow_collection': ['matplotlib']}plugins 的源代码在这里:scikit-image/skimage/io/_plugins at master · scikit-image/scikit-image · GitHub。可以看到 pil 的 imread,是用 open 打开图像之后,再转换成 ndarray。5. cv2.imread这里是调用的 CV::imread(),代码在这里:opencv/loadsave.cpp at master · opencv/opencv · GitHub。一般来说 CC++ 的实现,应该比 python 速度快一点。6. matplotlib.image.imreadmatplotlib 的文档里面说,matplotlib 原生只可以读取 PNG 文件,有 PIL 的时候,可以读取其他类型的文件。如果使用 URL 打开在线图像文件,需要符合 PIL 的文档要求。matplotlib.image.imread 的代码在这里:matplotlib/image.py at master · matplotlib/matplotlib · GitHub。matplotlib 的原生 PNG 读取和写入,是用 C 实现的,代码在这里:matplotlib/_png.cpp at master · matplotlib/matplotlib · GitHub。matplotlib 是先用 pil 的 open 打开图像,如果格式是 png,就用原生方法打开。相关代码如下:handlers = {'png': _png.read_png, }if format is None:if cbook.is_string_like(fname):parsed = urlparse(fname)# If the string is a URL, assume pngif len(parsed.scheme) > 1:ext = 'png'else:basename, ext = os.path.splitext(fname)ext = ext.lower()[1:]elif hasattr(fname, 'name'):basename, ext = os.path.splitext(fname.name)ext = ext.lower()[1:]else:ext = 'png'else:ext = formatif ext not in handlers:im = pilread(fname)if im is None:raise ValueError('Only know how to handle extensions: %s; ''with Pillow installed matplotlib can handle ''more images' % list(six.iterkeys(handlers)))return im声明的处理器只有 png。如果是 png 文件,调用 _png.read_png。如果不是 png 直接使用 pilread(就是用 pil 的 Image.open 然后 pil_to_array)。matplotlib 的源码确实比较复杂,一大部分主体是用 C 写的,改动很激进,功能更新猛烈。小结从源码看,绝大多数常用代码库其实都还是用的 PIL。原因容易理解,PIL 是纯 Python 实现的,而且经过了优化,性能应该还不错。除了 PIL 之外,常用的就是 OpenCV 和 Qt。OpenCV 和 Qt 是 C/C++ 实现的,可能速度会快一些,但具体要测试才知道。稍后会在 GitHub 上开一个对比测试的 Repo 再测试一下性能。scikit-images 的插件机制很灵活有趣,尤其是它提供了其他几种图像读取的实现。 matplotlib 代码稍显乱一点,但更证明了其功能迭代速度快,开发激进。用 matplotlib 尽量多用PNG 以便利用原生的 PNG 支持
      Python的各种imread函数在实现方式和读取速度上有何区别

      在OpenCV中,为什么用imread读取图像后,它的image.cols的值却是0?

      先测试下image.empty(), 如果返回true说明图像读取失败。
      void salt(cv::Mat &image,int n){for(int k=0;k应该是当前文件夹里未找到dnjdkjcxyjzx.jpg
      dnjdkjcxyjzx.jpg这个文件在源程序目录下吗?
      在OpenCV中,为什么用imread读取图像后,它的image.cols的值却是0?

      opencv中怎么样读取图像的部分图像

      OpenCV中用于读取图像像素点的值的方法很多,这里主要提供了两种常用的方法。 方法一利用IplImage数据类型的imageData定位数据缓冲区来实现,imageData包含指向图像第一个像素数据的指针例:If( imgSource != 0 )//imgSource为IplImage*{for ( int i = 0; i < imgSource->height; ++i ){uchar * pucPixel = (uchar*)imgSource->imageData + i*imgSource->widthStep;for ( int j = 0; j < imgSource->width; ++j ){pucPixel[3*j] = 0;//像素第一个通道的值pucPixel[3*j + 1] = 0;//像素第二个通道的值pucPixel[3*j + 2] = 0;//像素第三个通道的值}}}方法二利用OpenCV提供的GetReal*D,SetReal*D和Get*D,Set*D,这里*为2,对于单通道图像可以使用前两个函数,对于多通道图像可以使用后两个函数例:If( imgSource != 0 )//imgSource为IplImage*{for ( int i = 0; i < imgSource->height; ++i )for ( int j = 0; j < imgSource->width; ++j ){//获取(i, j)处的三通道图像像素值CvScalar scaPixelVal = cvGet2D( imgSource, i, j );//获取(i, j)处的单道图像像素值double dPixelVal = cvGetReal2D( imgSource, i, j );//设定(i, j)处的三通道图像像素值cvSet2D( imgSource, i, j, scalPixelVal );//设定(i, j)处的单通道图像像素值cvSetReal2D( imgSource, i, j, dPixelVal );} }
      opencv中怎么样读取图像的部分图像

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/43891.html

          热门文章

          文章分类