Zaehlung auf oertlichen Kontrast umgestellt (Otsu versagte am echten Foto)

Otsu (bisheriges Verfahren) meldete am echten Foto des Auftraggebers
(~20 Schrauben auf Leder, unter 1% Flaechenanteil) 76712 statt rund
zwanzig - Otsu taugt nur bei etwa gleich grossen Objekt-/
Untergrundflaechen. countObjects() vergleicht jetzt jeden Bildpunkt mit
einem oertlichen Hintergrund (Kastenfilter ueber Summenbild, Radius
max(Breite,Hoehe)/12), was Ausleuchtungsunterschiede abfaengt und am
echten Foto 18 statt 76712 liefert (Test in
test/count-objects-photo.test.js, ~30-49ms Laufzeit).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
TanerUsluandClaude Opus 5 committed 2026-07-29 16:21:13 +02:00
1 parent ffb2409c24
commit 75c479860f
3 files changed
+353 -78

No files matched your search

+10
View File
@@ -0,0 +1,10 @@
// Pruefdaten: Ausschnitt eines echten Fotos - etwa zwanzig Festplattenschrauben
// auf dunklem Leder, einige davon einander beruehrend. Genau an diesem Bild ist
// eine fruehere Fassung der Zaehlung gescheitert (sie meldete 76712 statt rund
// zwanzig), weil die Ledernarbung zehntausende winziger heller Flecken erzeugt.
// Graustufen, 600 x 321, als Base64.
export const SCREWS_WIDTH = 600;
export const SCREWS_HEIGHT = 321;
export const SCREWS_GRAY_BASE64 =
'fniSc6a4htOe046j98SMgWmuqZOvoG+gxYBxhKKTpn/D5JKJlrjVoKCTv8iTndeXeZjYsZa8qqbf1pGIl4ajmZyb97+icL/Opr6ogpqVfKHmvXmf1J6tkbfPxZiwuu2hvHt+eWtydq61uqKU5LOD09+U6azRw/GWZIZ9o5eDa3tzt6iQssDHh7p6bpzfpM3sl5fEsLK2k8SbgchoqJ66gXu52aSnvNqtaeLgfJq+vZCuedKWtJuhg8HjvpzApZiMk3SHsZG/y4tso66Bv2x+1oubY8d/fnquec7bdMKS2Gp7iNeGiGaf73nXn2is0JdktYKlo6mjaYWny2aaopBZoMFdq4qBr5qCe3J7pJHEeKlju393pZFbbcKgbKhmbmJujXV0s3JqWys4OERYbkBCi4GMrsJ0j1N3t5HHa3mIc6FymXiib6WKZ2d8o6t9cUyji4OHr2dlp5RUrHGsa5praZlqfWNrtIBYYoCRjWVtdIpwaU1uf3yiT3mOTXKcYIl7cYNnk3BdfmhpaI2BoFmJj19jnXiBfHZ6Y3OXYVNhXmJynVJgiGKeYlpgd3Nqf3BYbltXZmh6a2JpcmhccK9pWVNsgIpbbl+IhFeJS2dman9sU1JZd1WsYk9Rm2xKeGc+W1CLXlFHXY1rX1pdbn5MZlZkZ15JSzhRVEtbYXpRP2tlcodhQ1GIT0hVTFRWRXplP1RlR0lOSFNpW0t/U1E3X2hXREExfHFNNjFcY0JHSTJIZDtAaVNcblFRUEBwXUJdlWJDTlpHWHtST0xRcXRFSY1XQVCMVGRU07iJe96Se8/htH2PrZqed5/O35V5mojg46CxdXOIv3m6uZyKvdqEbYmv2oGp6+qUwq62wNHpwJfVkJfPtIXY3o6WvNnhlrzsmKuDhNvqqKe9kqWEy7emb4KNvqbRisa2qWSPqlhhW7Ksz8Kuub2LiLSa25qdqMfhbau6jMfWfJZmtMutynqSscDdk6fyuHvUp39mpsDI69GRfuCvV5vspWJ0c2qKga+eioiboY+hhJXPhrCgx6OchGeXrq+/enfFuqFaupFmmKuAyOh3xoN7y7vbZsqdsICqfXTKn9mUhGqJb4uGjHNmmZ2rjnWQoMxpsY25a5HchKh5yI6cp5ZxicR0rIStY6uQh49imHi1f7NzX5mbcaSDXIaPd8+PnVR01HNXlYh5rDhrUEBVXmlInrp/hcF8hHJmrm6VlKOPhoyfdGmWin+JgVOqk6xrmlqfqIlfnGdui8Vaq4uFXZx/YJdXmGpbeY2aaY5hqG6AjWxzZVKPd1izY2ubYmGSjnprcZyHhoBWbll4h2OPqWRjrnJer4FgjGGAblSBc1xnY11niWlSfWSjYWKTZFx/hXZOmH5SZF9YeXRocnFmWItsfWJSYIpsalhzeFd4WVxhZ3hXT1VobmOGXFZPlYZRZGNHZkltcE9HVaJgUkpNYI1KZ1JPgFJRWE9IZnFNTYVdQ150T3RxTVeLS0g2VG1OQGVsPGB4QkRWRVNDVkaEXFI4UnJgS0Y6gW9ARTdESD9mYjY9XzxJWU5LU1piUjhSY21kcVZBP21fUoJVTj9AboFGUqNePE2KVUQ+kdSBk7Ccfqh7b215xZ+2d4aLsYuNin+azrKKq8lzjYOguqzc2L+1rYuBsrjawrKg1sN/lKO7wId1bJCVhZK+tbiZiOu5gZLTjKDaf5THm3WboLSTxa7Zx3Cw+K/V2LaUdnWUvVxcXHCcmXqAqOfZiHl8hJi09q/xlY21tMumkOWCXoKovq1hiICil5ay2I6QgqeDa4x/vfKHsMG4f2yMtZ+Kw3KQl23Im4ZmYoXHz7bXkqBqjZF+npFcc5Hhq3Ky6Z1zqKCIY4yGudiih7KBoayuh93FmH+ox3+HhtrifmvPooB+r4SATaWmqWiJVo14rpfij1ayq6VwjsaPzoltlppnpZ7ClX2+d3hQxYtucsKXZna8aImuio9mZ6SAxXVYwY2FVLlofFV0clBZa2tnd86Td4F4soBxzI5tWa63c3DDd2uJmpd1imKlgp1nlp94hIxjmn2CaItUcn+Cg2eQsHJieGiIlJ+faGWJmWt3tW9vaFpxcliCfWyccGRap4V9XGWec4ljamZooGVnxnFcfqBWmoFmaaBxX190Y118Yl5pVGpsmVaNcVyca151aHlikIZWXmJPgH9we19aZHRYi25ZSVt1YU9ZVFhicVtqVWxVTlhxYWd8a2BPf3tTUVVYZ1dRcUpFS51oS1hgUV1WbFNTe2JQWH9MYJBJO3lfUVNoQVNha1eAT0kwUYtLL0ltUl59PDVuYVg8Q0hvZ1REUlmBYkE+VWBKR0NbUTRUcj07YUlMPU+GY0BiWztWXnNlYE9SRW91WIVNSUI8WE9JV2xaYExvXjhNv7XKnXzRvcd1iqmupYO0l5yqoYfJwnuRiodqiYiXvpVhmLmZnJmIvvO5bZCOdHyRmYaNdG12kKeN39mQt4qCkrHBndmuiNCQa4CgfpO3xKN4kIt2fIyxkpWp97STlHOZ2tqamXpqnGm+24Wxi7Wmlp6joXl3m7ypt62oyd+XjbuGh2aZsOKCea2Zd3Z7kMGx2q7HbJucXJeduJGGzYCIl7Swl8nZsnGIt9+Pn4ev4La+fZqAhOuqea1olHazoax/vpqql6CqmW2Ye3t/aGieeJ5nhHnJu56VwpjHkoTmmqalzIGQwo+caJbOxXioYnSCY6Slcnp2n7JwkKpxr6Bxm8SbjZJ+mnS4vHxbuM5nlYqdjprUhISUksOUXaB0ZKCDvH+1Wb+hVG6oZ5RirWNcgX7Rdplnyapcuot0an/Hg26CcYvDZbVuYHh7VYlzgI6GdGNlm3NvoItlfYyBd3divXdxcZnYsa+YZllqhp1Wp3VZeWtNbqtOY1uxYmRMpW6McVOIn2JYZ35cj3RWn4iVYXddmXGFVaiPXX2MWlV6Y29nS3JwkGVaYop1cl1kXX9vX2tbbGxTZHhueltaaodTeHKEZGeCeWRbQG1iT1xdU2V6YEtzYF5ydF9SW31XR1NcWWFEc0tIVoZ4RHKMSD1le2RpW3plUGZOaYJdQVxgaGBLQUNRYUVuTkhMRY9HMll7TmB5QDNwglI9SEtZdWhFWVlXXVJSQk9kRDBsY0RPWVBCe1hEQFKcaUFnXTlZSVRfcklfUE5HWHdRST88cEU6YWE/Wllnak9Yxuu1mbSdjHut3KKKfbjWw8Gznri62K6keHagvMHcjHORh3CU39SznZKy65p4ubmKo+Dqn462bpl4jrzY2/CqYYmUc7WzocfGgb3ynH2MyaFmpLu5n4NqmpF6r5+k25ehqK2GlK6i2a+a2qPizHqxtNCxyaaui4VxhMSfraKoiZ+1yIyQZbGxntDygoGVaYrD3+XZep3ZkqVljbOQhZXhnH6+fYq8n5tXcLuohHzXsa3aiL3Qn6PhlOGFqKamytGDdq/OltGZi1p/xNe6gG3AjauhtX9nhbeDg3uh1XmgnNSjuJDPg8OWnHqXkrSVmH7Ce4fQc5WlW5etYotgc4uKn6CblL6GpHF7toaJfah1tq9pjnLXiHGNe4+2f6KuZJWmp424kX2Qkl/Ae5JvjqKCvFakhbGceK9mkJGpkH2EtYqCaW7WepeEonyTWHamp3Z6ZG11r3ZksZhpkLagX7tgdLR8bMvpx9Gec12EfXxTsZ9ObH9SZbZrSnCOjVlSqmF8k2FTr3JgeGhihI1bbI6rbWNQfY5yYV+Cjmt4WE5tf6RRSoh6cWZSYsRqaFdWVmx3a1tag3dWX2Vdb29xW2RnZGaJftDNnHBgVm1eTmtkgmxrdFeGXlJXc3RbVWN8PVZYUmVAenBSYGF1SmSNXENtc191SHhoSmZQXGBPUGpPaoVPU0lNZVVVRFdeTXxqQGOJSU5UVFFQglFNYD1HWIRNSlFHZF5SV0xSVTpUXU9SRlFEWFdaR0t4V0pqbEdcOzVHfl5wTTEtRV1qWUNAi08vTFQvUV1jY0tH7bZ3s9jMfZag0NqidIGxxaeMh8/hq22irXqbxaGRwIWuxp6gi4Cdfb3UtneSgJF8rdvAd7fS2Zl6gqvkt3l7gtjguYW0q7L0i7S8i4i14uSaf4qU4NGO2uehinXP1ZGCfKiUYX6lgJKHvsPZ2oWdk6d2bI3QrYzZhoOXhaWxnOz1fqTXn4WN1rvdj32tmWWU2NOhc5HImsNrpea1qWS153W4w2Vw0Mh8mXqijmx6noiQho2onsy+y62Ml5Z4jZh1Ymlul+PN4H99kLTAgpzSommCoaCVW5fKbqiDamGEiXKEqo3AdK3MiLZlZrLOto2Eplq0nn+pYmrInZR3j2mBw4eUgLSMZHeFhoKXsICWbHNurFyme4OQeZCte2hwtYVibaNtnadew1+EvG6GaXiBoldzjIPFXGFeiI19uJiOlnZwdVebhn1mequBaIOZcYO1fpJUlINiuZVjeZXKWKx5Z6qNgIrWz5h0cWCIjm1dfY54YmZ1WoqEWrNnrH1WoGtbjWBJdqV8m15ca411Wni7anVOacttdmBZcF5iWFpwd3xXVXd0aF9tYaFlXFxQWXJxa25adm9ub1t3XoBwU2iWXFdlaJiXmZdmW3hhZ21cc3ZXXmeaYlVMZ4JwV0yBSktUU1pVXmt2X0thfV9weE9ZX0GFWWBzRXxTR25MTXlIWnRhYFVQXYhPRFZbQVqDSl1/SkA1RmdMYWxOWEI4O4FZOj9ii1A/aFs/YEpHUlVNU1pAVVVhRkpzYkpTdlNUOjc7dYiDPSwkN3plSjxJe2M4PU1Vc1J1eDxFp3ZvtMa3mHTA8eqTn6e2q4SpiLjfypTM34CDrXGW68LZrX2PjLyrfa17tKuzx7x2lsLasbnW9Z2x0penu6K8fnSV1X6TfoatjJrqwWmlweyghZeH6KW1xqqXunSoxIjJl+WzlLDElpytf42Wl59ykMbnnGt4t6CjlsPUk4ijusHHiKa238GPqp2jxcHIx4xtnNPHLine truncated