- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从磁盘加载 RGB 图像 JuicyPixels-repa
。不幸的是,图像的数组表示是 Array F DIM3 Word8
其中内部维度是 RGB 像素。这与现有的repa
有点不兼容。 RGB 图像为 Array U DIM2 (Word8, Word8, Word8)
的图像处理算法.
我想计算图像的 RGB 直方图,我正在搜索带有签名的函数:
type Hist = Array U DIM1 Int
histogram:: Array F DIM3 Word8 -> (Hist, Hist, Hist)
如何折叠 3d 数组以获得每个颜色 channel 的 1d 数组?
编辑:
主要问题不是我无法从 DIM3
进行转换至DIM2
对于每个 channel (通过切片很容易完成)。问题是我必须迭代源图像 DIM2
或DIM3
并且必须累积到 DIM1
不同的数组Shape
(Z:.256)
和范围。所以我不能使用repa的foldS
因为它将维度减少了一倍,但程度相同。
我还尝试过traverse
但它会迭代目标图像的范围,提供从源图像获取像素的函数,这会导致代码效率非常低,为每个颜色值计算相同的像素。
一个好方法是简单折叠 Vector
使用直方图类型作为累加器,但不幸的是我没有 U
(未装箱)或V
基于(向量)的数组,我可以从中有效地获得 Vector
。我有一个Array F
(外部指针)。
最佳答案
好的,我找到了几分钟。下面,我介绍了四种解决方案,并使最差的解决方案(中间两个,涉及 O(n) 数据转换)对您来说非常容易。
让我们承认愚蠢的解决方案
从显而易见的事情开始是合理的。您可以使用 Data.List.foldl 遍历行和列,从初始零数组构建直方图(以下是未经测试/部分代码):
foldl (\(histR, histG, histB) (row,col) ->
let r = arr ! (Z:.row:.col:.0)
g = arr ! (Z:.row:.col:.1)
b = arr ! (Z:.row:.col:.2)
in (incElem r histR, incElem g histG, incElem b histB)
(zero,zero,zero)
[ (row,col) | row <- [0..nrRow-1], col <- [0..nrCol-1] ]
...
where (Z:.nrRow:.nrCol:._) = extent arr
我不确定这有多高效,但怀疑它会进行太多的边界检查。切换到 unsafeIndex 应该是合理的,假设延迟数组 hist*
表现良好,因为您选择实现 incElem
。
您可以构建您想要的数组
使用traverse
,您实际上可以将 JP-Repa 样式数组转换为带有元素元组的 DIM2
数组:
main = do
let arr = R.fromFunction (Z:.a:.b:.c) (\(Z:.i:.j:.k) -> i+j-k)
a =4 :: Int
b = 4 :: Int
c= 4 :: Int
new = R.traverse arr
(\(Z:.r:.c:._) -> Z:.r:.c) -- the extent
(\l idx -> (l (idx:.0)
,l (idx:.1)
,l (idx :. 2)))
print (R.computeS new :: R.Array R.U DIM2 (Int,Int,Int))
您能否指出您提到的使用这种格式的代码主体?修补 JP-Repa 以包含此类功能会很简单。
您可以构建您提到的未装箱矢量
您提到一个简单的解决方案是折叠未装箱的向量,但遗憾的是 JP-repa 不提供未装箱的数组。幸运的是,转换很简单:
toUnboxed :: Img a -> VU.Vector Word8
toUnboxed = R.toUnboxed . R.computeUnboxedS . R.delay . imgData
我们可以修补 Repa
这实际上只是一个问题,因为 Repa 没有我认为的正常遍历
功能。 Repa 的遍历更多的是一种数组构造,它恰好为另一个数组提供索引功能。我们希望以以下形式进行遍历:
newTraverse :: Array r sh e -> a -> (a -> sh -> e -> a) -> a
但粗略地说,这实际上只是一个畸形的折叠。因此,让我们重命名它并重新排序参数:
foldAllIdxS :: (sh -> a - > e -> a) -> a -> Array r sh e -> a
这与(预先存在的)foldAllS
操作形成鲜明对比:
foldAllS :: (a -> a -> a) -> a -> Array r sh a -> a
请注意我们的新折叠有两个关键特征。结果类型不需要与元素类型匹配,因此我们可以从直方图元组开始。其次,我们的折叠版本传递索引,它允许您选择要更新元组中的哪个直方图(如果有)。
您可以懒惰地使用最新的JuicyPixels-Repa
要获取您喜欢的 Repa 数组格式,或者获取未装箱的向量,您可以使用新上传的 JuicyPixels-Repa-0.6。
someImg <- readImage path :: IO (Either String (Img RGBA))
let img = either (error "Blah") id someImg
uvec = toUnboxed img
tupleArr = collapseColorChannel img
现在您可以按照您最初的期望折叠向量或直接使用元组数组。
我还尝试了一个丑陋的尝试来充实第一个非常天真的解决方案:
histograms :: Img a -> (Histogram, Histogram, Histogram, Histogram)
histograms (Img arr) =
let (Z:.nrRow:.nrCol:._) = R.extent arr
zero = R.fromFunction (Z:.256) (\_ -> 0 :: Word8)
incElem idx x = RU.unsafeTraverse x id (\l i -> l i + if i==(Z:.fromIntegral idx) then 1 else 0)
in Prelude.foldl (\(hR, hG, hB, hA) (row,col) ->
let r = R.unsafeIndex arr (Z:.row:.col:.0)
g = R.unsafeIndex arr (Z:.row:.col:.1)
b = R.unsafeIndex arr (Z:.row:.col:.2)
a = R.unsafeIndex arr (Z:.row:.col:.3)
in (incElem r hR, incElem g hG, incElem b hB, incElem a hA))
(zero,zero,zero,zero)
[ (row,col) | row <- [0..nrRow-1], col <- [0..nrCol-1] ]
我对这段代码的性能过于警惕(每个索引 3 次遍历......我一定很累),无法将其放入 JP-Repa,但如果您发现它运行良好,请告诉我。
关于haskell - 使用 repa 计算图像直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13298778/
我使用 为 .dat 文件中的一些数据创建了直方图 binwidth=... bin(x,width)=width*floor(x/width) plot 'file' using (bin($1,b
我需要能够在单个直方图上显示多条线,其中每条线都应该由一个参数表示。我有多个服务器,我想监控它们的 CPU 使用率。我的 Kibana 输入数据如下所示: 时间戳 |机器 |姓名 |值(value)
我在 Elasticsearch 中有一个索引,它包含一个简单对象数组(键值,请参见下面的示例)。 文档有时间戳。 我可以在 Kibana 中为每个键值创建单独的直方图(即一个用于 bytes_sen
所以我想出了如何将我的数据下钻到频率表 - Overall.Cond Freq 235 1 0 236 2 0 237
我的目标是使用 gnuplot 5.4 框创建直方图,并用特定的 RGB 值对每个框进行着色(出于测试目的,它是“绿色”,但在最终数据集中将是 #RRGGBB) 我的数据如下所示: 5.800507
我有 chr totgenes FST>0.4 %FST>0.4 exFST>0.4 %exFST>0.4 inFST>0.4 %inFST>0.4 chrtotlen 1 14
我用 matplotlib 创建了一个直方图使用 pyplot.hist()功能。我想在条形图中添加 bin 高度 ( sqrt(binheight) ) 的毒物误差平方根。我怎样才能做到这一点? .
我有兴趣在 R 中创建一个包含两个(或更多)人口的直方图,这意味着 - 我不希望两个直方图共享同一个图形,而是一个包含两种或更多颜色的条形图。 找到下面的图片 - 这就是我想要完成的。 有什么想法吗?
所以,我需要按日期制作数据直方图,但我有 xticlabel 重叠的问题,所以,我试图找到一个解决方案,如何跳过 xtics 以避免重叠。考虑到日期不是整数抽动,我试图以这种方式解决它: .dat 文
给定每小时都有数据点的(电力)市场数据的时间序列,我想显示一个包含每小时数据的所有时间/时间范围平均值的条形图,以便分析师可以轻松地将实际价格与所有时间平均值进行比较(一天中哪个小时最贵/最便宜)。
+----+----+--------+ | Id | M1 | trx | +----+----+--------+ | 1 | M1 | 11.35 | | 2 | M1 | 3.4
所以,我需要按日期制作数据直方图,但我有 xticlabel 重叠的问题,所以,我试图找到一个解决方案,如何跳过 xtics 以避免重叠。考虑到日期不是整数抽动,我试图以这种方式解决它: .dat 文
我有以下示例数据文件,我想在 gnuplot 中将其绘制为直方图 1 1 2 2 4 3 我正在使用以下命令绘制数据:用方框绘制“sample.data”,生成以下图表: ##
我是 Java 编码新手,我正在尝试使用提供给我的以下方法创建直方图。这些注释是对每个方法的说明,稍后我们将使用它们来创建主方法并打印直方图。我已经达到了方法 3,并且能够很好地编译所有内容,但我不确
我有一个由服务器上的程序生成的连续生成的数据(文本文件)。我想将数据绘制为实时图表,就像 powergrid做。这是我的方法: 由于数据是在服务器上以文本文件的形式连续生成的,因此我编写了一个 PHP
我正在尝试通过一个函数使用 D3 创建一个简单的直方图。图表的 y 值作为数组传递给函数,然后函数创建 svg 和条形图。我得到了正确的轴,但条被切断了。 似乎我的矩形 x 值太大而无法放入 svg
有没有办法用 linq 做一个分段直方图?我见过几个示例,您可以在其中计算特定对象的出现次数。是否可以创建一个基于 linq 的直方图来计算两个值之间的一系列对象的出现次数? 我不知道您将如何按一系列
我正在参加初级 Java 类(class),任务是创建一个具有以下输出的直方图程序:(100 和 10 是用户输入)。 有多少个数字? 100 间隔多少? 10 Histogram ---------
如何使用 corePlot 实现直方图。实际上,我正在尝试使用条形图。 在条形图中是否有任何选项可以对我的值进行分组。例如:所以我只能打印 3 条。这样值应该像这样分组: X 0...5: B
我有一个简单的数据集,其中脚本需要时间来完成各个步骤。时间是不可预测的,但主要分组在特定的时间范围内,但我想以十分之一秒的分组来绘制图表。 (我知道这很奇怪,这是一些报告可视化内容的要求)。我可以将我
我是一名优秀的程序员,十分优秀!