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.
Die vom Linescan gefundenen Punkte hier weiß markiert
Konnte ich helfen? Ich freue mich über einen Drink!
💙