Mathematica 1170 1270 1096 1059 650 528 570 551 525 498 ไบต์
รุ่นล่าสุดบันทึก 27 ไบต์โดยไม่ต้องการให้แผ่น "ตัดแต่ง" ก่อนที่จะแยกวิเคราะห์ เวอร์ชันสุดท้ายจะบันทึก 26 ไบต์โดยใช้เพียง 10 จาก 24 คะแนนตัวอย่างดั้งเดิมเท่านั้น
z=Partition;h@i_:=i~PixelValue~#/.{_,_,_,z_}:>⌈z⌉&/@z[{45,99,27,81,63,81,9,63,45,63,9,45,45,45,63,45,45,27,45,9},2];f@p_:=h/@SortBy[Select[p~ColorReplace~Yellow~ComponentMeasurements~{"Image","Centroid"},100<Last@ImageDimensions@#[[2,1]]<120&],#[[2,2,1]]&][[All,2,1]]/.Thread[IntegerDigits[#,2,10]&/@(z[IntegerDigits[Subscript["ekqeuiv5pa5rsebjlic4i5886qsmvy34z5vu4e7nlg9qqe3g0p8hcioom6qrrkzv4k7c9fdc3shsm1cij7jrluo", "36"]],4]/.{a__Integer}:> FromDigits[{a}])-> Characters@"BD54TARP89Q0723Z6EFGCSWMNVYXHUJKL1"]
122 bytes ที่บันทึกไว้ผ่านแนวคิดของ LegionMammal978 ในการบรรจุรายการหมายเลขฐาน 10 แบบยาวเป็นหมายเลขฐานเดียว 36 รายการ เขาตัดรหัสสุดท้ายอีก 20 ไบต์
การกระโดดจาก 528 ถึง 570 ไบต์เกิดจากรหัสเพิ่มเติมเพื่อให้แน่ใจว่าคำสั่งของตัวอักษรที่ส่งคืนตรงกับคำสั่งของตัวอักษรบนแผ่นป้ายทะเบียน เซนทรอยด์สำหรับแต่ละตัวอักษรมีพิกัด x ซึ่งแสดงตำแหน่งสัมพัทธ์ของตัวอักษรตาม x
รหัสที่ไม่ดี
coordinates=Flatten[Table[{x,y},{y,99,0,-18},{x,9,72,18}],1];
h[img_] :=ArrayReshape[PixelValue[img, #] /. {_, _, _, z_} :> ⌈z⌉ & /@ coordinates, {6, 4}];
plateCrop[img_]:=ColorReplace[ImageTrim[img,{{100,53},{830,160}}],Yellow];
codes={{{15,13,15,13,13,15},"B"},{{15,8,8,8,9,15},"C"},{{15,13,13,13,13,15},"D"},{{15,8,14,8,8,15},"E"},{{15,8,14,8,8,8},"F"},{{15,8,8,11,9,15},"G"},{{6,6,6,6,15,9},"A"},{{9,9,15,15,9,9},"H"},{{8,8,8,8,8,15},"L"},{{9,15,15,15,13,9},"M"},{{15,9,9,9,9,15},"0"},{{9,10,12,14,10,9},"K"},{{9,13,13,11,11,9},"N"},{{8,8,8,8,8,8},"1"},{{1,1,1,1,9,15},"J"},{{15,9,15,14,8,8},"P"},{{15,9,9,9,15,15},"Q"},{{15,9,15,14,10,11},"R"},{{15,8,12,3,1,15},"S"},{{9,15,6,6,6,6},"V"},{{15,6,6,6,6,6},"T"},{{9,15,15,15,15,15},"W"},{{9,9,9,9,9,15},"U"},{{9,14,6,6,14,9},"X"},{{9,14,6,6,6,6},"Y"},{{15,3,2,4,12,15},"Z"},{{15,9,9,9,9,15},"0"},{{8,8,8,8,8,8},"1"},{{15,1,3,6,12,15},"2"},{{15,1,3,1,9,15},"3"},{{2,6,6,15,2,2},"4"},{{7,12,14,1,1,15},"5"},{{15,8,14,9,9,15},"6"},{{15,1,2,2,6,4},"7"},{{15,9,15,9,9,15},"8"},{{15,9,15,1,9,15},"9"}};
decryptRules=Rule@@@codes;
isolateLetters[img_]:=SortBy[Select[ComponentMeasurements[plateCrop[img],{"Image","Centroid"}],ImageDimensions[#[[2,1]]][[2]]>100&],#[[2,2,1]]&][[All,2,1]]
f[plate_]:=FromDigits[#,2]&/@#&/@h/@isolateLetters[plate]/.decryptRules
ภาพรวม
แนวคิดพื้นฐานคือการตรวจสอบว่าการสุ่มตัวอย่างพิกเซลของระบบจากภาพที่ป้อนเข้านั้นตรงกับพิกเซลจากตำแหน่งเดียวกันบนภาพที่อยู่ใน bonafide หรือไม่ รหัสส่วนใหญ่ประกอบด้วยลายเซ็นบิตสำหรับตัวละครแต่ละตัว
แผนภาพแสดงพิกเซลที่สุ่มตัวอย่างจากตัวอักษร "J", "P", "Q" และ "R"
ค่าพิกเซลสามารถแสดงเป็นเมทริกซ์ได้ ความมืดและตัวหนา1
สอดคล้องกับเซลล์สีดำ 0
สอดคล้อง 's ไปยังเซลล์สีขาว
นี่คือกฎการเปลี่ยนการถอดรหัสสำหรับ JPQ R.
{1, 1, 1, 1, 9, 15} -> "J",
{15, 9, 15, 14, 8, 8} -> "P",
{15, 9, 9, 9, 15, 15 } -> "Q",
{15, 9, 15, 14, 10, 11} -> "R"
มันเป็นไปได้ที่จะเข้าใจว่าทำไมกฎของ "0" คือ:
{15, 9, 9, 9, 9, 15} -> "0"
และแตกต่างจากตัวอักษร "Q"
ต่อไปนี้จะแสดง 10 คะแนนที่ใช้ในรุ่นสุดท้าย จุดเหล่านี้เพียงพอสำหรับการระบุอักขระทั้งหมด
ฟังก์ชั่นทำอะไร
plateCrop[img]
เอาเฟรมและขอบซ้ายออกจากแผ่นทำให้พื้นหลังเป็นสีขาว ฉันสามารถกำจัดฟังก์ชั่นนี้ออกจากเวอร์ชั่นสุดท้ายได้โดยเลือกส่วนประกอบของภาพตัวอักษรที่เป็นไปได้ที่มีความสูงระหว่าง 100 ถึง 120 พิกเซล
isolateLetters[img]
ลบตัวอักษรแต่ละตัวออกจากภาพที่ครอบตัด
เราสามารถแสดงวิธีการทำงานด้วยการแสดงที่ภาพตัดเอาท์พุทจากไปเป็นข้อมูลสำหรับplateCrop
isolateLetters
ผลลัพธ์คือรายการของอักขระแต่ละตัว
Coordinates
มี 24 ตำแหน่งที่กระจายอย่างสม่ำเสมอสำหรับการตรวจสอบสีของพิกเซล พิกัดสอดคล้องกับที่อยู่ในรูปแรก
coordinates=Flatten[Table[{x,y},{y,99,0,-18},{x,9,72,18}],1];
{{9, 99}, {27, 99}, {45, 99}, {63, 99}, {9, 81}, {27, 81}, {45, 81}, {63, 81}, { 9, 63}, {27, 63}, {45, 63}, {63, 63}, {9, 45}, {27, 45}, {45, 45}, {63, 45}, {9, 27}, {27, 27}, {45, 27}, {63, 27}, {9, 9}, {27, 9}, {45, 9}, {63, 9}}
h
แปลงพิกเซลเป็นไบนารี่
h[img_] :=ArrayReshape[PixelValue[img, #] /. {_, _, _, z_} :> ⌈z⌉ & /@ coordinates, {6, 4}];
codes
เป็นลายเซ็นต์สำหรับตัวละครแต่ละตัว ค่าทศนิยมคือตัวย่อของรหัสไบนารีสำหรับเซลล์สีดำ (0) และสีขาว (1) ในเวอร์ชัน golfed จะใช้ฐาน 36
codes={{{15, 9, 9, 9, 9, 15}, "0"}, {{8, 8, 8, 8, 8, 8}, "1"}, {{15, 1, 3,6,12, 15}, "2"}, {{15, 1, 3, 1, 9, 15}, "3"}, {{2, 6, 6, 15, 2, 2}, "4"}, {{7, 12, 14, 1, 1, 15},"5"}, {{15, 8, 14, 9, 9, 15}, "6"}, {{15, 1, 2, 2, 6, 4},"7"}, {{15, 9, 15, 9, 9, 15}, "8"}, {{15, 9, 15, 1, 9, 15},"9"}, {{6, 6, 6, 6, 15, 9}, "A"}, {{15, 13, 15, 13, 13, 15}, "B"}, {{15, 8, 8, 8, 9, 15}, "C"}, {{15, 13, 13, 13, 13, 15}, "D"}, {{15, 8, 14, 8, 8, 15}, "E"}, {{15, 8, 14, 8, 8, 8},"F"}, {{15, 8, 8, 11, 9, 15}, "G"}, {{9, 9, 15, 15, 9, 9}, "H"}, {{1, 1, 1, 1, 9, 15}, "J"}, {{9, 10, 12, 14, 10, 9}, "K"}, {{8, 8, 8, 8, 8, 15}, "L"}, {{9, 15, 15, 15, 13, 9}, "M"}, {{9, 13, 13, 11, 11, 9}, "N"}, {{15, 9, 15, 14, 8, 8}, "P"}, {{15, 9, 9, 9, 15, 15}, "Q"}, {{15, 9, 15, 14, 10, 11}, "R"}, {{15, 8, 12, 3, 1, 15}, "S"}, {{15, 6, 6, 6, 6, 6}, "T"}, {{9, 9, 9, 9, 9, 15}, "U"}, {{9, 15, 6, 6, 6, 6}, "V"}, {{9, 15, 15, 15, 15, 15}, "W"}, {{9, 14, 6, 6, 14, 9}, "X"}, {{9, 14, 6, 6, 6, 6}, "Y"}, {{15, 3, 2, 4, 12, 15}, "Z"}};
(* decryptRules
สำหรับการแทนที่ลายเซ็นด้วยอักขระที่เกี่ยวข้อง *)
decryptRules=Rule@@@codes;
f
เป็นฟังก์ชั่นที่ใช้ถ่ายรูปแผ่นป้ายทะเบียนและส่งคืนตัวอักษร
f[plate_]:=FromDigits[#,2]&/@#&/@h/@isolate[plateCrop@plate]/.decryptRules;
{"A", "B", "C", "D", "E", "F", "G"}
{"H", "1", "J", "K", "L", "M", "N", "0"}
{"P", "Q", "R", "S", "T", "U", "V", "V", "W"}
{"X", "Y", "Z", "0", "1", "2", "3", "4"}
{"5", "6", "6", "7", "8", "9"}
แข็งแรงเล่นกอล์ฟ
รหัสสั้นลงโดยใช้เลขทศนิยมเดียวเพื่อแทน 24 บิตทั้งหมด (สีขาวหรือสีดำ) สำหรับแต่ละอักขระ ตัวอย่างเช่นตัวอักษร "J" ใช้กฎการแทนที่ต่อไปนี้: 1118623 -> "J"
.
1118623 สอดคล้องกับ
IntegerDigits[1118623 , 2, 24]
{0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1}
ซึ่งสามารถบรรจุใหม่เป็น
ArrayReshape[{0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1}, {6, 4}]
{{0, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 1}, {1, 0, 0, 1} , {1, 1, 1, 1}}
ซึ่งเป็นเพียงเมทริกซ์สำหรับ "J" ที่เราเห็นด้านบน
%//MatrixForm
เงินออมอีกอันมาจากการใช้ตัวอักษร"0123456789ABCDEFGHJKLMNPQRSTUVWXYZ"
แทนรายการตัวอักษร
ในที่สุดฟังก์ชั่นทั้งหมดจากรุ่นยาวยกเว้นh
ถูกรวมเข้ากับฟังก์ชั่นf
แทนที่จะกำหนดแยกต่างหาก
h@i_:=ArrayReshape[i~PixelValue~#/.{_,_,_,z_}:>⌈z⌉&/@Join@@Table[{x,y},{y,99,0,-18},{x,9,72,18}],{6,4}];f@p_:=#~FromDigits~2&/@(Join@@@h/@SortBy[Select[p~ImageTrim~{{100,53},{830,160}}~ColorReplace~Yellow~ComponentMeasurements~{"Image","Centroid"},Last@ImageDimensions@#[[2,1]]>100&],#[[2,2,1]]&][[;;,2,1]])/.Thread[IntegerDigits[36^^1c01agxiuxom9ds3c3cskcp0esglxf68g235g1d27jethy2e1lbttwk1xj6yf590oin0ny1r45wc1i6yu68zxnm2jnb8vkkjc5yu06t05l0xnqhw9oi2lwvzd5f6lsvsb4izs1kse3xvx694zwxz007pnj8f6n,8^8]->Characters@"J4A51LUHKNYXVMW732ZTCGSFE60Q98PRDB"]