2016-07-08 43 views
1

私は、ステレオビジョンに関連するプロジェクトでopenCVとpythonを使い始めています。 openCVを使用したC++のCensus Transformに関するこのドキュメントのページを発見しました。 linkCensus transform in python openCV

Pythonの実装に似た機能があるかどうかは知っていますか?

(例:cv2.nameofthefunction)

ありがとうございました!

EDIT:PM 2Ringの優れたソリューションを(再びありがとう)この小さな変化にOpenCVのを扱うことができます:代わりに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 

を使用しますwとhは "size"コマンドと比較しています。それでPM 2Ringの残りのコードを貼り付けて、うまくいった。

答えて

7

私はopenCVを使用しないで、センサストランスフォームの既存の実装があるかどうかわからない。しかし、Numpyを使って実装するのは簡単です。

PILを使用して画像を読み込んで配列データを画像に変換する簡単なデモがあります。

#!/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) 

ソース

source image

出力

output image

オリジナルフルカラーメガネ画像をPOV線を用いギルス・トランによって作成され、ましたパブリックドメインでWikipediaにあります。

+0

ありがとうございました! – marcoresk

+0

@marcoresk:私の答えがあなたを助けてくれたなら、[accepting](http://meta.stackexchange.com/a/5235)と考えてください。 –

+0

親愛なるPMに、私はあまりよく馴染んでいないし、Pythonでもスタックオーバーフローではない...回答が受け入れられました!私はいくつかのテストをしました(スクリプトの残りの部分でopencvを使用しなければならないため、あなたのソリューションを含める方法が見つかりました) – marcoresk