【问题标题】:Rotate Image .pbm Haskell旋转图像 .pbm Haskell
【发布时间】:2012-05-02 02:38:42
【问题描述】:

我需要有关 haskell 中的旋转或自旋矩阵的帮助

我有一个列表列表,数据类型为 RGB:

data RGBdata= RGB Int Int Int

m = [[(RGB 0 255 255),(RGB 255 0 0)],[(RGB 255 255 255),(RGB 255 0 0)]]

为了看得更清楚,我有一个 2x2 矩阵:

m = [[(RGB 1 2 3),(RGB 4 5 6)],
     [(RGB 7 8 9),(RGB 1 5 9)]]

我需要 90° 旋转,我的意思是:

m = [[(RGB 7 8 9),(RGB 1 2 3)]
     [(RGB 1 5 9),(RGB 4 5 6)]]

扩展我的解释,我有 2 种数据类型:

data RGBdata= RGB Int Int Int
data PBMfile= PBM Int Int [[RGBdata]]

我的函数接收:

spin :: PBMfile -> PBMfile
spin (PBM x y l) = (PBM x y ((transpose . reverse) l))

其中 'x' 和 'y' 分别是列数和行数(也许可以帮助完成该功能)。

我尝试向左旋转90°,结果图像错误。

我试试

spin :: PBMfile -> PBMfile
spin (PBM x y l) = (PBM x y ((reverse . transpose) l))

spin :: PBMfile -> PBMfile
spin (PBM x y l) = (PBM x y ((transpose . reverse) l))

spin :: PBMfile -> PBMfile
spin (PBM x y l) = (PBM x y (((map reverse) . transpose) l))

旋转图像但不起作用。

结果是这样的

http://imageshack.us/photo/my-images/52/catmc.jpg/

【问题讨论】:

标签: haskell matrix rotation ppm


【解决方案1】:

TL;DR:@987654321@ . @987654322@

如果您打算使用列表来存储大图像,请记住它可能效率低下,因为每个像素都有五个装箱值(很多字节)。改用未装箱的向量或数组会更有效。只是给你一个提示。

也就是说,让我们看看列表操作对图像的作用。

> let demo f = mapM_ print $ f m
> demo id
[RGB 1 2 3,RGB 4 5 6]
[RGB 7 8 9,RGB 1 5 9]
> demo reverse
[RGB 7 8 9,RGB 1 5 9]
[RGB 1 2 3,RGB 4 5 6]
> demo (map reverse)
[RGB 4 5 6,RGB 1 2 3]
[RGB 1 5 9,RGB 7 8 9]
> demo (transpose)
[RGB 1 2 3,RGB 7 8 9]
[RGB 4 5 6,RGB 1 5 9]
  • reverse 垂直翻转图像(通过反转行)

  • map reverse 水平翻转图像(通过反转每行中的像素)

  • transpose 沿\ 对角线翻转图像。

现在,找一张纸,找出如何根据这些操作执行所需的旋转(如果您的纸是矩形的,建模transpose 会很棘手)。请记住,每当您看到纸张的背面时,图像都会出现镜像。由于这些操作中的每一个都将纸张翻转,因此您需要偶数个它们来执行旋转。

您可以使用reversemap reverse 进行的唯一旋转是将纸张倒置。这意味着您需要 transpose 将图像旋转 90°。

transpose(对角翻转)后跟reverse(垂直翻转)将图像向左旋转 90°

> demo (reverse . transpose)
[RGB 4 5 6,RGB 1 5 9]
[RGB 1 2 3,RGB 7 8 9]

另一方面,reverse(垂直翻转)后跟 transpose(对角翻转)将图像向右旋转 90°(您想要的):

> demo (transpose . reverse)
[RGB 7 8 9,RGB 1 2 3]
[RGB 1 5 9,RGB 4 5 6]

【讨论】:

  • 你好朋友,我尝试旋转 (PBM x y l) = (PBM x y ((transpose . reverse) l)) 并不起作用..请帮助我
  • @user495943:假设xy 是图像的宽度和高度,您需要确保也交换它们。
  • 也许使用 'x' 和 'y' 可以旋转,但是 "reverse,transpose" 的组合还不起作用
【解决方案2】:

如果我理解正确的话,看起来你想要map reverse . transpose,其中transposeData.List 中:

> let x = [[1,2,3], [4,5,6], [7,8,9]]
> map reverse . transpose $ x
[[7,4,1],[8,5,2],[9,6,3]]

请注意,如果您的输入列表足够大,这可能会比必要的慢,但如果您的列表是 1000 x 1000 或者您在紧密的内部循环中执行此操作,这可能只会发挥作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多