- 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/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!