Применение фильтра Собеля из SciPy.ndimage - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь применить оператор Собеля из SciPy.ndimage и повторить результат, показанный в Википедии , но изображения очень разные.

Comparison of applying the Sobel operator

В результате, представленном в Википедии, края гораздо более выражены.

Код, который я использую, приведен ниже.Можно ли изменить этот код, чтобы он соответствовал результатам, представленным в Википедии?Исходное изображение, а также итоговое изображение из Википедии прилагается ниже.

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from scipy.ndimage import filters


# Images from https://en.wikipedia.org/wiki/Sobel_operator
im_original = np.array(Image.open('Valve_original_(1).PNG').convert('L'))
im_sobel = np.array(Image.open('Valve_sobel_(3).PNG').convert('L'))

# Construct two ndarrays of same size as the input image
imx = np.zeros(im_original.shape)
imy = np.zeros(im_original.shape)

# Run the Sobel operator
# See https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.sobel.html
filters.sobel(im_original,1,imx,cval=0.0)  # axis 1 is x
filters.sobel(im_original,0,imy, cval=0.0) # axis 0 is y

magnitude = np.sqrt(imx**2+imy**2)

# Construct the plot

fig = plt.figure(figsize=(10,8))

ax1 = fig.add_subplot(221)
ax1.set_title('Original (Wikipedia)')
ax1.axis('off')
ax1.imshow(im_original, cmap='gray')

ax2 = fig.add_subplot(222)
ax2.set_title('Sobel operator - as shown on Wikipedia')
ax2.axis('off')
ax2.imshow(im_sobel, cmap='gray')

ax3 = fig.add_subplot(224)
ax3.set_title('Sobel operator - from scipy.ndimage')
ax3.axis('off')
ax3.imshow(magnitude, cmap='gray')

plt.savefig('sobel.png')
plt.show()

Изображения

Исходное изображение: Valve_original_ (1) .PNG Original image Valve_original_(1).PNG

Результат, как представлено в Википедии: Valve_sobel_ (3) .PNG

Result as presented on Wikipedia Valve_sobel_(3).PNG

1 Ответ

0 голосов
/ 07 октября 2018

Чтобы положить этот вопрос в порядок, я выкладываю ответ, основанный на комментариях выше.

Отфильтрованное по Собелу изображение парового двигателя, как показано в Википедия , было обработано некоторым дополнительным способомне указано и, следовательно, не может быть полностью воспроизведено.Скорее всего, исходное изображение RGB было сначала преобразовано в оттенки серого, а затем зафиксировано.

Если посмотреть на гистограмму интенсивности для отфильтрованного по Собелу изображения, полученного из SciPy.ndiamage, см. Рисунок ниже, большинство пикселей сосредоточены вокруг интенсивности3.5.Применение значения зажима 50 позволяет получить изображение, более близкое к тому, что показано на странице Википедии.Sobel filtered image clamped to 50 with histogram

...