F# 你如何总结和平均一个序列?

F# 你如何总结和平均一个序列?,f#,F#,假设我有一个坐标(x,y),它的邻域在序列(-1,1)(0,1)(1,1)(-1,0)(0,0)(1,0)(-1,-1)(0,-1) 我试图分别向序列中的每个元素添加x和y 然后得到序列中每个元素的颜色p=GetPixel(x+i,y+j),求和并平均出(x,y)的R,G,B 所以我们有9个红色,9个绿色,9个蓝色到大街(红色),大街(蓝色),大街(绿色) 像这样的 let f x y = let n = [1 .. -1 .. -1] |> Seq.collect (fun j

假设我有一个坐标
(x,y)
,它的邻域在序列
(-1,1)(0,1)(1,1)(-1,0)(0,0)(1,0)(-1,-1)(0,-1)

  • 我试图分别向序列中的每个元素添加x和y
  • 然后得到序列中每个元素的颜色p=GetPixel(x+i,y+j),求和并平均出(x,y)的R,G,B
  • 所以我们有9个红色,9个绿色,9个蓝色到大街(红色),大街(蓝色),大街(绿色)
  • 像这样的

    let f x y = 
        let n = [1 .. -1 .. -1] |> Seq.collect (fun j -> [-1 .. 1] |> Seq.map(fun i -> (i, j)))
        n |> Seq.map (fun (i,j) -> x+i,y+j)
          |> Seq.map bitmapobject.GetPixel
          |> Seq.map (fun c -> float c.R, float c.G, float c.B)
          |> Seq.fold (fun (R,G,B) (r,g,b) -> (R+r, G+g, B+b)) (0.0, 0.0, 0.0)
          |> (fun (r,g,b) -> (r/9.0, g/9.0, b/9.0)) 
    

    @用户3487239-我已经更新了答案-有效吗?根据您的问题
    GetPixel
    我假设使用一对作为参数。如何运行avgNeighbours p?在你的代码里,没有坐标?因为我想传递(100200)之类的值,所以邻域(x,y)将计算其8个邻域的坐标?在你的代码里,没有坐标?因为我想传递(100200)这样的值,所以邻域(x,y)将计算其8个邻域的坐标。获取所有9个像素的RGB,然后计算平均值,将所有R、所有G和B(包括中间像素)的总和除以9。同样,getpixel是F#@user3487239的一部分-
    avgNeighbours
    是一个函数
    int*int->Color
    ,因此,
    p
    是您需要提供的坐标。@user3487239:如果您发布了GetPixel的声明,它肯定会有所帮助……您最初的问题是
    GetPixel
    。你必须根据像素的实际来源来充实它。(Screen?Array?Object表示JPEG?)bitmapobject.GetPixel(int x,int y)并返回Color ObjectOk,我相应地更新了答案。这可能不明显,但我的原始解决方案已经假设
    GetPixel
    返回了
    颜色。
    
    let offsets = seq { for i in -1 .. 1 do for j in -1 .. 1 do yield (i, j) }
    let neighbourhood (x, y) = Seq.map (fun (i, j) -> (x + i, y + j)) offsets
    let avgColours (cs : System.Drawing.Color seq) =
            let ((r, g, b), c) = cs |> Seq.fold (fun ((r, g, b), c) col -> ((r + int col.R, g + int col.G, b + int col.B), c + 1)) ((0, 0, 0), 0)
            System.Drawing.Color.FromArgb(r / c, g / c, b / c)
    
    let avgNeighbours p = p |> neighbourhood |> Seq.map (fun (x, y) -> GetPixel(x, y)) |> avgColours
    
    let f x y = 
        let n = [1 .. -1 .. -1] |> Seq.collect (fun j -> [-1 .. 1] |> Seq.map(fun i -> (i, j)))
        n |> Seq.map (fun (i,j) -> x+i,y+j)
          |> Seq.map bitmapobject.GetPixel
          |> Seq.map (fun c -> float c.R, float c.G, float c.B)
          |> Seq.fold (fun (R,G,B) (r,g,b) -> (R+r, G+g, B+b)) (0.0, 0.0, 0.0)
          |> (fun (r,g,b) -> (r/9.0, g/9.0, b/9.0))