codeplus 7 彩蛋题汇总:
https://blog.csdn.net/weixin_42378324/article/details/106449375
低维空间1题面:
原图:https://github.com/dq116/codeplus-7/blob/master/barcode.png
结合上一个的二维码的题有可以推断出这里隐藏着一个一维码(条形码)
思路:一张图片横看和竖看再加上左右颠倒,有四种可能,也就是旋转90°*n(1..4)。之后就试一下是几张图片组合,这题的答案是两张图片组合。
其中涉及到m的n次方种排列,如果有疑问,可转到这篇文章。
本题中是4的2次方种排列。
图片拼接可以转化成numpy的数组后再用hstack拼接或者直接用Image的paste函数。
识别条形码与识别二维码的方法一样都是调用zxing,有关注意事项,可参照这篇二维码重构的文章
扫描二维码关注公众号,回复:
12421705 查看本文章
代码:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import zxing
def multiply(a,b):
r=[]
for i in a:
for j in b:
if isinstance(i,list):
temp=i[:]
temp.append(j)
r.append(temp)
else:
r.append([i,j])
return r
def decode_zxing(filename):
zx = zxing.BarCodeReader() # 调用条码读取包
zxdata = zx.decode(filename) # 图片解码
if zxdata and zxdata.parsed:
print(zxdata.parsed)
return True
return False
if __name__ == '__main__':
img = Image.open(r'path\barcode.png')
n=2
imgs=[]
for i in range(4):
imgs.append(np.array(img.rotate(i*90)))
a = [0,1, 2, 3]
b=a
while n>1:
a=multiply(a,b)
n-=1
for i in a:
img_temp = np.hstack((imgs[i[0]],imgs[i[1]]))
img3 = Image.fromarray(img_temp)
save_path=r'path\barcode2.png'
img3.save(save_path)
if decode_zxing(save_path):
break
用paste拼接图片并局部拉伸:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
if __name__ == '__main__':
img = Image.open(r'path\barcode.png')
img2=img.rotate(90)
size1, size2 = img.size, img2.size
joint = Image.new('RGBA', (size1[0]+size2[0], size1[1] ))
loc1, loc2 = (0, 0), (size1[0] ,0)
joint.paste(img, loc1)
joint.paste(img2, loc2)
# joint.save(r'path\barcode2.png')
img3=np.array(joint)
img4=img3[450:470,:,:]
for i in range(3):
img4=np.vstack((img4,img4))
plt.imshow(img4)
plt.show()
拼接完后:
这时用支付宝直接就可以扫出来了(微信扫不出来)
如果想更美观些可以局部拉伸一下: