Bildverarbeitung · OpenCV · Programming · Python

Linescan mit OpenCV+Python

Für manche Aufgaben der Bildverarbeitung möchte man gerne alle weißen oder schwarzen Punkte auf einer geraden zählen. Dies ist eine übliche Vorgehensweise bei der Realisierung eines Barcodescanners. Die dazugehörige Technik nennt man Linescan (oder Scanline) Funktion. Hierzu brauchen wir also eine Funktion die uns die einzelnen Punkte liefert. Für Linescans die in 0°, 90°,180° oder 270° zur Bildausrichtung stehen ist das ganze mit einer einfachen for Schleife getan. Für einen Vertikalen Scan:

def linescanVertikal(x,mat): #gibt alle punkte auf der X achse bei breite x
 liste = []
 for y in range(mat.shape[0]):
   liste.append([x,y])
 return liste

Beziehungsweise für einen Horizontalen Scan:

def linescanHorizontal(y,mat): #gibt alle punkte auf der Y achse bei hoehe y
 liste = []
 for x in range(mat.shape[1]):
   liste.append([x,y])
 return liste

Das ganze ist schön und gut. Aber manchmal braucht man eine Funktion die auch Linien in anderen Winkeln bearbeiten kann. Sie müsste uns die Punkte zwischen zwei Punkten liefern. Dazu ist es nötig, die Steigung zwischen den beiden Punkten zu kennen und eine imaginäre Linie zwischen den beiden Punkten zu ziehen. Danach gibt man alle Punkte aus die auf dieser Linie liegen. Hier nun der Code für diesen verbesserten Linescan:

from __future__ import division
import math
def getPoints(p1,p2): #funktion kriegt zwei Punkte+Bild und liefert eine Liste aller Punkte dazwischen
  steigung = 0.0
  steigung = (p1[1]-p2[1])/(p1[0]-p2[0])
  liste = []
  laenge = math.sqrt(math.pow(p2[0]-p1[0],2)+math.pow(p2[1]-p1[1],2))
  for multi in range(int(laenge)):
    x = int(round(p1[0]+multi*(p2[0]-p1[0])/laenge))
    y = int(round(p1[1]+multi*(p2[1]-p1[1])/laenge))
    liste.append([x,y])
  if liste[-1] != p2:
    liste.append(p2)
  return liste

Die oberste Zeile muss am Anfang der Datei stehen. Sie sorgt dafür dass Python 2 die Bruchrechnung von Python 3 verwendet. Wer Python 3 oder höher benutzt kann sie sich also sparen.

linescan
Die vom Linescan gefundenen Punkte sind auf diesem Bild weiß markiert

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google Foto

Du kommentierst mit Deinem Google-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s