2016-07-08 21 views
1

Ich beginne mit openCV und Python in einem Projekt mit Stereovision zu arbeiten. Ich habe diese Seite der Dokumentation über die Census-Transformation in C++ mit openCV gefunden. linkCensus in Python transformieren openCV

Weiß jemand, ob es ähnliche Funktionen für Python-Implementierung gibt?

(z cv2.nameofthefunction)

Vielen Dank!

EDIT: die ausgezeichnete Lösung von PM 2Ring (danke nochmal) lässt sich mit diesem Wechsel mit OpenCV arbeiten: statt mit Image.open

img = cv2.imread(img.png) 
#some minor changes I needed like select some ROI and store them in img2[j] 
#then a for cycle in which I wrote 
src_img = img2[j] 
h, w = src_img.shape 

, wo die „Form“ Anweisung scheint die Reihenfolge zu wechseln von w und h im Vergleich zum Befehl "Größe". Dann füge ich den Rest des Codes von PM 2Ring ein und es hat wunderbar funktioniert

Antwort

7

Ich benutze nicht openCV, und ich weiß nicht, ob es eine vorhandene Implementierung der Census-Transformation gibt. Es ist jedoch einfach, mit Numpy zu implementieren.

Hier ist eine einfache Demo, die PIL verwendet, um das Laden des Bildes und das Konvertieren der Array-Daten zurück in ein Bild zu behandeln.

#!/usr/bin/env python 

''' The Census Transform 

    Scan an 8 bit greyscale image with a 3x3 window 
    At each scan position create an 8 bit number by comparing the value 
    of the centre pixel in the 3x3 window with that of its 8 neighbours. 
    The bit is set to 1 if the outer pixel >= the centre pixel 

    See http://stackoverflow.com/questions/38265364/census-transform-in-python-opencv 

    Written by PM 2Ring 2016.07.09 
''' 

import numpy as np 
from PIL import Image 

iname = 'Glasses0S.png' 
oname = 'Glasses0S_census.png' 

#Get the source image 
src_img = Image.open(iname) 
src_img.show() 

w, h = src_img.size 
print('image size: %d x %d = %d' % (w, h, w * h)) 
print('image mode:', src_img.mode) 

#Convert image to Numpy array 
src_bytes = np.asarray(src_img) 

#Initialize output array 
census = np.zeros((h-2, w-2), dtype='uint8') 

#centre pixels, which are offset by (1, 1) 
cp = src_bytes[1:h-1, 1:w-1] 

#offsets of non-central pixels 
offsets = [(u, v) for v in range(3) for u in range(3) if not u == 1 == v] 

#Do the pixel comparisons 
for u,v in offsets: 
    census = (census << 1) | (src_bytes[v:v+h-2, u:u+w-2] >= cp) 

#Convert transformed data to image 
out_img = Image.fromarray(census) 
out_img.show() 
out_img.save(oname) 

Quelle

source image

Ausgang

output image

Die ursprüngliche Vollfarb-Bild Gläser von Gilles Tran mit POV-Ray erstellt wurde, und ist in der Öffentlichkeit. Es kann auf Wikipedia gefunden werden.

+0

Vielen Dank! – marcoresk

+0

@marcoresk: Wenn meine Antwort Ihnen geholfen hat, beachten Sie bitte [akzeptieren] (http://meta.stackexchange.com/a/5235) es. –

+0

Lieber PM, ich bin mit Python und Stack Overflow nicht sehr vertraut ... Antwort angenommen! Ich habe einen Test gemacht (weil ich opencv im Rest des Skripts verwenden muss und ich habe einen Weg gefunden, Ihre Lösung einzubinden) – marcoresk