应用来自SciPy.ndimage

时间:2018-10-06 10:59:20

标签: python scipy sobel

我正在尝试从SciPy.ndimage应用Sobel运算符并复制Wikipedia上显示的结果,但是图像却大不相同。

Comparison of applying the Sobel operator

在Wikipedia上显示的结果显示边缘更加明显。

下面列出了我正在使用的代码。可以更改此代码以与Wikipedia上显示的结果一致吗?随附以下原始图片以及Wikipedia的结果图片。

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

结果在Wikipedia上显示:Valve_sobel_(3).PNG

Result as presented on Wikipedia Valve_sobel_(3).PNG

1 个答案:

答案 0 :(得分:1)

为了解决这个问题,我根据以上评论发布了答案。

Wikipedia所示的蒸汽机经Sobel滤波的图像已经以未指定的其他方式进行了处理,因此无法完全复制。很有可能首先将原始RGB图像转换为灰度然后进行钳制。

查看从SciPy.ndiamage获得的Sobel滤波图像的强度直方图(请参见下图),大多数像素围绕3.5的强度居中。施加50的钳位值将产生更接近Wikipedia页面上显示的图像。 Sobel filtered image clamped to 50 with histogram