2017-09-28 2 views
1

OpenCV에서 호모 그래피 행렬의 정방향 워핑을 시도합니다. 문제를 이해하는 것이 무엇을 의미하는지 알 필요가 없습니다.픽셀 배열을 사용하여 opencv 이미지/numpy 배열 값 설정

2 명 화상 (화상의 화소 값의 2D NumPy와 배열이다), A 및 B, 제 1 열이 X, 제 Y는

[[ 6.96122642e+01 -1.06556338e+03 1.02251944e+00] 
[ 6.92265938e+01 -1.06334423e+03 1.02246589e+00] 
[ 6.88409234e+01 -1.06112508e+03 1.02241234e+00] 
... ] 

모양 배열 match가 있다고 가정하고, 세 번째는 스칼라입니다. 이 XY 값은 이미지 픽셀의 인덱스이며 imageB 인덱스 I 빠르게 imageA에서 imageB 값을 설정하려면이 정보를 사용하려면
[[0,0], 
[0,1], 
[0,2] 
... ] 

에 해당합니다. 나는이 작업을하지만

yAs = np.int32(np.round(match[:, 0]/match[:, 2]) 
xAs = np.int32(np.round(match[:, 1]/match[:, 2]) 
it = np.nditer(pixelsImageB[0], flags=['f_index']) 
while not it.finished: 
    i = it.index  
    xA = xAs[i] 
    yA = yAs[i] 
    if in_bounds(xA, yA, imageA): 
     yB = pixB[0][i] 
     xB = pixB[1][i] 
     imageB[xB,yB] = imageA[xA,yA] 

    it.iternext() 

싶습니다하지만 순진이 루프가 매우 느립니다하고, NumPy와의 빠른이 만드는 방법을 잘 모르겠어요로 최대한 빨리하지 않습니다. 나는 고급 색인 생성, 방송 등에서의 전체 스크럽입니다. 어떤 아이디어?

+0

'x'와'y'는 첫 번째 후보와 같이 루프 밖으로 이동합니다. 예 : 'x = np.int32 (np.round (match [:, 0]/match [:, 2]))' –

+0

'in_bounds' 란 무엇입니까? – Divakar

+0

x 또는 y가> 0이고 <너비, 높이입니다. 그 x, y 배열 Dan을 어떻게 사용 하시겠습니까? –

답변

1

가장 빠른 방법은 바퀴를 재발 명하지 않고 cv.WarpPerspective 기능을 사용하는 것입니다.

다른 방법으로는 OpenCV보다 약간 유리한 Pillow Image.transform 방법을 사용할 수 있습니다.이 방법은 더 나은 품질의 출력을 생성해야하는 바이 큐빅 보간법을 지원합니다.

+0

실제로 물건을 얻고 싶다면 절대적으로 이것은 최고의 옵션입니다. 나는 그것이 작동하는 법을 배우기 위해 그것을 구현하고 있으며 여기 Numpy에 대해서도 조금 배우기를 원하고있다. –

+0

Ok, then 1) 마스크를 만들어서 루프 밖에서 조건 (in_bounds)을 옮긴다. 그냥 x/y를 xAs와 yAs로 작성한 표현식을 마스크 변수에 저장하십시오. 2) 그런 다음 간단히 다음과 같이 방송을하십시오 : imageB [pixB [1, mask], pixB [0, mask]] = imageA [xAs [mask], yAs [mask]] – lomereiter

관련 문제