2015-09-16 2 views
0

Я надеюсь, что кто-то может пролить свет на эту концепцию для меня. Мне нужно создать функцию, которая принимает изображение в оттенках серого (в массиве numpy) в качестве аргумента и выполняет итерацию через пиксель за пикселем. В прошлом я использовал для этого np.nditer (изображение). Мне нужно вернуть изображение (в массив numpy), похожее на это изображение.Python - дифференцирование изображения в направлении X

enter image description here

Для того, чтобы дифференцировать изображение в направлении X, мне нужно использовать: Р (х, у) = Р (х + 1, у) - Р (х, у)

Как вы можете видеть, мне нужно идти по столбцу, а Y остается тем же. Как бы я включил это в np.nditer? Я должен отметить, что мне нужно повторить, я не могу это обозначить. Кроме того, выход будет иметь ширину, меньшую, чем оригинал, так как вычисление не может быть выполнено после достижения последнего столбца.

Любая помощь очень ценится!

+0

Это кажется Собела х производную .. – Miki

+0

Привет Miki, я думаю, что ты прав, но я не могу использовать любые OpenCV функции, которые делают это автоматически для меня. – yodish

+0

Так что удалите opencv tag – Miki

ответ

1

Я думаю numpy.diff(image, axis=0) делает то, что вы хотите:

In [17]: image 
Out[17]: 
array([[7, 2, 0, 7, 5], 
     [7, 7, 2, 8, 6], 
     [2, 6, 4, 0, 7], 
     [7, 6, 2, 6, 1], 
     [6, 8, 7, 6, 3]]) 

In [18]: np.diff(image, axis=0) 
Out[18]: 
array([[ 0, 5, 2, 1, 1], 
     [-5, -1, 2, -8, 1], 
     [ 5, 0, -2, 6, -6], 
     [-1, 2, 5, 0, 2]]) 

Существуют различные конвенции индексации, используемые при обработке изображений и массивов, так что я мог бы неправильно требование. Если выше вычисляет разность по неправильному измерению, используйте axis=1 вместо:

In [19]: np.diff(image, axis=1) 
Out[19]: 
array([[-5, -2, 7, -2], 
     [ 0, -5, 6, -2], 
     [ 4, -2, -4, 7], 
     [-1, -4, 4, -5], 
     [ 2, -1, -1, -3]]) 
+0

Уоррен, я ценю время, которое ты взял, чтобы ответить. Однако я не могу использовать функцию, которая устраняет необходимость итерации. Мне нужно мучительно идти по пикселям и вычислять. – yodish

+0

* Почему? * Это домашнее задание или что-то в этом роде? –

+0

Больше «что-то», но да, я должен принять архаичный подход к этому. – yodish

2

Почему вы абсолютно хотите перебирать пиксели? Почему бы просто не использовать это?

h,w = image.shape 
dx_image = image[:,1:w-1] - image[:,0:w-2] 
+0

Жюльен, я не думаю, что мне абсолютно нужно перебирать их (это все, что я знаю, прямо сейчас). Ваш код дал мне немного меньше той ширины, которую я хотел, поэтому я просто использовал 'w = w-1' после' image.shape'. Это определенно имеет меня в правильном направлении, я все еще тестирую. Спасибо много! – yodish

+0

Должен признать, что я не совсем понимаю логику здесь. Как бы это изменить для реализации перехода в направлении Y (по строкам)? – yodish

+0

Чем больше я смотрю на эту работу, тем больше я думаю, что мне нужно итерации для выполнения требований. Я знаю, что это медленнее, но мне нужно выполнить цикл и по существу выполнить «image [r, c] = image [r, c + 1] - изображение [r, c]' – yodish

Смежные вопросы