N******K 发帖数: 10202 | 1 网上搜了搜 没啥合适的库 要么太老了 要么就有大坑 这些库都不能互联互通
所以自己搞一个库 有什么问题自己清楚
本库的目标是
(1)实现新的图像分析算法
(2)充分利用已有的算法:把本库作为一个接口 调用其他各个c++矩阵库和图像算法库
实现步骤:
一维数组是基础 对应的是内存的连续线性存储
数组的一个元素可是一个double也可以是一个double裸数组
然后二维 也就是矩阵 各个元素线性映射(存储)到一维数组
矩阵每一个元素是一个double, float 或 int
不仅仅是存储 而且是有线性计算 定义+ - * /
复杂的运算可以调用eigen或者其他c++库
然后三维 是图像 各个元素线性映射(存储)到一位数组
图像的一个元素(像素)可是一个double也可以是一个double裸数组 或者float int8 等
图像主要实现的是各种计算 比如滤波器
打算一直造到4维数组 图像序列
这个目前要用于存数据 还没想好相关计算
不定义 像素这个类:
(1)如果一个像素是是3double x 3double结构(比如tensor) 那么就存为连续9个
double
定义像素类带来的是运算麻烦比如 像素 A B C D E
线性运算 E = A + 2B + 3C + 4D
如果用矩阵代表一个像素 矩阵的这种加法 会带来若干个临时矩阵
temp1=2B, temp2=A+temp1, temp3=3C, temp4=temp2+temp3, temp4=4D, temp5=temp3+
temp4, E=temp5;
而且多个矩阵放在一起也很麻烦 比如 BigMatrix =[A B C D]
尽管eigen等库可以优化这种计算 但是eigen里面有很多坑 所以还是不把?x?像素定义
为matrix
如果要用matrix运算 直接搞一个matrix壳子 把像素的一维数组数据裹进去,算一算,
把结果拿出来
(2)如果一个像素是3double x 3double x 3double结构(高维tensor) 那么就连续存
为27double
然后就可以开工 用c++搞图像了
计划2个月内完成 |
N******K 发帖数: 10202 | 2 java没有指针 不能直接管理内存 这么搞带来的就是严重的性能问题
而且java的矩阵库和图像算法库严重匮乏 没啥资源可以用
c++很好
库
【在 N******K 的大作中提到】 : 网上搜了搜 没啥合适的库 要么太老了 要么就有大坑 这些库都不能互联互通 : 所以自己搞一个库 有什么问题自己清楚 : 本库的目标是 : (1)实现新的图像分析算法 : (2)充分利用已有的算法:把本库作为一个接口 调用其他各个c++矩阵库和图像算法库 : 实现步骤: : 一维数组是基础 对应的是内存的连续线性存储 : 数组的一个元素可是一个double也可以是一个double裸数组 : 然后二维 也就是矩阵 各个元素线性映射(存储)到一维数组 : 矩阵每一个元素是一个double, float 或 int
|
f**********3 发帖数: 295 | 3 有JLinpack。 OpenGL, OpenCV, VTK, ITK都有Java API。要想自己从头实现那还是C++
吧。
【在 N******K 的大作中提到】 : java没有指针 不能直接管理内存 这么搞带来的就是严重的性能问题 : 而且java的矩阵库和图像算法库严重匮乏 没啥资源可以用 : c++很好 : : 库
|
N******K 发帖数: 10202 | 4 哈哈 OpenCV, VTK, ITK 都是c/c++写的 隔了一层java去调用 多难受
我开头就写了 这些库不能互联互通 而且有大坑
我的目标是开发新算法 不简单是把itk的东西搞个排列组合
C++
【在 f**********3 的大作中提到】 : 有JLinpack。 OpenGL, OpenCV, VTK, ITK都有Java API。要想自己从头实现那还是C++ : 吧。
|
f**********3 发帖数: 295 | 5 对不同的任务选择合适的语言当然是对的,这种情况是C++合适。
【在 N******K 的大作中提到】 : 哈哈 OpenCV, VTK, ITK 都是c/c++写的 隔了一层java去调用 多难受 : 我开头就写了 这些库不能互联互通 而且有大坑 : 我的目标是开发新算法 不简单是把itk的东西搞个排列组合 : : C++
|
N******K 发帖数: 10202 | 6 java的想法很好啊 jvm 不用管内存 多省心
可惜数值计算这方面 可能不是java的发展方向 oracle估计不怎么投入人力搞这个
【在 f**********3 的大作中提到】 : 对不同的任务选择合适的语言当然是对的,这种情况是C++合适。
|
d****i 发帖数: 4809 | 7 你这个没有问题,图像领域没有人用Java的。
【在 N******K 的大作中提到】 : java的想法很好啊 jvm 不用管内存 多省心 : 可惜数值计算这方面 可能不是java的发展方向 oracle估计不怎么投入人力搞这个
|
f**********3 发帖数: 295 | 8 Java本来就合适做high level的任务。
【在 N******K 的大作中提到】 : java的想法很好啊 jvm 不用管内存 多省心 : 可惜数值计算这方面 可能不是java的发展方向 oracle估计不怎么投入人力搞这个
|
n*****t 发帖数: 22014 | 9 哈哈,人家问我写什么程序的,我说底层开发的时候都不好意思看人眼睛
【在 f**********3 的大作中提到】 : Java本来就合适做high level的任务。
|
f**********3 发帖数: 295 | 10 大牛你是把别人看得不好意思了吧
【在 n*****t 的大作中提到】 : 哈哈,人家问我写什么程序的,我说底层开发的时候都不好意思看人眼睛
|
|
|
N******K 发帖数: 10202 | 11 数值计算更是high level
C=A+B 这个数学运算 和 计算机结构有个p的逻辑关系
将来量子计算机出现 C=A+B 还是这么写
【在 f**********3 的大作中提到】 : Java本来就合适做high level的任务。
|
m********5 发帖数: 17667 | 12 我已经造过了, 用c++不难
但矩阵运算还是得用库,人家的效率已经做得很好了, 自己造轮子不划算. 问题只是
matrix header兼容性问题.
现有的图像处理库,只有简单的矩阵运算,稍微不常用一点就得转格式, 比如openCV必须
以pixel为单元, 如果要单独提出某个channel做运算,得先内存拷贝
所以我写了自己的matrix header, 让所有库可以用同一个matrix实现一些功能
GC要小心, 每个库有自己独立的一套方法, 有时候挺麻烦的, 只能自己管理
库
【在 N******K 的大作中提到】 : 网上搜了搜 没啥合适的库 要么太老了 要么就有大坑 这些库都不能互联互通 : 所以自己搞一个库 有什么问题自己清楚 : 本库的目标是 : (1)实现新的图像分析算法 : (2)充分利用已有的算法:把本库作为一个接口 调用其他各个c++矩阵库和图像算法库 : 实现步骤: : 一维数组是基础 对应的是内存的连续线性存储 : 数组的一个元素可是一个double也可以是一个double裸数组 : 然后二维 也就是矩阵 各个元素线性映射(存储)到一维数组 : 矩阵每一个元素是一个double, float 或 int
|
m********5 发帖数: 17667 | 13 那么多大牛用java被你华丽忽视了
【在 d****i 的大作中提到】 : 你这个没有问题,图像领域没有人用Java的。
|
n*****t 发帖数: 22014 | 14 我虽然低着头,还是能感觉到土豪深深的鄙视
【在 f**********3 的大作中提到】 : 大牛你是把别人看得不好意思了吧
|
b*******s 发帖数: 5216 | 15 看过boost::gil吗?
库
【在 N******K 的大作中提到】 : 网上搜了搜 没啥合适的库 要么太老了 要么就有大坑 这些库都不能互联互通 : 所以自己搞一个库 有什么问题自己清楚 : 本库的目标是 : (1)实现新的图像分析算法 : (2)充分利用已有的算法:把本库作为一个接口 调用其他各个c++矩阵库和图像算法库 : 实现步骤: : 一维数组是基础 对应的是内存的连续线性存储 : 数组的一个元素可是一个double也可以是一个double裸数组 : 然后二维 也就是矩阵 各个元素线性映射(存储)到一维数组 : 矩阵每一个元素是一个double, float 或 int
|
N******K 发帖数: 10202 | 16 你看过 itk么?
gil能比itk强?
【在 b*******s 的大作中提到】 : 看过boost::gil吗? : : 库
|
a***n 发帖数: 538 | |
N******K 发帖数: 10202 | 18 你懂我说的是啥么?
【在 a***n 的大作中提到】 : intel不是有mkl和ipp。
|
b*******s 发帖数: 5216 | 19 不熟悉itk,只是个建议,如果itk更合适你可以用。gil只是提供了基本的图像包装和一
些像素处理算法,还是需要自己做不少上层工作的
【在 N******K 的大作中提到】 : 你看过 itk么? : gil能比itk强?
|
N******K 发帖数: 10202 | 20 图像处理 没有什么标准算法 新算法层出不穷
倒是矩阵 就那些东西 没啥新玩意
和一
【在 b*******s 的大作中提到】 : 不熟悉itk,只是个建议,如果itk更合适你可以用。gil只是提供了基本的图像包装和一 : 些像素处理算法,还是需要自己做不少上层工作的
|
|
|
b*******s 发帖数: 5216 | 21 如果是简单的二维的图像矩阵的操作,gil已经基本满足要求了,那个东西和boost在一起
,移植性问题不那么严重,而且假定是可以使用全部stl和大部分boost的算法的,节约
你一些时间可以专注于更高层次的算法
【在 N******K 的大作中提到】 : 图像处理 没有什么标准算法 新算法层出不穷 : 倒是矩阵 就那些东西 没啥新玩意 : : 和一
|
b*******s 发帖数: 5216 | 22 另外不建议你从数组开始搞,这个思路还是c的,直接从最常见的2维容器开始考虑会更
接近你的应用场景,优化也主要针对二维容器搞吧,如果你真准备build from scratch
【在 N******K 的大作中提到】 : 图像处理 没有什么标准算法 新算法层出不穷 : 倒是矩阵 就那些东西 没啥新玩意 : : 和一
|
N******K 发帖数: 10202 | 23 我搞的是3d的图像 像素可以是数或向量
一维数组 可以用 std::vector 网上看了看 性能和new出来的裸
数组一样 c++11可以拿到裸指针 更加方便
二维容器 - matrix 这个必须自己搞 主要目的不是写一个类库 而是配合3d图像运算
以及调用各种线性代数类库的接口/wrapper
三维的 没有什么合适的 算法都要重新写 完全得自己搞
四维的/图像序列 可以把像素看成是四维的 (x,y,z,t) 定义运算
scratch
【在 b*******s 的大作中提到】 : 另外不建议你从数组开始搞,这个思路还是c的,直接从最常见的2维容器开始考虑会更 : 接近你的应用场景,优化也主要针对二维容器搞吧,如果你真准备build from scratch
|
b*******s 发帖数: 5216 | 24 我的感觉是,图像处理里比较常用邻域相关性,所以你在这方面要多花点力气优化,一
些传统的基于一维大数组,然后用指向指针的指针这种方法来实现更高维度的办法,不
一定是cache友好的,而cache友好,对于性能是关键的
算
【在 N******K 的大作中提到】 : 我搞的是3d的图像 像素可以是数或向量 : 一维数组 可以用 std::vector 网上看了看 性能和new出来的裸 : 数组一样 c++11可以拿到裸指针 更加方便 : 二维容器 - matrix 这个必须自己搞 主要目的不是写一个类库 而是配合3d图像运算 : 以及调用各种线性代数类库的接口/wrapper : 三维的 没有什么合适的 算法都要重新写 完全得自己搞 : 四维的/图像序列 可以把像素看成是四维的 (x,y,z,t) 定义运算 : : scratch
|
b*******s 发帖数: 5216 | 25 3维的是一般的游戏用的那种还是医学用的那种?差别不小
算
【在 N******K 的大作中提到】 : 我搞的是3d的图像 像素可以是数或向量 : 一维数组 可以用 std::vector 网上看了看 性能和new出来的裸 : 数组一样 c++11可以拿到裸指针 更加方便 : 二维容器 - matrix 这个必须自己搞 主要目的不是写一个类库 而是配合3d图像运算 : 以及调用各种线性代数类库的接口/wrapper : 三维的 没有什么合适的 算法都要重新写 完全得自己搞 : 四维的/图像序列 可以把像素看成是四维的 (x,y,z,t) 定义运算 : : scratch
|
N******K 发帖数: 10202 | 26 医学图像
【在 b*******s 的大作中提到】 : 3维的是一般的游戏用的那种还是医学用的那种?差别不小 : : 算
|
b*******s 发帖数: 5216 | 27 那种我建议从二维容器开始设计,因为你的3维图像本质上都是二维重建出来的
【在 N******K 的大作中提到】 : 医学图像
|
N******K 发帖数: 10202 | 28 三维图像算法的里面 经常要提取一个小区域的像素数据然后放到一个矩阵里面进行计
算
这个小区与不一定是矩形块 可能是 像S型虫子
double [][][] 这种就是你说的指向指针的指针吧 能把人倒腾晕了
用计算地址的办法 (x,y,z) -> 线性地址 k= z*Lx*Ly+y*Ly+x
然后 Image(x,y,z)的值 就是 Array(k), Lx, Ly, Lz是图像的各维度长度
你有什么高招?
【在 b*******s 的大作中提到】 : 我的感觉是,图像处理里比较常用邻域相关性,所以你在这方面要多花点力气优化,一 : 些传统的基于一维大数组,然后用指向指针的指针这种方法来实现更高维度的办法,不 : 一定是cache友好的,而cache友好,对于性能是关键的 : : 算
|
b*******s 发帖数: 5216 | 29 你看看gil的设计吧,我没自己实现过,直接用的现成的
【在 N******K 的大作中提到】 : 三维图像算法的里面 经常要提取一个小区域的像素数据然后放到一个矩阵里面进行计 : 算 : 这个小区与不一定是矩形块 可能是 像S型虫子 : double [][][] 这种就是你说的指向指针的指针吧 能把人倒腾晕了 : 用计算地址的办法 (x,y,z) -> 线性地址 k= z*Lx*Ly+y*Ly+x : 然后 Image(x,y,z)的值 就是 Array(k), Lx, Ly, Lz是图像的各维度长度 : 你有什么高招?
|
N******K 发帖数: 10202 | 30 (x,y,z) -> 线性地址 k= z*Lx*Ly+y*Lx+x 是本质
假设图像在内存是连续存储 for z{ for y { for x {存入image(x,y,z)} }}
这种可以有多种实现方法
1.暴力计算
(x,y,z) -> k= z*Lx*Ly+y*Lx+x, 输出Array(k)
2. 图像分片 z=0, z=1, ... 每一片存一个头指针
(x,y,z) -> k_pointer=z_headpointer[z]+y*Lx+x
输出k_pointer[0]
这个和暴力计算比 z*Lx*Ly 变成了加法
还有就是用 std::vector<2D_Image> 3D_Image(512) 这种存入 512张z切片
这种不太好
【在 b*******s 的大作中提到】 : 你看看gil的设计吧,我没自己实现过,直接用的现成的
|
|
|
s*****u 发帖数: 164 | |
m**********e 发帖数: 12525 | 32 这个N年前我老人家就实现了.变量X,Y可以是浮点数,数组,矩阵...,X*Y自动变为
浮点数乘,矩阵乘...
我老人家当年的目标是实现对用矩阵为变量的偏微分方程组直接进行运算,这样前台
整个运算简洁明了,每次矩阵运算直接写X*Y就行,复杂的全在后台
妈的最后发现事情比我想象得要复杂多了,上千个头文件看得眼睛都花了.花了
我整整一年时间才交差.
后来发现这纯粹是吃饱撑的,matlab里面改改就能用了.
库
【在 N******K 的大作中提到】 : 网上搜了搜 没啥合适的库 要么太老了 要么就有大坑 这些库都不能互联互通 : 所以自己搞一个库 有什么问题自己清楚 : 本库的目标是 : (1)实现新的图像分析算法 : (2)充分利用已有的算法:把本库作为一个接口 调用其他各个c++矩阵库和图像算法库 : 实现步骤: : 一维数组是基础 对应的是内存的连续线性存储 : 数组的一个元素可是一个double也可以是一个double裸数组 : 然后二维 也就是矩阵 各个元素线性映射(存储)到一维数组 : 矩阵每一个元素是一个double, float 或 int
|
b*******s 发帖数: 5216 | 33 怎么会这么复杂?
【在 m**********e 的大作中提到】 : 这个N年前我老人家就实现了.变量X,Y可以是浮点数,数组,矩阵...,X*Y自动变为 : 浮点数乘,矩阵乘... : 我老人家当年的目标是实现对用矩阵为变量的偏微分方程组直接进行运算,这样前台 : 整个运算简洁明了,每次矩阵运算直接写X*Y就行,复杂的全在后台 : 妈的最后发现事情比我想象得要复杂多了,上千个头文件看得眼睛都花了.花了 : 我整整一年时间才交差. : 后来发现这纯粹是吃饱撑的,matlab里面改改就能用了. : : 库
|
N******K 发帖数: 10202 | 34 你把计算svd的也写了?
【在 m**********e 的大作中提到】 : 这个N年前我老人家就实现了.变量X,Y可以是浮点数,数组,矩阵...,X*Y自动变为 : 浮点数乘,矩阵乘... : 我老人家当年的目标是实现对用矩阵为变量的偏微分方程组直接进行运算,这样前台 : 整个运算简洁明了,每次矩阵运算直接写X*Y就行,复杂的全在后台 : 妈的最后发现事情比我想象得要复杂多了,上千个头文件看得眼睛都花了.花了 : 我整整一年时间才交差. : 后来发现这纯粹是吃饱撑的,matlab里面改改就能用了. : : 库
|
xt 发帖数: 17532 | 35 嗯,我遇到一个软件要直接对L1,L2,L3 cache进行管理,这个是
Java的强项。
【在 N******K 的大作中提到】 : java没有指针 不能直接管理内存 这么搞带来的就是严重的性能问题 : 而且java的矩阵库和图像算法库严重匮乏 没啥资源可以用 : c++很好 : : 库
|
b*******s 发帖数: 5216 | 36 在java里你怎么管理cache的?
【在 xt 的大作中提到】 : 嗯,我遇到一个软件要直接对L1,L2,L3 cache进行管理,这个是 : Java的强项。
|
xt 发帖数: 17532 | 37 别问我,问本版Java大牛
【在 b*******s 的大作中提到】 : 在java里你怎么管理cache的?
|
N******K 发帖数: 10202 | 38 jvm.cache.clear() ?
【在 b*******s 的大作中提到】 : 在java里你怎么管理cache的?
|
b*******s 发帖数: 5216 | 39 你才说了java擅长cache管理
【在 xt 的大作中提到】 : 别问我,问本版Java大牛
|
s****a 发帖数: 238 | 40 那是在触他们霉头
【在 b*******s 的大作中提到】 : 你才说了java擅长cache管理
|
|
|
s****a 发帖数: 238 | 41 我觉得完全够用了,全部是模板写的,速度没有问题。另外个好处是松耦合,只管理内
存和做些elementwise的操作,复杂点的算法直接把裸指针丢给库就行了,自己实现也
很顺手
【在 s*****u 的大作中提到】 : blitz++ 不行?
|
b*******s 发帖数: 5216 | 42 看名字是德国人写的?
【在 s****a 的大作中提到】 : 我觉得完全够用了,全部是模板写的,速度没有问题。另外个好处是松耦合,只管理内 : 存和做些elementwise的操作,复杂点的算法直接把裸指针丢给库就行了,自己实现也 : 很顺手
|
s*****u 发帖数: 164 | 43 需要调用 lapack 的话,我都是写个 wrapper ,原地操作,基本上没有 overhead 。
【在 s****a 的大作中提到】 : 我觉得完全够用了,全部是模板写的,速度没有问题。另外个好处是松耦合,只管理内 : 存和做些elementwise的操作,复杂点的算法直接把裸指针丢给库就行了,自己实现也 : 很顺手
|
N******K 发帖数: 10202 | 44 基本框架完成 发现一个大问题 就是 cpu 4核 8线程 根本不够快
得上GPU才行
打算把 itk的gup部分 直接ctrl-c ctrl-v
目前先用此框架 把算法搭建起来 然后换到gpu
库
【在 N******K 的大作中提到】 : 网上搜了搜 没啥合适的库 要么太老了 要么就有大坑 这些库都不能互联互通 : 所以自己搞一个库 有什么问题自己清楚 : 本库的目标是 : (1)实现新的图像分析算法 : (2)充分利用已有的算法:把本库作为一个接口 调用其他各个c++矩阵库和图像算法库 : 实现步骤: : 一维数组是基础 对应的是内存的连续线性存储 : 数组的一个元素可是一个double也可以是一个double裸数组 : 然后二维 也就是矩阵 各个元素线性映射(存储)到一维数组 : 矩阵每一个元素是一个double, float 或 int
|
N******K 发帖数: 10202 | 45 三个礼拜 我的效率还是很高的 hiahia
库
【在 N******K 的大作中提到】 : 网上搜了搜 没啥合适的库 要么太老了 要么就有大坑 这些库都不能互联互通 : 所以自己搞一个库 有什么问题自己清楚 : 本库的目标是 : (1)实现新的图像分析算法 : (2)充分利用已有的算法:把本库作为一个接口 调用其他各个c++矩阵库和图像算法库 : 实现步骤: : 一维数组是基础 对应的是内存的连续线性存储 : 数组的一个元素可是一个double也可以是一个double裸数组 : 然后二维 也就是矩阵 各个元素线性映射(存储)到一维数组 : 矩阵每一个元素是一个double, float 或 int
|