小编use*_*217的帖子

OpenCV调整大小在大图像上失败,在函数cv :: resize中出现"error:(-215)ssize.area()> 0"

我正在使用OpenCV 3.0.0和Python 3.4.3来处理非常大的RGB图像(107162,79553,3).我正在尝试使用以下代码调整它的大小:

import cv2
image = cv2.resize(img, (0,0), fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
Run Code Online (Sandbox Code Playgroud)

我有这个错误消息:
"cv2.error:C:\ opencv-3.0.0\source\modules\imgproc\src\imgwarp.cpp:3208:错误:(-215)ssize.area()> 0 in function cv :: resize"

我确定图像阵列中有图像内容,因为我可以将它们保存为jpg格式的小图块.当我尝试仅调整图像的一小部分时,没有问题,我最终得到了正确调整大小的图像.(拿一个相当大的块(50000,50000,3)仍然无法工作,但它可以工作在(10000,10000,3)块)

我想知道是什么原因导致这个问题以及如何解决这个问题?

谢谢

opencv image image-processing python-3.x opencv3.0

24
推荐指数
3
解决办法
8万
查看次数

如何使用Python和OpenCV进行多处理?

我正在使用Python 3.4.3和OpenCV 3.0.0来处理(应用各种过滤器)内存中非常大的图像(80,000 x 60,000),我想使用多个CPU内核来提高性能.经过一些阅读,我得到了两种可能的方法:1)使用python的multiprocessing模块,让每个进程处理一大片大图像并在处理完成后加入结果(这可能应该在POSIX系统上执行?)2)由于NumPy支持OpenMP,而OpenCV使用NumPy,我可以将多处理留给NumPy吗?

所以我的问题是:

哪一个会是更好的解决方案?(如果它们看起来不合理,那么可能的方法是什么?)

如果选项2是好的,我应该用OpenMP构建NumPy和OpenCV吗?我如何实际进行多处理?(我真的找不到有用的指示..)

python parallel-processing opencv image-processing openmp

8
推荐指数
1
解决办法
1万
查看次数

如何使用pip在Windows 7上使用MinGW-w64编译器安装软件包?

我在Windows 7上使用Python 3.4.1 64位.当我尝试使用pip安装scikit-image时,我遇到了一个流行的问题:"无法找到vcvarsall.bat".我确保安装了Visual Studio 2009和2010可再发行组件,并将VS90COMNTOOLS和VS100COMNTOOLS添加到环境变量中.但这没有帮助.同样的错误仍然存​​在.

然后我决定尝试一下MinGW-w64.所以我安装了它.将bin文件夹添加到PATH.然后创建一个包含此代码的distutils.cfg文件

[Build]
compiler = mingw-w64
Run Code Online (Sandbox Code Playgroud)

然后我收到此错误消息:"不知道如何使用'mingw-w64'编译器在平台'nt'上编译C/C++代码".我该怎么解决这个问题?

PS我知道我可以从Christoph Gohlke的页面下载二进制文件,但我仍然想知道如何自己做这个.

python distutils pip python-3.x

7
推荐指数
1
解决办法
5754
查看次数

如何正确打开/解码超过65500*65500像素的jpeg图像?

我正在尝试从Hamamatsu NanoZoomer幻灯片扫描仪生成的文件中提取图像内容.NDPI文件使用修改后的TIFF结构,并将图像内容以JPEG格式存储在一个大块中.使用StripOffsets和StripByteCounts,我能够提取应该是JPEG文件的数据.

数据流具有JPEG文件的所有正确签名,例如FFD8,扫描标记的开始和FFD9,扫描结束标记.如果这是一个小于65500*65500像素的图像,那么如果我将数据流保存到jpeg文件中,我可以正常打开文件.

在JFIF标题中,FFC0标记后面的第三个和第四个字节表示图像高度; 之后的两个字节表示图像宽度.然而与大于65500个*65500像素(这实际上是122880*78848个像素),这四个字节,理应代表图像高度和图像宽度是全零的图像.我将其更改为255,220,255,220 ,然后(第255-263行).当我检查通过右键单击JPEG信息在Windows和选择的细节,我没有看到,Windows照片查看器读取分辨率为65500*65500,尽管他们并不代表真正的像素分辨率.问题是,当我试图打开图像时,它显然以错误的方式解码.

所以我的问题是:我怎样才能正确打开这样的jpeg文件?或者说,如何才能将整个此类图像内容正确解码到内存中?

我现在正在尝试使用MATLAB理解文件结构.最终我将使用Python + OpenCV(或必要时使用Python + Cython + libjpeg-turbo)将整个图像读入内存.

jpeg opencv image libjpeg libjpeg-turbo

5
推荐指数
1
解决办法
1078
查看次数

使用 VIPS 处理非常大的图像有困难

我正在编写一个 Python(3.4.3) 程序,该程序在 Ubuntu 14.04 LTS 上使用 VIPS(8.1.1) 来使用多个线程读取许多小图块,并将它们组合成一个大图像。

在一个非常简单的测试中:

from concurrent.futures import ThreadPoolExecutor
from multiprocessing import Lock
from gi.repository import Vips

canvas = Vips.Image.black(8000,1000,bands=3)

def do_work(x):
    img = Vips.Image.new_from_file('part.tif')    # RGB tiff image
    with lock:
        canvas = canvas.insert(img, x*1000, 0)

with ThreadPoolExecutor(max_workers=8) as executor:
    for x in range(8):
        executor.submit(do_work, x)

canvas.write_to_file('complete.tif')
Run Code Online (Sandbox Code Playgroud)

我得到正确的结果。在我的完整程序中,每个线程的工作涉及从源文件读取二进制文件,将其转换为 tiff 格式,读取图像数据并插入到画布中。这似乎有效,但当我尝试检查结果时,我遇到了麻烦。由于图像非常大(〜50000 * 100000像素),我无法将整个图像保存在一个文件中,所以我尝试了

canvas = canvas.resize(.5)
canvas.write_to_file('test.jpg')
Run Code Online (Sandbox Code Playgroud)

这需要非常长的时间,并且生成的 jpeg 只有黑色像素。如果我调整大小三次,程序就会被终止。我也尝试过

canvas.extract_area(20000,40000,2000,2000).write_to_file('test.tif')
Run Code Online (Sandbox Code Playgroud)

这会导致错误消息segmentation fault(core dumped),但它确实保存了图像。里面有图片内容,但是好像放错地方了。

我想知道可能是什么问题?

以下是完整程序的代码。使用 OpenCV + sharemem(sharedmem 处理多处理部分)也实现了相同的逻辑,并且它的工作没有问题。

import os
import subprocess …
Run Code Online (Sandbox Code Playgroud)

python multithreading image-processing vips

1
推荐指数
1
解决办法
2385
查看次数