Een koloniepikker is een instrument waarmee microbiële kolonies die op een vaste voedingsbodem groeien automatisch kunnen worden gelocaliseerd, opgepikt en gedupliceerd op een vaste of vloeibare voedingsbodem. Doorgaans wordt een petrischaal aangebracht op de lichtplaat van de koloniepikker, waarna algoritmen voor beeldanalyse de juiste kolonies uitkiezen en een robotarm aansturen om die kolonies te bemonsteren. Dergelijke toestellen worden zowel in onderzoekslaboratoria als in industriële omgevingen gebruikt, bijvoorbeeld om voedings- of bloedstalen te analyseren.

koloniepikker
Pickolo — een automatische koloniepikker die als uitbreiding geïnstalleerd werd op een Tecan robot toont een typische laboratoriumopstelling. Op de lichtplaat van de robot (onder) wordt een petrischaal geplaatst. De camera (boven) neemt een foto van de schaal en beeldanalysesoftware kiest de juiste kolonies uit voor verdere verwerking. Een wegwerptip (uit het rek links) wordt gebruikt om een kolonie aan te raken en over te brengen naar een verzamelschaal (rechtsonder). In een volledig geautomatiseerde opstelling wordt een stapelaar (rechts) gebruikt om meerdere schalen na elkaar te kunnen verwerken.
Victoria amazonica
Elk vlekje op deze agarplaat is een bacteriële kolonie afkomstig uit een staal van een zeespons. Tegen de tijd dat een kolonie zichtbaar wordt voor het menselijke oog, bestaat ze reeds uit minstens een miljoen cellen. Minder dan één procent van alle bacteriën kan op die manier in het laboratorium gekweekt worden, om maar aan te geven hoe groot het reservoir aan onbekende bacteriële diversiteit nog is. Om de onbekende bacteriën in kaart te brengen, gebruiken microbiologen een combinatie van nieuwe groeitechnieken en technieken voor moleculair genetische karakterisering om daarmee microbiële gemeenschappen te kunnen onderzoeken.

De beeldverwerkingssoftware krijgt de foto van een petriplaat te zien onder de vorm van een bitmap. Dit is niets anders dan een rechthoekig rooster waarvan de vakjes bits genoemd worden omdat ze slechts twee toestanden kunnen aannemen. Elke bit van het rooster is ofwel leeg (voorgesteld door een spatie) of wordt bedekt door een kolonie (voorgesteld door een hekje: #). Als voorbeeld zie je hieronder een bitmap waarop een aantal kolonies te zien zijn. In een bitmap wordt een kolonie gevormd door een gebied van aangrenzende bedekte bits. Bits worden hierbij aangrenzend genoemd als ze een gemeenschappelijke zijde hebben. De software zal een gebied van aangrenzende bedekte bits echter nooit als een kolonie beschouwen, als het bits op de buitenste rand van de bitmap bevat.

bitmap van een petriplaat
Bitmap gemaakt van een petriplaat. Deze bitmap is een rechthoekig rooster met 20 rijen en 60 kolommen, waarbij de bits die bedekt zijn door bacteriële kolonies worden aangeduid door hekjes (#). Deze bitmap telt zes gebieden van aangrenzende bezette bits, maar slechts vijf daarvan worden als kolonies beschouwd, omdat er één gebied bits heeft die op de buitenste rand van de bitmap liggen.

Opgave

Definieer een klasse Petrischaal waarmee kolonies op een petrischaal kunnen geanalyseerd worden. De objecten van deze klasse moeten minstens de volgende methoden hebben:

Voorbeeld

Bij onderstaande voorbeeldsessie gaan we ervan uit dat het tekstbestand schaal.txt12 zich in de huidige directory bevindt. Dit bestand bevat de bitmap van een petriplaat die hierboven grafisch werd weergegeven.

>>> schaal = Petrischaal('schaal.txt')
>>> print(schaal)
<BLANKLINE>
                         ###                                
                         #####                              
                         #######                            
                        #######                             
                         ######                             
                         ###### ##                          
                         ####  #####                        
                           ## ######        ####            
                        #    ######       ####              
                      ###  ##########    #####              
                    #######  ####  ##   ######              
                    ######### ##   #      #####             
          #           ####   ###          ###               
         #####        ####    #     ##     ##               
         #####                    ######    #               
        ######                   ########                   
         ####                     ########                  
                                  #######                   
                                  #######                   
>>> schaal.kolonie(10, 35)
42
>>> print(schaal)
<BLANKLINE>
                         ###                                
                         #####                              
                         #######                            
                        #######                             
                         ######                             
                         ###### ..                          
                         ####  .....                        
                           ## ......        ####            
                        #    ......       ####              
                      ###  ..........    #####              
                    #######  ....  ..   ######              
                    ######### ..   .      #####             
          #           ####   ...          ###               
         #####        ####    .     ##     ##               
         #####                    ######    #               
        ######                   ########                   
         ####                     ########                  
                                  #######                   
                                  #######                   
>>> schaal.kolonie(10, 40)
Traceback (most recent call last):
AssertionError: geen kolonie gevonden op positie (10, 40)
>>> schaal.kolonie(10, 45)
30
>>> print(schaal)
<BLANKLINE>
                         ###                                
                         #####                              
                         #######                            
                        #######                             
                         ######                             
                         ###### ..                          
                         ####  .....                        
                           ## ......        ....            
                        #    ......       ....              
                      ###  ..........    .....              
                    #######  ....  ..   ......              
                    ######### ..   .      .....             
          #           ####   ...          ...               
         #####        ####    .     ##     ..               
         #####                    ######    .               
        ######                   ########                   
         ####                     ########                  
                                  #######                   
                                  #######                   
>>> schaal.ongedaan_maken()
>>> print(schaal)
<BLANKLINE>
                         ###                                
                         #####                              
                         #######                            
                        #######                             
                         ######                             
                         ###### ##                          
                         ####  #####                        
                           ## ######        ####            
                        #    ######       ####              
                      ###  ##########    #####              
                    #######  ####  ##   ######              
                    ######### ##   #      #####             
          #           ####   ###          ###               
         #####        ####    #     ##     ##               
         #####                    ######    #               
        ######                   ########                   
         ####                     ########                  
                                  #######                   
                                  #######                   
>>> schaal.kolonies()
5
>>> schaal.koloniegrootte()
32.2