旋转图像.pbm Haskell

-1 haskell rotation matrix ppm

我需要有关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)]]
Run Code Online (Sandbox Code Playgroud)

更好看我有一个2x2矩阵:

m = [[(RGB 1 2 3),(RGB 4 5 6)],
     [(RGB 7 8 9),(RGB 1 5 9)]]
Run Code Online (Sandbox Code Playgroud)

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

m = [[(RGB 7 8 9),(RGB 1 2 3)]
     [(RGB 1 5 9),(RGB 4 5 6)]]
Run Code Online (Sandbox Code Playgroud)

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

data RGBdata= RGB Int Int Int
data PBMfile= PBM Int Int [[RGBdata]]
Run Code Online (Sandbox Code Playgroud)

我的功能收到:

spin :: PBMfile -> PBMfile
spin (PBM x y l) = (PBM x y ((transpose . reverse) l))
Run Code Online (Sandbox Code Playgroud)

其中'x'和'y'分别是colums和rows的数量(也许可以帮助完成这个功能).

我尝试用你的anwer向左旋转90°,图像结果是错误的.

我试试

spin :: PBMfile -> PBMfile
spin (PBM x y l) = (PBM x y ((reverse . transpose) l))
Run Code Online (Sandbox Code Playgroud)

spin :: PBMfile -> PBMfile
spin (PBM x y l) = (PBM x y ((transpose . reverse) l))
Run Code Online (Sandbox Code Playgroud)

spin :: PBMfile -> PBMfile
spin (PBM x y l) = (PBM x y (((map reverse) . transpose) l))
Run Code Online (Sandbox Code Playgroud)

旋转图像但不起作用.

结果是这样的

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

Joe*_*ams 7

TL; DR: transpose . reverse

如果您计划使用列表来存储大图像,请记住它可能效率低,因为每个像素有五个盒装值(很多字节).使用未装箱的Vector或Array会更有效.只是给你一个抬头.

也就是说,让我们根据它们对图像的作用来查看列表操作.

> 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]
Run Code Online (Sandbox Code Playgroud)
  • 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]
Run Code Online (Sandbox Code Playgroud)

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

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