读取tif格式插件_用C++加速julia:BMP图片读取

本文介绍了作者在处理大量8位BMP灰度图时,通过C++加速读取过程的优化经验。首先尝试了PyCall.jl调用OpenCV,但由于内存分配问题放弃了。接着使用ImageMagick.jl,虽然性能有所提升,但仍有内存浪费。最后,作者通过CxxWrap.jl封装C++代码,实现了高效且无额外内存开销的BMP读取,达到理想效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近写了一个程序,需要大批量地读取8位的BMP格式的灰度图,程序写完profiler一看,竟然读图和处理的时间不相上下,这是万万不可接受的。经过一番折腾,最后决定用C++来加速8位BMP图片的读取。目的很简单,读进来以后变成Float32类型就好了。

打个广告:julia什么语言都能call,C,C++,Fortran,python,R,AnyCall!

PyCall.jl + OpenCV方案

想想,读图是多么简单的事情啊,OpenCV走一波岂不美滋滋。然而julia没有OpenCV的封装,那就PyCall吧!于是请来Python轻松call了OpenCV。PyCall就是这么轻松愉快,所有python的库都直接call,你的是我的,他的也是我的,全是我的!

using PyCall
cv2=pyimport("cv2")
imreadcv(fname)=Float32.(cv2."imread"(fname,0))

选了张512×512的8位灰度图来测个速呗。快速计算一下大小。512×512=256KB,换成Float32也就1MB。

  memory estimate:  61.25 MiB
  allocs estimate:  2359352
  --------------
  minimum time:     483.473 ms (1.26% GC)
  median time:      495.222 ms (1.87% GC)
  mean time:        503.798 ms (3.19% GC)
  maximum time:     548.973 ms (15.07% GC)
  --------------
  samples:          10
  evals/sample:     1

然而测试结果大跌眼镜,竟然alloc了61.25M?WTF???来看看PyCall怎么说的:

Multidimensional NumPy arrays ( ndarray) are supported and can be converted to the native Julia Array type, which makes a copy of the data.

Copy,从Python到Julia的数组是Copy的,反之则不是。就算是Copy也不至于多吃60倍内存对不?果断放弃PyCall。

ImageMagick.jl方案

那要不用julia自己的库?ImageMagick.jl 给大名鼎鼎的ImageMagick库做了封装,速度应该不错。这里有个小坑,对于bmp格式的图,默认是3通道!bmp格式里明明有一位告诉了通道数,就这样被忽略了。无奈,必须先转灰度图,变成了0-1的8位浮点表示。不得不说这是Images.jl 的优秀设计,然而

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值