我正在使用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)块)
我想知道是什么原因导致这个问题以及如何解决这个问题?
谢谢
我正在使用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吗?我如何实际进行多处理?(我真的找不到有用的指示..)
我在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的页面下载二进制文件,但我仍然想知道如何自己做这个.
我正在尝试从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)将整个图像读入内存.
我正在编写一个 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)