Nonogram Hub
Nonogram Hub

Hoe we onze nonograms maken

Elke puzzel hier begint als een gewone afbeelding en eindigt als een raster dat je met alleen logica kunt oplossen. Daartussen doorloopt hij een geautomatiseerde pijplijn die de afbeelding rastert, test of het resultaat daadwerkelijk oplosbaar is, en degene die dat niet zijn weggooit. Deze pagina doorloopt dat proces eerlijk — inclusief de delen die mislukken, want het meeste werk zit in het afwijzen van slechte puzzels in plaats van het maken van goede.

1. Het begint met een afbeelding

Een nonogram is altijd maar een zwart-wit silhouet — geen schaduw, geen kleur, geen interne details. Dus de eerste stap is het kiezen van een bronafbeelding waarvan de vorm duidelijk leesbaar is op een minuscule resolutie: een dier, een stuk fruit, een sterrenbeeld, een huishoudelijk voorwerp. We werken met vectorkunst (SVG), transparante PNG's en gewone foto's, geordend in thematische assetpakketten, plus afbeeldingen die via een in-app-afbeeldingszoekfunctie worden binnengehaald.

Wat in dit stadium telt, is niet hoe mooi de afbeelding is — het is hoe goed de omtrek het overleeft om te worden platgedrukt tot een raster van 15×15 of 20×20. Een krachtige, goed afgescheiden vorm werkt. Een druk tafereel met veel kleine overlappende onderdelen doet dat bijna nooit, en we zullen hieronder zien waarom.

2. Een afbeelding in een raster veranderen

De afbeelding wordt gerasterd met een echte beeldbibliotheek (dezelfde waarop browsers voor SVG steunen), en vervolgens teruggebracht tot één zwart-of-wit-waarde per cel. Er is geen enkele "juiste" manier om dat te doen, dus de pijplijn probeert er meerdere: door af te gaan op de eigen transparantie van de afbeelding waar die er is, op de gewone helderheid (donker = gevuld), of — voor een helder, kleurrijk onderwerp op een egale achtergrond, waar helderheid alleen het nauwelijks afscheidt — op de kleurafstand tot de achtergrond. Een lichtoranje vos op wit is qua helderheid bijna wit, maar qua kleur er ver vandaan; het kleurafstandsmasker isoleert hem netjes.

De grens tussen "gevuld" en "leeg" wordt automatisch gekozen met Otsu's method, een standaardtechniek die de helderheidsdrempel vindt die de afbeelding het schoonst in twee groepen splitst. Omdat er geen manier is om van tevoren te weten welke grootte, uitsnede en drempel het best leesbaar zijn, genereert de pijplijn per afbeelding vele kandidaatrasters — verschillende groottes, verschillende drempels — snijdt elk bij tot zijn gevulde inhoud en past de vorm aan de verhoudingen van het raster aan, zodat een brede kroon een breed raster krijgt in plaats van in een vierkant te worden geperst.

3. Controleren of hij daadwerkelijk oplosbaar is

Een afbeelding die er voor een mens goed uitziet, is niet automatisch een geldige puzzel. Een echte nonogram moet oplosbaar zijn op basis van alleen de rij- en kolomaanwijzingen en — cruciaal — moet precies één oplossing hebben. Als twee verschillende gevulde patronen allebei aan elke aanwijzing voldoen, is de puzzel dubbelzinnig en oneerlijk, want iemand die met pure logica oplost, zou correct bij het "verkeerde" plaatje kunnen uitkomen.

Dus elke kandidaat wordt aan een solver gevoerd: hij past dezelfde regel-voor-regel-deducties toe die een persoon zou maken, en waar logica alleen vastloopt, valt hij terug op een uitputtende zoektocht om te tellen hoeveel volledige oplossingen er bestaan. Elk raster met nul oplossingen (tegenstrijdig) of meer dan één oplossing (dubbelzinnig) wordt ter plekke afgewezen. Deze uniciteitscontrole is de allerbelangrijkste poort in de hele pijplijn.

4. Zorgen dat het logica is, geen gissen

Eén oplossing hebben is niet helemaal genoeg. Een puzzel kan technisch uniek zijn maar alleen bereikbaar via vallen en opstaan — een cel invullen, hem diep het raster in volgen en terugkeren wanneer hij tegenspreekt. Dat is geen oplossen; dat is gissen, en het maakt een frustrerende puzzel.

Om dit te ondervangen, classificeren we hoe moeilijk elke puzzel is om doorheen te redeneren. Puzzels die volgen uit rechttoe-rechtaan regel-voor-regel-logica zijn "eenvoudig". Een tweede, goed bestudeerde laag van deductie (gebaseerd op gepubliceerd nonogram-moeilijkheidsonderzoek van Batenburg and Kosters) handelt de meeste van de rest af zonder enig gissen. Alles wat nog steeds niet zonder vallen en opstaan kan worden opgelost, wordt gemarkeerd als gissen-vereist — en voor de dagelijkse catalogus worden die opzijgezet in plaats van gepubliceerd.

5. Waarom veel afbeeldingen het nooit halen

Vóór al het oploswerk voorspelt de pijplijn ook of een afbeelding überhaupt een poging waard is, met twee botte maar eerlijke signalen. Het ene is scheidbaarheid: hoe schoon de afbeelding zich überhaupt in twee tonen splitst — een troebele bron met laag contrast is bij elke grootte een slechte gok. Het andere is een detail-versus-resolutie-passing: een afbeelding met veel meer fijne kenmerken dan het raster cellen heeft, zal gewoon tot een klodder instorten.

Een concreet voorbeeld uit onze eigen tests: een echte foto van de Eiffeltoren leverde een kandidaat van 40×40 op die elke oplosbaarheidscontrole doorstond — één unieke oplossing, een redelijke vulverhouding — maar als een massieve rechthoek werd weergegeven. Het traliewerk van de toren en de rommel eronder platten af tot één ongedifferentieerd blok. Technisch een geldige nonogram; visueel nutteloos. Dat soort gevallen is precies wat deze vooraf-controles, plus een menselijke blik, moeten tegenhouden. Om duidelijk te zijn over de grenzen: er is hier geen visiemodel — de pijplijn herkent nooit *wat* er op een afbeelding staat, maar meet alleen hoe goed de vorm zich laat omzetten. Daarom ligt de eindbeslissing nog steeds bij een persoon.

6. Een beoordeling, en een laatste menselijke blik

Puzzels die elke poort passeren, krijgen een moeilijkheidsbeoordeling op basis van hun oplosniveau en vormstatistieken (hoe gevuld het raster is, of de afbeelding over de randen loopt, enzovoort), wat ze sorteert in verzamelingen van makkelijk, gemiddeld en moeilijk. Vervolgens opent een persoon degene die bestemd zijn voor de catalogus in onze rastereditor, controleert of de afbeelding daadwerkelijk leest als wat hij hoort te zijn, en past alles aan of verwerpt het wat de geautomatiseerde controles hebben doorgelaten maar niet hadden mogen doen.

Het is een bewust onglamoureus proces, en dat is het punt: de automatisering bestaat om eerlijkheid te garanderen — één oplossing, oplosbaar met logica — terwijl een mens waakt over datgene wat een computer niet kan beoordelen, namelijk of de voltooide afbeelding iets voorstelt.

Dat is de hele pijplijn, minus de code. Als je er liever een oplost dan erover te lezen hoe hij is gebouwd, is de puzzel van vandaag een goede plek om te beginnen.