我正在构建算法,以从相同大小的瓦片数量自动解决/重建QR码。
我的方法:
给出的例子是14px x 14px (更新:可能是13px×13px)
VALID是:不匹配且不是任何3个角落瓷砖(大黑方块)
4.1。渲染已编译的qr块和1个随机有效磁贴的所有可能组合,直到找到匹配为止
4.2如果找到匹配(可以通过已编译/组合的QR码块的一侧放置图块),则记录匹配
4.3匹配条件:
没有黑色区域的宽度和高度符合这个等式:
AREA_HEIGHT % BLOCK_SIZE == 0 && AREA_WIDTH % BLOCK_SIZE == 0
现在出现了一些实施问题:
我认为ImageMagic可以解决它。 目标是获取原始二维码。
更新
正如我所看到的那样,解决方案会缩小以进行ImageMagick扫描并查找是否可以将两个图块放在一起而不会破坏QR码的规则。算法应该尝试并排放置2个图块并扫描边框区域。诀窍是测量连接瓷砖的黑线/块的宽度和高度。怎么做?
UPDATE2
在某些情况下,如果使用2列宽度为1px的瓷砖匹配,则进行比较是不够的。例如,两种算法都将这2个图块连接到:
VALID
和
INVALID
正如您在 INVALID 中看到的那样,第二个瓷砖的一部分(右边的一个)被红色箭头取消了,但由于通过1px进行比较 - 算法不关心abuot这个案例。 Hance无效QR。
UPDATE3
存档包含:
无效的join.png
有效的join.png
src1.png
SRC2-invalid.png
SRC2-valid.png
invalid.png
如果您的算法将加入src1.png
和src2-invalid.png
,则会失败。这是关于连接的瓷砖最终会产生有效的QR。我希望你明白我的观点。
UPDATE4
我在测试并获得正确的解决方案后会接受答案。可能需要一些时间......
更新5:测试
Mark的解决方案似乎都是正确的。
答案 0 :(得分:2)
我试过这个如下。
浏览所有PNG并提取其北,东,南和西边缘。如果任何PNG有两个白边,告诉用户它是一个角落。如果任何PNG有一个白边,告诉用户它是一个边缘。
浏览所有边缘部分。将每个转换为PBM格式文件并剥离标题和新行,使其只是一个80位长的字符串,每个数字为零或一个为黑色或白色。计算字符串的校验和,然后反转字符串以考虑正在翻转或旋转的图像,然后重新计算校验和。打印出校验和并输入sort
,以便匹配的边缘一起出现。
以下是代码:
#!/bin/bash
# Remove any edges generated in previous runs of this script
rm *_[NESW]*png 2> /dev/null
rm *_[NESW]*txt 2> /dev/null
DEBUG=1
# Process all PNGs
for f in *.png; do
echo "Processing $f ..."
# Get basename of image
base=$(basename -s .png "$f")
# Get width and height - not actually used at the moment
read w h <<< $(identify -format "%w %h" "$f")
[ $DEBUG -gt 0 ] && echo " width:$w"
[ $DEBUG -gt 0 ] && echo " height:$h"
# Extract North edge
convert "$f" +repage -crop x1+0+0 +repage "${base}_N.png"
[ $DEBUG -gt 0 ] && echo " North edge extracted"
# Extract East edge
convert "$f" +repage -gravity east -crop 1x+0+0 -rotate 90 +repage "${base}_E.png"
[ $DEBUG -gt 0 ] && echo " East edge extracted"
# Extract South edge
convert "$f" +repage -gravity south -crop x1+0+0 +repage "${base}_S.png"
[ $DEBUG -gt 0 ] && echo " South edge extracted"
# Extract West edge
convert "$f" +repage -gravity west -crop 1x+0+0 -rotate 90 +repage "${base}_W.png"
[ $DEBUG -gt 0 ] && echo " West edge extracted"
# Test if corner or edge piece
n=0
for edge in N E S W; do
name="${base}_${edge}.png"
min=$(identify -format "%[min]" "$name")
if [ $min -gt 0 ]; then
((n++))
e=$name
fi
done
[ $n -eq 1 ] && echo " $e is edge-piece"
[ $n -eq 2 ] && echo " $name is corner-piece"
done
EDITED FROM HERE ---
# Now convert all edges to text, forwards and backwards to allow rotation
for f in *_[NESW].png; do
base=$(basename -s png "$f")
# Convert to PBM format, remove 2 header lines and make into one line string
str=$(convert "$f" -compress none pbm: | sed "1,2d" | tr -d "\n ")
echo "$str:$f"
str=$(rev <<< $str)
echo "$str:$f (flipped)"
done | sort
部分输出(以节省空间)
Processing 4555-18116-29.png ...
width:80
height:80
North edge extracted
East edge extracted
South edge extracted
West edge extracted
4555-18116-29_S.png is edge-piece
Processing 5004-10810-17642.png ...
width:80
height:80
North edge extracted
East edge extracted
South edge extracted
West edge extracted
5004-10810-17642_W.png is corner-piece
Processing 5167-27533-24066.png ...
width:80
height:80
North edge extracted
East edge extracted
South edge extracted
West edge extracted
Processing 5774-30645-16062.png ...
width:80
height:80
North edge extracted
East edge extracted
South edge extracted
West edge extracted
0a7bb6f610c0f1a6da4794ea7ae00f00:10297-13918-3702_W.png (flipped)
0a7bb6f610c0f1a6da4794ea7ae00f00:11976-7751-26756_E.png (flipped) <-- this image is identical to the one above as the md5 checksum on the left is the same
0ce419e072c7ea5d14e3525d4afe150e:11976-7751-26756_W.png (flipped)
0ce419e072c7ea5d14e3525d4afe150e:13858-18007-13070_E.png (flipped) <-- this image is identical to the one above as the md5 checksum on the left is the same
0ce419e072c7ea5d14e3525d4afe150e:20056-20936-29071_S.png
0ce419e072c7ea5d14e3525d4afe150e:24658-20374-23042_E.png (flipped)
0ce419e072c7ea5d14e3525d4afe150e:24658-20374-23042_S.png
0ce419e072c7ea5d14e3525d4afe150e:27206-10104-18226_N.png
0ce419e072c7ea5d14e3525d4afe150e:30261-16558-25650_N.png
备注强>
请注意,这假设您没有在各个&#34;字段之间完全平铺图像&#34;由@YvesDaoust确定的QR码。
此外,代码的某些部分是冗余的,因为我在编写代码的同时开发算法 - 我认为-rotates
和+repages
是不必要的,事情可以更优化但是这个问题没有明确的速度需求。北,东,南和西边缘也可以在单个IM命令中提取。我获得的宽度和高度未使用,因此可以从代码中删除。
此外,md5校验和不是必需的,sort
将0001110001010110
放在另一个字符串旁边,无需校正它们。
根据请求,我正在上传完整的解决方案。我删除了md5校验和的东西,因为它是不必要的。您需要向右滚动才能看到下面的文件名:
00000000000000000000000000000000000000000000000000000000000000000000000000000000:10297-13918-3702_N.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:10297-13918-3702_N.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:11976-7751-26756_N.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:11976-7751-26756_N.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:13858-18007-13070_N.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:13858-18007-13070_N.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:16369-21469-8252_E.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:16369-21469-8252_E.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:18056-16294-30425_S.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:18056-16294-30425_S.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:20021-11440-20836_S.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:20021-11440-20836_S.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:20056-20936-29071_W.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:20056-20936-29071_W.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:21875-14159-1067_E.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:21875-14159-1067_E.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:22806-3380-17484_W.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:22806-3380-17484_W.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:24426-18830-5627_E.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:24426-18830-5627_E.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:24658-20374-23042_N.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:24658-20374-23042_N.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:24658-20374-23042_W.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:24658-20374-23042_W.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:27206-10104-18226_S.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:27206-10104-18226_S.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:27206-10104-18226_W.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:27206-10104-18226_W.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:30261-16558-25650_W.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:30261-16558-25650_W.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:31250-3578-9750_E.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:31250-3578-9750_E.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:31250-3578-9750_N.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:31250-3578-9750_N.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:4555-18116-29_S.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:4555-18116-29_S.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:5004-10810-17642_E.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:5004-10810-17642_E.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000000000000000000:5004-10810-17642_S.png
00000000000000000000000000000000000000000000000000000000000000000000000000000000:5004-10810-17642_S.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000111111111111100:21875-14159-1067_S.png (flipped)
00000000000000000000000000000000000000000000000000000000000000000111111111111100:5004-10810-17642_N.png (flipped)
00000000000000000000000000000000000000000000000000000000000001111111111111111111:28824-13023-24184_W.png (flipped)
00000000000000000000000000000000000000000000000000000000000001111111111111111111:5774-30645-16062_E.png (flipped)
00000000000000000000000000000000000000000000000000000000000011111111111111111111:13789-10513-4721_E.png
00000000000000000000000000000000000000000000000000000000000011111111111111111111:32078-14314-1511_W.png
00000000000000000000000000000000000000000000000000000001111111111111000000000000:11976-7751-26756_W.png
00000000000000000000000000000000000000000000000000000001111111111111000000000000:13858-18007-13070_E.png
00000000000000000000000000000000000000000000000000000001111111111111000000000000:20056-20936-29071_S.png (flipped)
00000000000000000000000000000000000000000000000000000001111111111111000000000000:24658-20374-23042_E.png
00000000000000000000000000000000000000000000000000000001111111111111000000000000:24658-20374-23042_S.png (flipped)
00000000000000000000000000000000000000000000000000000001111111111111000000000000:27206-10104-18226_N.png (flipped)
00000000000000000000000000000000000000000000000000000001111111111111000000000000:30261-16558-25650_N.png (flipped)
00000000000000000000000000000000000000000000000000000001111111111111000000000000:31250-3578-9750_W.png
00000000000000000000000000000000000000000000000000000011111111111110000000000000:16369-21469-8252_N.png
00000000000000000000000000000000000000000000000000000011111111111110000000000000:18056-16294-30425_W.png (flipped)
00000000000000000000000000000000000000000000000000000011111111111110000000000000:27206-10104-18226_E.png (flipped)
00000000000000000000000000000000000000000000000000000011111111111110000000000000:31250-3578-9750_S.png
00000000000000000000000000000000000000000000001111111111111111111111111111111111:10297-13918-3702_S.png
00000000000000000000000000000000000000000000001111111111111111111111111111111111:28824-13023-24184_N.png
00000000000000000000000000000000000001111111111111111111111111000000000000000000:20021-11440-20836_N.png (flipped)
00000000000000000000000000000000000001111111111111111111111111000000000000000000:26507-21853-11958_S.png (flipped)
00000000000000000000000000000000000001111111111111111111111111111111111111100000:15816-4564-31665_W.png
00000000000000000000000000000000000001111111111111111111111111111111111111100000:17636-24599-1877_E.png
00000000000000000000000000000000000001111111111111111111111111111111111111111111:21875-14159-1067_W.png
00000000000000000000000000000000000001111111111111111111111111111111111111111111:26507-21853-11958_E.png
00000000000000000000000000000000000011111111111111111111111110000000000000000000:13789-10513-4721_S.png
00000000000000000000000000000000000011111111111111111111111110000000000000000000:17636-24599-1877_N.png
00000000000000000000000000000001111111111111000000000000000000000000001111111111:22161-18187-20222_W.png
00000000000000000000000000000001111111111111000000000000000000000000001111111111:28824-13023-24184_E.png
00000000000000000000000000000011111111111111111111111111111111111111100000000000:15816-4564-31665_E.png (flipped)
00000000000000000000000000000011111111111111111111111111111111111111100000000000:26507-21853-11958_W.png (flipped)
00000000000000000000000000000111111111111111111111111111111111111111000000000000:20056-20936-29071_N.png (flipped)
00000000000000000000000000000111111111111111111111111111111111111111000000000000:22806-3380-17484_S.png (flipped)
00000000000000000000000000001111111111111111111111111111111111111110000000000000:18056-16294-30425_E.png (flipped)
00000000000000000000000000001111111111111111111111111111111111111110000000000000:4555-18116-29_W.png (flipped)
00000000000000000000000000111111111111100000000000001111111111111000000000000011:16369-21469-8252_S.png (flipped)
00000000000000000000000000111111111111100000000000001111111111111000000000000011:24426-18830-5627_N.png (flipped)
00000000000000000000000001111111111111111111111111111111111111110000000000000000:10297-13918-3702_W.png (flipped)
00000000000000000000000001111111111111111111111111111111111111110000000000000000:11976-7751-26756_E.png (flipped)
00000000000000000000000111111111111100000000000001111111111111111111111111111111:13789-10513-4721_N.png
00000000000000000000000111111111111100000000000001111111111111111111111111111111:5774-30645-16062_S.png
00000000000000000000111111111111100000000000000000000000000111111111111100000000:15816-4564-31665_N.png
00000000000000000000111111111111100000000000000000000000000111111111111100000000:32078-14314-1511_S.png
00000000000000000000111111111111100000000000001111111111111111111111111100000000:13789-10513-4721_W.png (flipped)
00000000000000000000111111111111100000000000001111111111111111111111111100000000:22806-3380-17484_E.png (flipped)
00000000000000000001111111111111111111111111000000000000000000000000000000000000:13789-10513-4721_S.png (flipped)
00000000000000000001111111111111111111111111000000000000000000000000000000000000:17636-24599-1877_N.png (flipped)
00000000000000000011111111111100000000000000000000000000111111111111111111111111:22161-18187-20222_S.png
00000000000000000011111111111100000000000000000000000000111111111111111111111111:5167-27533-24066_N.png
00000000000000000011111111111111111111111110000000000000000000000000000000000000:20021-11440-20836_N.png
00000000000000000011111111111111111111111110000000000000000000000000000000000000:26507-21853-11958_S.png
00000000000000001111111111111111111111111111111111111110000000000000000000000000:10297-13918-3702_W.png
00000000000000001111111111111111111111111111111111111110000000000000000000000000:11976-7751-26756_E.png
00000000000001111111111111000000000000000000000000000000000000000000000000000000:16369-21469-8252_N.png (flipped)
00000000000001111111111111000000000000000000000000000000000000000000000000000000:18056-16294-30425_W.png
00000000000001111111111111000000000000000000000000000000000000000000000000000000:27206-10104-18226_E.png
00000000000001111111111111000000000000000000000000000000000000000000000000000000:31250-3578-9750_S.png (flipped)
00000000000001111111111111000000000000011111111111110000000000000111111111111111:21875-14159-1067_N.png (flipped)
00000000000001111111111111000000000000011111111111110000000000000111111111111111:24426-18830-5627_S.png (flipped)
00000000000001111111111111000000000000011111111111111111111111111111111111111100:20021-11440-20836_W.png
00000000000001111111111111000000000000011111111111111111111111111111111111111100:4555-18116-29_E.png
00000000000001111111111111111111111111111111111111110000000000000000000000000000:18056-16294-30425_E.png
00000000000001111111111111111111111111111111111111110000000000000000000000000000:4555-18116-29_W.png
00000000000001111111111111111111111111111111111111111111111111111111111111111100:20021-11440-20836_E.png
00000000000001111111111111111111111111111111111111111111111111111111111111111100:5004-10810-17642_W.png
00000000000011111111111110000000000000000000000000000000000000000000000000000000:11976-7751-26756_W.png (flipped)
00000000000011111111111110000000000000000000000000000000000000000000000000000000:13858-18007-13070_E.png (flipped)
00000000000011111111111110000000000000000000000000000000000000000000000000000000:20056-20936-29071_S.png
00000000000011111111111110000000000000000000000000000000000000000000000000000000:24658-20374-23042_E.png (flipped)
00000000000011111111111110000000000000000000000000000000000000000000000000000000:24658-20374-23042_S.png
00000000000011111111111110000000000000000000000000000000000000000000000000000000:27206-10104-18226_N.png
00000000000011111111111110000000000000000000000000000000000000000000000000000000:30261-16558-25650_N.png
00000000000011111111111110000000000000000000000000000000000000000000000000000000:31250-3578-9750_W.png (flipped)
00000000000011111111111110000000000000111111111111111111111111111111111111111000:22806-3380-17484_N.png
00000000000011111111111110000000000000111111111111111111111111111111111111111000:30261-16558-25650_S.png
00000000000011111111111111111111111111000000000000011111111111111111111111111111:10297-13918-3702_E.png (flipped)
00000000000011111111111111111111111111000000000000011111111111111111111111111111:13858-18007-13070_W.png (flipped)
00000000000011111111111111111111111111111111111111100000000000000000000000000000:20056-20936-29071_N.png
00000000000011111111111111111111111111111111111111100000000000000000000000000000:22806-3380-17484_S.png
00000000000111111111111100000000000000000000000000000000000000111111111111100000:17636-24599-1877_W.png
00000000000111111111111100000000000000000000000000000000000000111111111111100000:20056-20936-29071_E.png
00000000000111111111111100000000000001111111111111000000000000111111111111111111:13858-18007-13070_S.png (flipped)
00000000000111111111111100000000000001111111111111000000000000111111111111111111:22161-18187-20222_N.png (flipped)
00000000000111111111111111111111111111111111111111000000000000000000000000000000:15816-4564-31665_E.png
00000000000111111111111111111111111111111111111111000000000000000000000000000000:26507-21853-11958_W.png
00000000001111111111111000000000000000000000000000000000000001111111111111000000:30261-16558-25650_E.png (flipped)
00000000001111111111111000000000000000000000000000000000000001111111111111000000:5774-30645-16062_W.png (flipped)
00000000001111111111111000000000000000000000000001111111111111111111111111000000:17636-24599-1877_S.png
00000000001111111111111000000000000000000000000001111111111111111111111111000000:18056-16294-30425_N.png
00000000001111111111111000000000000011111111111110000000000001111111111111000000:11976-7751-26756_S.png
00000000001111111111111000000000000011111111111110000000000001111111111111000000:5774-30645-16062_N.png
00000000001111111111111000000000000011111111111111111111111110000000000000111111:16369-21469-8252_W.png (flipped)
00000000001111111111111000000000000011111111111111111111111110000000000000111111:22161-18187-20222_E.png (flipped)
00000000111111111111100000000000000000000000000111111111111100000000000000000000:15816-4564-31665_N.png (flipped)
00000000111111111111100000000000000000000000000111111111111100000000000000000000:32078-14314-1511_S.png (flipped)
00000000111111111111100000000000000000000000000111111111111111111111111110000000:15816-4564-31665_S.png (flipped)
00000000111111111111100000000000000000000000000111111111111111111111111110000000:4555-18116-29_N.png (flipped)
00000000111111111111100000000000001111111111111000000000000011111111111110000000:32078-14314-1511_E.png
00000000111111111111100000000000001111111111111000000000000011111111111110000000:5167-27533-24066_W.png
00000000111111111111111111111111110000000000000000000000000000000000000001111111:28824-13023-24184_S.png (flipped)
00000000111111111111111111111111110000000000000000000000000000000000000001111111:32078-14314-1511_N.png (flipped)
00000000111111111111111111111111110000000000000111111111111100000000000000000000:13789-10513-4721_W.png
00000000111111111111111111111111110000000000000111111111111100000000000000000000:22806-3380-17484_E.png
00000001111111111111000000000000011111111111110000000000000111111111111100000000:32078-14314-1511_E.png (flipped)
00000001111111111111000000000000011111111111110000000000000111111111111100000000:5167-27533-24066_W.png (flipped)
00000001111111111111111111111111100000000000000000000000000111111111111100000000:15816-4564-31665_S.png
00000001111111111111111111111111100000000000000000000000000111111111111100000000:4555-18116-29_N.png
00000011111111111110000000000000000000000000000000000000011111111111110000000000:30261-16558-25650_E.png
00000011111111111110000000000000000000000000000000000000011111111111110000000000:5774-30645-16062_W.png
00000011111111111110000000000001111111111111000000000000011111111111110000000000:11976-7751-26756_S.png (flipped)
00000011111111111110000000000001111111111111000000000000011111111111110000000000:5774-30645-16062_N.png (flipped)
00000011111111111111111111111110000000000000000000000000011111111111110000000000:17636-24599-1877_S.png (flipped)
00000011111111111111111111111110000000000000000000000000011111111111110000000000:18056-16294-30425_N.png (flipped)
00000111111111111100000000000000000000000000000000000000111111111111100000000000:17636-24599-1877_W.png (flipped)
00000111111111111100000000000000000000000000000000000000111111111111100000000000:20056-20936-29071_E.png (flipped)
00000111111111111111111111111100000000000001111111111111111111111111111111111111:26507-21853-11958_N.png
00000111111111111111111111111100000000000001111111111111111111111111111111111111:5167-27533-24066_S.png
00000111111111111111111111111111111111111110000000000000000000000000000000000000:15816-4564-31665_W.png (flipped)
00000111111111111111111111111111111111111110000000000000000000000000000000000000:17636-24599-1877_E.png (flipped)
00011111111111111111111111111111111111111100000000000001111111111111000000000000:22806-3380-17484_N.png (flipped)
00011111111111111111111111111111111111111100000000000001111111111111000000000000:30261-16558-25650_S.png (flipped)
00111111111111100000000000000000000000000000000000000000000000000000000000000000:21875-14159-1067_S.png
00111111111111100000000000000000000000000000000000000000000000000000000000000000:5004-10810-17642_N.png
00111111111111111111111111111111111111111000000000000011111111111110000000000000:20021-11440-20836_W.png (flipped)
00111111111111111111111111111111111111111000000000000011111111111110000000000000:4555-18116-29_E.png (flipped)
00111111111111111111111111111111111111111111111111111111111111111110000000000000:20021-11440-20836_E.png (flipped)
00111111111111111111111111111111111111111111111111111111111111111110000000000000:5004-10810-17642_W.png (flipped)
11000000000000011111111111110000000000000111111111111100000000000000000000000000:16369-21469-8252_S.png
11000000000000011111111111110000000000000111111111111100000000000000000000000000:24426-18830-5627_N.png
11111100000000000001111111111111111111111111000000000000011111111111110000000000:16369-21469-8252_W.png
11111100000000000001111111111111111111111111000000000000011111111111110000000000:22161-18187-20222_E.png
11111110000000000000000000000000000000000000001111111111111111111111111100000000:28824-13023-24184_S.png
11111110000000000000000000000000000000000000001111111111111111111111111100000000:32078-14314-1511_N.png
11111110000000000000000000000000011111111111111111111111111111111111111111111111:24426-18830-5627_W.png (flipped)
11111110000000000000000000000000011111111111111111111111111111111111111111111111:5167-27533-24066_E.png (flipped)
11111111110000000000000000000000000011111111111110000000000000000000000000000000:22161-18187-20222_W.png (flipped)
11111111110000000000000000000000000011111111111110000000000000000000000000000000:28824-13023-24184_E.png (flipped)
11111111111111100000000000001111111111111000000000000011111111111110000000000000:21875-14159-1067_N.png
11111111111111100000000000001111111111111000000000000011111111111110000000000000:24426-18830-5627_S.png
11111111111111111100000000000011111111111110000000000000111111111111100000000000:13858-18007-13070_S.png
11111111111111111100000000000011111111111110000000000000111111111111100000000000:22161-18187-20222_N.png
11111111111111111110000000000000000000000000000000000000000000000000000000000000:28824-13023-24184_W.png
11111111111111111110000000000000000000000000000000000000000000000000000000000000:5774-30645-16062_E.png
11111111111111111111000000000000000000000000000000000000000000000000000000000000:13789-10513-4721_E.png (flipped)
11111111111111111111000000000000000000000000000000000000000000000000000000000000:32078-14314-1511_W.png (flipped)
11111111111111111111111100000000000000000000000000111111111111000000000000000000:22161-18187-20222_S.png (flipped)
11111111111111111111111100000000000000000000000000111111111111000000000000000000:5167-27533-24066_N.png (flipped)
11111111111111111111111111111000000000000011111111111111111111111111000000000000:10297-13918-3702_E.png
11111111111111111111111111111000000000000011111111111111111111111111000000000000:13858-18007-13070_W.png
11111111111111111111111111111110000000000000111111111111100000000000000000000000:13789-10513-4721_N.png (flipped)
11111111111111111111111111111110000000000000111111111111100000000000000000000000:5774-30645-16062_S.png (flipped)
11111111111111111111111111111111110000000000000000000000000000000000000000000000:10297-13918-3702_S.png (flipped)
11111111111111111111111111111111110000000000000000000000000000000000000000000000:28824-13023-24184_N.png (flipped)
11111111111111111111111111111111111110000000000000111111111111111111111111100000:26507-21853-11958_N.png (flipped)
11111111111111111111111111111111111110000000000000111111111111111111111111100000:5167-27533-24066_S.png (flipped)
11111111111111111111111111111111111111111110000000000000000000000000000000000000:21875-14159-1067_W.png (flipped)
11111111111111111111111111111111111111111110000000000000000000000000000000000000:26507-21853-11958_E.png (flipped)
11111111111111111111111111111111111111111111111000000000000000000000000001111111:24426-18830-5627_W.png
11111111111111111111111111111111111111111111111000000000000000000000000001111111:5167-27533-24066_E.png
答案 1 :(得分:1)
如果使用单个图块PNG中的所有可用信息,这个很容易:
QR读者说:http://www.oracle.com/javaone/index.html
我花了不到3分钟的时间来提出解决方案 - 主要是因为我必须用一只手同时输入相应的命令同时在手机上....
你是如何制作瓷砖的?
现在@RCola终于回答了我的问题(&#34;你是如何制作瓷砖的?&#34; ),我将揭示我是如何快速地提出来的正确的二维码图像。
我没有像他要求的那样使用算法。我使用了一个&#34; side-channel&#34;攻击,绕过任何需要考虑这样的算法。
这个旁道使用了&#34;信息泄漏&#34;它包含在@ RCola的ZIP文件中提供的图块图像中。运行简单的identify
命令时,此信息会泄露。在这里,我运行它不是一个简单的&#39;命令,但是 - 使泄露的信息更加明显 - 作为强制特定输出格式的命令:
identify -format "%f : %g\n" {1,2,3,4,5}*.png
10297-13918-3702.png : 400x400+160+0
11976-7751-26756.png : 400x400+80+0
13789-10513-4721.png : 400x400+80+160
13858-18007-13070.png : 400x400+240+0
15816-4564-31665.png : 400x400+160+240
16369-21469-8252.png : 400x400+320+80
17636-24599-1877.png : 400x400+80+240
18056-16294-30425.png : 400x400+80+320
20021-11440-20836.png : 400x400+240+320
20056-20936-29071.png : 400x400+0+240
21875-14159-1067.png : 400x400+320+240
22161-18187-20222.png : 400x400+240+80
22806-3380-17484.png : 400x400+0+160
24426-18830-5627.png : 400x400+320+160
24658-20374-23042.png : 400x400+0+0
26507-21853-11958.png : 400x400+240+240
27206-10104-18226.png : 400x400+0+320
28824-13023-24184.png : 400x400+160+80
30261-16558-25650.png : 400x400+0+80
31250-3578-9750.png : 400x400+320+0
32078-14314-1511.png : 400x400+160+160
4555-18116-29.png : 400x400+160+320
5004-10810-17642.png : 400x400+320+320
5167-27533-24066.png : 400x400+240+160
5774-30645-16062.png : 400x400+80+80
(相同的信息将包含在identify {1,2,3,4,5}*.png
的输出中 - 它不会如此明显地跳出来。)
这表明了什么? %g
percent-escape打印有关与PNG图块关联的画布的 geometry 信息:
400x400
是此图块画布的整体尺寸。很明显,这是原始PNG的大小,代表完整的QR码。+X+Y
是与整个画布上此图块关联的偏移。使用此信息可以非常轻松地直接了解哪个PNG图块必须放置在拼图的哪个位置:
+0+0
显然必须转到左上角+0+80
显然就在+80+0
显然恰好位于左上角+320+320
进入右下角 OP可以通过将+repage
参数添加到用于生成切片的IM命令中来避免侧通道信息泄漏(在这种情况下可以完成游戏)。
为了修复&#34;他提供的漏水瓷砖产生了更具挑战性的瓷砖我做了这个:
mkdir challenge
for i in {1,2,3,4,5}*.png; do
convert $i +repage challenge/$i
done
(回答关于未能及#34;在十六进制编辑器的帮助下查看&#34;信息的绝望评论......)
identify
显示的相同信息也可以在exiftool
的帮助下获得(尽管以较少的#34;可访问的&#34;形式):
exiftool 11976-7751-26756.png | grep -E '(Virtual Image|Width|Height|Offset)'
Image Width : 80
Image Height : 80
Image Offset : 80, 0 (pixels)
Virtual Image Width : 400
Virtual Image Height : 400
答案 2 :(得分:1)
这是一个更好的算法,我已编写脚本:
从每个图块中删除每个边缘的1像素行或列,并将其输出为ImageMagick的特殊*.text
格式,使用指示其各自的左/右或上/下边缘原点的名称
转换每个此类列/行,创建其md5sum
的{{1}}并按字母顺序对其进行排序。
确定哪些MD5总和相同。
从相同的MD5总和中确定适合各自边界的候选人。
代码段
*.txt
这样一个文本文件的外观如下:
for i in {1,2,3,4,5}*.png; do
convert ${i}[1x80+0+0] +repage left---edge-${i/.png/.text}
convert ${i}[1x80+79+0] +repage right--edge-${i/.png/.text}
convert ${i}[80x1+0+0] +repage top----edge-${i/.png/.text}
convert ${i}[80x1+0+79] +repage bottom-edge-${i/.png/.text}
done
如您所见,它是提取列的每个像素颜色的文本描述(其中像素坐标在每行文本的第一个字段中给出)。第一行表示使用了哪个颜色空间。
*按字母顺序排序MD5
按字母顺序对这些文本文件的MD5总和进行排序时,如果有相同的像素颜色行和列,应该立即明显:
cat right--edge-5167-27533-24066.text
# ImageMagick pixel enumeration: 1,80,255,gray
0,0: (0,0,0) #000000 gray(0)
0,1: (0,0,0) #000000 gray(0)
0,2: (0,0,0) #000000 gray(0)
0,3: (0,0,0) #000000 gray(0)
0,4: (0,0,0) #000000 gray(0)
0,5: (0,0,0) #000000 gray(0)
0,6: (0,0,0) #000000 gray(0)
0,7: (255,255,255) #FFFFFF gray(255)
0,8: (255,255,255) #FFFFFF gray(255)
0,9: (255,255,255) #FFFFFF gray(255)
0,10: (255,255,255) #FFFFFF gray(255)
0,11: (255,255,255) #FFFFFF gray(255)
0,12: (255,255,255) #FFFFFF gray(255)
0,13: (255,255,255) #FFFFFF gray(255)
0,14: (255,255,255) #FFFFFF gray(255)
0,15: (255,255,255) #FFFFFF gray(255)
0,16: (255,255,255) #FFFFFF gray(255)
0,17: (255,255,255) #FFFFFF gray(255)
0,18: (255,255,255) #FFFFFF gray(255)
0,19: (255,255,255) #FFFFFF gray(255)
0,20: (255,255,255) #FFFFFF gray(255)
0,21: (255,255,255) #FFFFFF gray(255)
0,22: (255,255,255) #FFFFFF gray(255)
0,23: (255,255,255) #FFFFFF gray(255)
0,24: (255,255,255) #FFFFFF gray(255)
0,25: (255,255,255) #FFFFFF gray(255)
0,26: (255,255,255) #FFFFFF gray(255)
0,27: (255,255,255) #FFFFFF gray(255)
0,28: (255,255,255) #FFFFFF gray(255)
0,29: (255,255,255) #FFFFFF gray(255)
0,30: (255,255,255) #FFFFFF gray(255)
0,31: (255,255,255) #FFFFFF gray(255)
0,32: (255,255,255) #FFFFFF gray(255)
0,33: (0,0,0) #000000 gray(0)
0,34: (0,0,0) #000000 gray(0)
0,35: (0,0,0) #000000 gray(0)
0,36: (0,0,0) #000000 gray(0)
0,37: (0,0,0) #000000 gray(0)
0,38: (0,0,0) #000000 gray(0)
0,39: (0,0,0) #000000 gray(0)
0,40: (0,0,0) #000000 gray(0)
0,41: (0,0,0) #000000 gray(0)
0,42: (0,0,0) #000000 gray(0)
0,43: (0,0,0) #000000 gray(0)
0,44: (0,0,0) #000000 gray(0)
0,45: (0,0,0) #000000 gray(0)
0,46: (0,0,0) #000000 gray(0)
0,47: (0,0,0) #000000 gray(0)
0,48: (0,0,0) #000000 gray(0)
0,49: (0,0,0) #000000 gray(0)
0,50: (0,0,0) #000000 gray(0)
0,51: (0,0,0) #000000 gray(0)
0,52: (0,0,0) #000000 gray(0)
0,53: (0,0,0) #000000 gray(0)
0,54: (0,0,0) #000000 gray(0)
0,55: (0,0,0) #000000 gray(0)
0,56: (0,0,0) #000000 gray(0)
0,57: (0,0,0) #000000 gray(0)
0,58: (0,0,0) #000000 gray(0)
0,59: (0,0,0) #000000 gray(0)
0,60: (0,0,0) #000000 gray(0)
0,61: (0,0,0) #000000 gray(0)
0,62: (0,0,0) #000000 gray(0)
0,63: (0,0,0) #000000 gray(0)
0,64: (0,0,0) #000000 gray(0)
0,65: (0,0,0) #000000 gray(0)
0,66: (0,0,0) #000000 gray(0)
0,67: (0,0,0) #000000 gray(0)
0,68: (0,0,0) #000000 gray(0)
0,69: (0,0,0) #000000 gray(0)
0,70: (0,0,0) #000000 gray(0)
0,71: (0,0,0) #000000 gray(0)
0,72: (0,0,0) #000000 gray(0)
0,73: (0,0,0) #000000 gray(0)
0,74: (0,0,0) #000000 gray(0)
0,75: (0,0,0) #000000 gray(0)
0,76: (0,0,0) #000000 gray(0)
0,77: (0,0,0) #000000 gray(0)
0,78: (0,0,0) #000000 gray(0)
0,79: (0,0,0) #000000 gray(0)
<强> 结果: 强>
(我在某些行的末尾手动添加了一些注释。)
md5sum *.text | sort
可以立即识别以下模式:
09c0670b59c03fb3d6f8116ee0fe35a2 bottom-edge-10297-13918-3702.text
09c0670b59c03fb3d6f8116ee0fe35a2 top----edge-28824-13023-24184.text
10be914aa8b6aaa8c0e35a4a93421f3a left---edge-20056-20936-29071.text #left edge of QR
10be914aa8b6aaa8c0e35a4a93421f3a left---edge-22806-3380-17484.text #left edge of QR
10be914aa8b6aaa8c0e35a4a93421f3a left---edge-24658-20374-23042.text #left edge of QR
10be914aa8b6aaa8c0e35a4a93421f3a left---edge-27206-10104-18226.text #left edge of QR
10be914aa8b6aaa8c0e35a4a93421f3a left---edge-30261-16558-25650.text #left edge of QR
10be914aa8b6aaa8c0e35a4a93421f3a right--edge-16369-21469-8252.text #right edge of QR
10be914aa8b6aaa8c0e35a4a93421f3a right--edge-21875-14159-1067.text #right edge of QR
10be914aa8b6aaa8c0e35a4a93421f3a right--edge-24426-18830-5627.text #right edge of QR
10be914aa8b6aaa8c0e35a4a93421f3a right--edge-31250-3578-9750.text #right edge of QR
10be914aa8b6aaa8c0e35a4a93421f3a right--edge-5004-10810-17642.text #right edge of QR
217c799ce772d99e11b7ba2a04f42bb7 bottom-edge-11976-7751-26756.text
217c799ce772d99e11b7ba2a04f42bb7 top----edge-5774-30645-16062.text
2c96cebc6cc175b54cae54f1a27771fa bottom-edge-24426-18830-5627.text
2c96cebc6cc175b54cae54f1a27771fa top----edge-21875-14159-1067.text
3088414b0fe1190bbd4ed9315d86a0ac left---edge-13789-10513-4721.text
3088414b0fe1190bbd4ed9315d86a0ac right--edge-22806-3380-17484.text
3755d45bb6ad21b70f545f39c5550eda left---edge-17636-24599-1877.text
3755d45bb6ad21b70f545f39c5550eda right--edge-20056-20936-29071.text
41fc32b4b70622b4aff7d9e81f81daad left---edge-13858-18007-13070.text
41fc32b4b70622b4aff7d9e81f81daad right--edge-10297-13918-3702.text
480bed740a716fa10593ba061c5b6df5 left---edge-5004-10810-17642.text
480bed740a716fa10593ba061c5b6df5 right--edge-20021-11440-20836.text
55cc4713ee13ebbeb5c2e212e430da94 bottom-edge-28824-13023-24184.text
55cc4713ee13ebbeb5c2e212e430da94 top----edge-32078-14314-1511.text
62fecd6971445d4176a842727767d3f7 left---edge-4555-18116-29.text
62fecd6971445d4176a842727767d3f7 right--edge-18056-16294-30425.text
69565761226f122f98267862108119a6 left---edge-21875-14159-1067.text
69565761226f122f98267862108119a6 right--edge-26507-21853-11958.text
72cec2b0a518c2cce7204188923d9f79 left---edge-26507-21853-11958.text
72cec2b0a518c2cce7204188923d9f79 right--edge-15816-4564-31665.text
7343348f1b10e47b33e0bde47b455c2b left---edge-16369-21469-8252.text
7343348f1b10e47b33e0bde47b455c2b right--edge-22161-18187-20222.text
7661c257d28e1916208ed2a70989e42d bottom-edge-13789-10513-4721.text
7661c257d28e1916208ed2a70989e42d top----edge-17636-24599-1877.text
7d2a0d7aae6dc017ffa7af7180b1c017 left---edge-5167-27533-24066.text
7d2a0d7aae6dc017ffa7af7180b1c017 right--edge-32078-14314-1511.text
85b744d1774cd4ebe50f0cc40d10b491 left---edge-18056-16294-30425.text
85b744d1774cd4ebe50f0cc40d10b491 right--edge-27206-10104-18226.text
88942ff37ce0e884d1995a6dd11708d6 left---edge-10297-13918-3702.text
88942ff37ce0e884d1995a6dd11708d6 right--edge-11976-7751-26756.text
9185daee4fdcea482c9fa805bba40346 bottom-edge-31250-3578-9750.text
9185daee4fdcea482c9fa805bba40346 top----edge-16369-21469-8252.text
9b8a7f18e4ebbc7249e5f26ac18190a8 left---edge-28824-13023-24184.text
9b8a7f18e4ebbc7249e5f26ac18190a8 right--edge-5774-30645-16062.text
9bd8f7a474229aefd988c4231f3b26f4 bottom-edge-21875-14159-1067.text
9bd8f7a474229aefd988c4231f3b26f4 top----edge-5004-10810-17642.text
a1778c1a468c122bf408a9c2bec9135c bottom-edge-13858-18007-13070.text
a1778c1a468c122bf408a9c2bec9135c top----edge-22161-18187-20222.text
a4f3eee0e523f1b343d292987da297b3 bottom-edge-20056-20936-29071.text
a4f3eee0e523f1b343d292987da297b3 bottom-edge-24658-20374-23042.text
a4f3eee0e523f1b343d292987da297b3 top----edge-27206-10104-18226.text
a4f3eee0e523f1b343d292987da297b3 top----edge-30261-16558-25650.text
af851da184ea6d6586c64aaefdc6875b bottom-edge-22806-3380-17484.text
af851da184ea6d6586c64aaefdc6875b top----edge-20056-20936-29071.text
b4047de9fb6458ebfde5b3a11b40241a left---edge-5774-30645-16062.text
b4047de9fb6458ebfde5b3a11b40241a right--edge-30261-16558-25650.text
b58fe9214967f6d2311e11cb0bf1acc4 left---edge-15816-4564-31665.text
b58fe9214967f6d2311e11cb0bf1acc4 right--edge-17636-24599-1877.text
bef4d7004da4f5de4ca5beeabc1222e8 bottom-edge-5774-30645-16062.text
bef4d7004da4f5de4ca5beeabc1222e8 top----edge-13789-10513-4721.text
c042d1cd3dfb339177e8da3c2907d58e bottom-edge-15816-4564-31665.text
c042d1cd3dfb339177e8da3c2907d58e top----edge-4555-18116-29.text
c5f38ebda77190495d77df1fb7002d1e bottom-edge-32078-14314-1511.text
c5f38ebda77190495d77df1fb7002d1e top----edge-15816-4564-31665.text
c61f738453fa3a86b52b2de5c0d43530 left---edge-20021-11440-20836.text
c61f738453fa3a86b52b2de5c0d43530 right--edge-4555-18116-29.text
c772762652d22cbf228e57f0dcf1a3b4 bottom-edge-22161-18187-20222.text
c772762652d22cbf228e57f0dcf1a3b4 top----edge-5167-27533-24066.text
cfaa399406e0be3d07297f23c684e7c3 left---edge-11976-7751-26756.text
cfaa399406e0be3d07297f23c684e7c3 left---edge-31250-3578-9750.text
cfaa399406e0be3d07297f23c684e7c3 right--edge-13858-18007-13070.text
cfaa399406e0be3d07297f23c684e7c3 right--edge-24658-20374-23042.text
d39c2a0c14c20b66b441d368c164171d bottom-edge-18056-16294-30425.text #bottom edge of QR
d39c2a0c14c20b66b441d368c164171d bottom-edge-20021-11440-20836.text #bottom edge of QR
d39c2a0c14c20b66b441d368c164171d bottom-edge-27206-10104-18226.text #bottom edge of QR
d39c2a0c14c20b66b441d368c164171d bottom-edge-4555-18116-29.text #bottom edge of QR
d39c2a0c14c20b66b441d368c164171d bottom-edge-5004-10810-17642.text #bottom edge of QR
d39c2a0c14c20b66b441d368c164171d top----edge-10297-13918-3702.text #top edge of QR
d39c2a0c14c20b66b441d368c164171d top----edge-11976-7751-26756.text #top edge of QR
d39c2a0c14c20b66b441d368c164171d top----edge-13858-18007-13070.text #top edge of QR
d39c2a0c14c20b66b441d368c164171d top----edge-24658-20374-23042.text #top edge of QR
d39c2a0c14c20b66b441d368c164171d top----edge-31250-3578-9750.text #top edge of QR
d71e7b561d2cc251c962a843daff53bb bottom-edge-5167-27533-24066.text
d71e7b561d2cc251c962a843daff53bb top----edge-26507-21853-11958.text
d7ffe4aaf744387e7fa9db32271247e0 bottom-edge-26507-21853-11958.text
d7ffe4aaf744387e7fa9db32271247e0 top----edge-20021-11440-20836.text
da2aa01201b3da20a970928bc2bdef36 bottom-edge-30261-16558-25650.text
da2aa01201b3da20a970928bc2bdef36 top----edge-22806-3380-17484.text
dd86f02cfc0e260463c75ae5b8709f33 bottom-edge-16369-21469-8252.text
dd86f02cfc0e260463c75ae5b8709f33 top----edge-24426-18830-5627.text
dfdaa88ebf33284ac0367f92060cd060 bottom-edge-17636-24599-1877.text
dfdaa88ebf33284ac0367f92060cd060 top----edge-18056-16294-30425.text
f8e2f384f2269e086dc00fb6ff0b3f41 left---edge-32078-14314-1511.text
f8e2f384f2269e086dc00fb6ff0b3f41 right--edge-13789-10513-4721.text
fa59372704f3b48912a33f3780e9dce7 left---edge-22161-18187-20222.text
fa59372704f3b48912a33f3780e9dce7 right--edge-28824-13023-24184.text
fff7e26c6f9852fcfa51e79d154dc58a left---edge-24426-18830-5627.text
fff7e26c6f9852fcfa51e79d154dc58a right--edge-5167-27533-24066.text
d39c2a0c14c20b66b441d368c164171d
在'1'的情况下和'2.'很容易看出这些是全白边缘,代表完整QR的左/右/上/下部分。
剩下的比赛,'3'和'4.'使每个单独的瓷砖以确定的方式容易地适合左或右“伙伴”。
直到现在我才看到马克的答案。但我看到他的方法与我的相似。
我不愿意添加完整的脚本来制作最终重新编写的QR码。
因此,如果马克的解决方案包括这一点,他应该得到正确答案的批准。
答案 3 :(得分:0)
我对你的解释一无所知,但对于匹配的瓷砖,它足以比较沿公共边缘的像素。这是因为分裂是在QR细胞上进行的,而不是在它们之间。
每次尝试所有未使用的块时,您可以逐行填充数组,直到找到匹配项。实际上,巧合会产生几场比赛,因此建议在找到比赛后继续搜索。这将导致递归实现。
角落及其邻居更容易手工放置。通过一点点仔细检查,您还可以找到具有时序模式的块。