我正在尝试在ASM中垂直翻转图像

时间:2015-03-08 03:21:12

标签: image-processing assembly arm

我尝试使用以下代码垂直翻转图像:

flipV:

ldr r0, =pic2 
ldr r7, =#0x06800000 ;vram

ldr r1, =#0x18000 ;point do last byte
ldr r6, =#0x18000 ;counter
mov r5,#0

loop:

ldr r4,[r0,r5]
str r4,[r7,r1]

add r5,r5,#1
sub r1, r1,#1

subs r6, r6,#1
bne loop
bx    lr

他取最后一个字节并换取第一个,最后一个 - 换掉第一个+ 1,依此类推。

我正在获取翻转图像,但是它被扭曲了。前

http://i.imgur.com/PKhxil2.png<<原版的 http://i.imgur.com/fCeOVdx.png<<翻转

有人可以帮我解决这个问题吗?我不知道为什么会这样。我刚开始学习图像处理。

2 个答案:

答案 0 :(得分:1)

您的代码一次加载并存储4个字节。假设一个像素确实是4个字节,请尝试:

flipV:

ldr r0, =pic2
ldr r7, =#0x06800000 ;vram

ldr r1, =#0x17ffc ;point to last pixel
ldr r6, =#0x18000 ;counter
mov r5, #0

loop:

ldr r4, [r0, r5]
str r4, [r7, r1]

add r5, r5, #4
sub r1, r1, #4

subs r6, r6, #4
bne loop
bx lr

此外,这不是垂直翻转,而是图像旋转180度。

答案 1 :(得分:0)

根据输出文件的外观,我假设您的图像每像素存储1个字节,RGB平面分开存储。

您正在一次加载和存储4个字节,当您反转图像中32位字的顺序时,您不会反转字内字节的顺序,这会导致失真,发生在4像素宽的频带中。

这意味着像素按此顺序开始:

ABCD EFGH IJKL MNOP

但最终按此顺序排列:

MNOP IJKL EFGH ABCD

但你想按顺序排列它们:

PONM LKJI HGFE DCBA

在存储之前尝试使用rev操作码来反转字节顺序:

ldr r4, [r0, r5]
rev r4, r4
str r4, [r7, r1]

根据斯科特的回答,你还需要每次增加/减少4次。