jpeg同心像素块的解扰旋转

Unscrambling rotation of jpeg concentric pixel blocks

作为 'Capture The Flag' 挑战的一部分,附加的 jpg 被打乱以模糊内容。图像 ("flagpoles.jpg") 为 1600 x 1600 像素。同心线似乎具有 10 像素宽的块大小。 (它类似于 Frank Stella 的画作)。看起来原始图像已被分成四个部分,围绕中心对称排列。我一直在尝试编写一个 python 脚本来处理像素并解读同心正方形。我的努力导致了两种无用的反复出现的情况,要么没有变化,要么增加了加扰。我认为这可能是因为我正在处理整个图像,尝试解读其中的一部分可能会更好。这是我的代码。目前它只处理一半的像素,因为我正在尝试将图片的各个部分相互匹配。我尝试将块发送到图像的另一侧以尝试匹配它们,但没有任何改进。任何帮助获得清晰图片的帮助将不胜感激。

from PIL import Image
import math

im = Image.open("flagpoles.jpg", "r")
pic = im.load() 

def rot(A, r, x1, y1): 
    myArray = []
    for i in range(r):
        myArray.append([])
        for j in range(r):
            myArray[i].append(pic[x1+i, y1+j])
    for i in range(r):
        for j in range(r):
            pic[x1+i,y1+j] = myArray[r-1-i][r-1-j]

xres = 800
yres = 800
blocksize = 10 
for i in range(blocksize, blocksize+1):
    for j in range(int(math.floor(float(xres)/float(blocksize+2+i)))):
        for k in range(int(math.floor(float(yres)/float(blocksize+2+i)))):
            rot(pic, blocksize+2+i, j*(blocksize+2+i), k*(blocksize+2+i))

im.save("hopeful.png")

print("Finished!")

图像似乎由宽度为 10 像素的同心方框组成,每个方框相对于前一个旋转 90°。每四次旋转后,像素再次朝向同一方向。

您可以通过复制图像并重复旋转 270° 并裁剪掉 10 像素的边框来轻松撤消此操作。将这些旋转后的图像粘贴回相应位置以检索原始图像。

from PIL import Image

step_size = 10
angle_step = 270
img = Image.open("flagpoles.jpg", "r")
img.load() 
w = img.width
assert img.height == w
img_tmp = img.copy()        # Copy of the image that we're going to rotate
offset = 0                  # Coordinate where the rotated images should be pasted
cropmax = w - step_size     # Maximum coordinate of cropping region

while cropmax > step_size:
    # Rotate the copy of the image
    img_tmp = img_tmp.rotate(angle_step)
    # Paste it into the original image
    img.paste(img_tmp, (offset,offset))
    # Crop a 10 px border away from the copy
    img_tmp = img_tmp.crop((step_size, step_size, cropmax, cropmax))
    # Update the crop position and width for the next iteration
    cropmax -= step_size * 2
    offset += step_size

img.save("fixed.jpg")