2013-06-15 2 views
1

Numpy 배열로 파이썬에 이미지를로드했다고 가정 해 보겠습니다.배열의 창에 함수 적용 (필터 같은)

필터 커널과 같이 5x5 창을 통해 함수를 실행하고 싶습니다.하지만 표준 회선은 아닙니다. 이 작업을 수행하는 가장 효율적인 방법은 무엇입니까?

구체적인 예 - 관련 3D 좌표가있는 점의 이미지가 있습니다. 이미지에서 5x5 창에 대한 평균 법선 벡터를 계산하고 싶습니다. 내가 뭔가 같은 상상 : 나는 그것을 할 수있는 더 좋은 방법이 바라고 그래서 냄새는 일반적으로 NumPy와의 배열을 통해

for each pixel in image: 
    form an nxn window and extract a list of points 
    fit a plane to the points 
    calculate the normal 
    associate this value with pixel (2,2) in the window 

순회이다.

+0

점에 비행기를 맞추는 것은 savitzky-golay 필터처럼 들리므로 쉽게 벡터화 할 수 있어야합니다. – seberg

답변

0

scipy가있는 경우 scipy.ndimage.filters.generic_filter을 사용할 수 있습니다. 예를 들어

,

import numpy as np 
import scipy.ndimage as ndimage 

img = np.arange(100, dtype='float').reshape(10,10) 
print(img) 
# [[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.] 
# [ 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.] 
# [ 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.] 
# [ 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.] 
# [ 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.] 
# [ 50. 51. 52. 53. 54. 55. 56. 57. 58. 59.] 
# [ 60. 61. 62. 63. 64. 65. 66. 67. 68. 69.] 
# [ 70. 71. 72. 73. 74. 75. 76. 77. 78. 79.] 
# [ 80. 81. 82. 83. 84. 85. 86. 87. 88. 89.] 
# [ 90. 91. 92. 93. 94. 95. 96. 97. 98. 99.]] 

def test(x): 
    return x.mean() 

result = ndimage.generic_filter(img, test, size=(5,5)) 
print(result) 

인쇄

[[ 8.8 9.2 10. 11. 12. 13. 14. 15. 15.8 16.2] 
[ 12.8 13.2 14. 15. 16. 17. 18. 19. 19.8 20.2] 
[ 20.8 21.2 22. 23. 24. 25. 26. 27. 27.8 28.2] 
[ 30.8 31.2 32. 33. 34. 35. 36. 37. 37.8 38.2] 
[ 40.8 41.2 42. 43. 44. 45. 46. 47. 47.8 48.2] 
[ 50.8 51.2 52. 53. 54. 55. 56. 57. 57.8 58.2] 
[ 60.8 61.2 62. 63. 64. 65. 66. 67. 67.8 68.2] 
[ 70.8 71.2 72. 73. 74. 75. 76. 77. 77.8 78.2] 
[ 78.8 79.2 80. 81. 82. 83. 84. 85. 85.8 86.2] 
[ 82.8 83.2 84. 85. 86. 87. 88. 89. 89.8 90.2]] 

윈도우 경계의 가장자리를 떨어질 때 값이 함수에 전달되어야 하는지를 제어 할 수 mode 매개 변수를 확인하시기 바랍니다 .

이것은 주로 계산을 구성하기위한 편의 함수 임에 유의하십시오. 각 창에 대해 한 번씩 파이썬 함수를 호출합니다. 그것은 본질적으로 느릴 수 있습니다.

+0

고마워, 나는 그것이 내가 원하는 것을 기본적으로 생각한다. 성능상 중요한 것은 아니지만 하루 종일 운영되기를 원하지 않습니다. 나는 그것을 시험해보고 업데이트 할 것이다. 프로그래밍의 편의성을 말하지만, 나를 위해 성능을 뛰어 넘는 빠르고 빠져 나간 스크립트에 대해서는 말이다. – Josh