我在Python中尝试了5种不同的Sobel算子实现方式,其中一种是我自己实现的,结果根本不同。
我的问题类似于这个问题,但其他实现中仍然存在我不理解的差异。
是否有关于Sobel算子的约定定义,是否总是等同于“图像梯度”?
甚至Sobel核的定义也随不同来源而异,根据维基百科的说法,它是[[1, 0, -1],[2, 0, -2],[1, 0, -1]]
,但其他来源则是[[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]]
。
这是我用不同技巧尝试的代码:
from scipy import ndimage
import numpy as np
import cv2 as cv
from scipy import ndimage
from PIL import Image, ImageFilter
img = np.random.randint(0, 255, [10, 10]).astype(np.uint8)
def sobel_x(img) :
return ndimage.convolve(img, np.array([[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]]))
my_sobel = sobel_x(img)
_, numpy_sobel = np.gradient(img)
opencv_sobel = cv.Sobel(img, cv.CV_8UC1, 1, 0)
ndimage_sobel = ndimage.sobel(img, axis=0, mode="constant")
pil_sobel = np.array(Image.fromarray(img).filter(ImageFilter.Kernel((3, 3), (-1, 0, 1, -2, 0, 2, -1, 0, 1), 1, 0)))
print(my_sobel)
print(numpy_sobel)
print(opencv_sobel)
print(ndimage_sobel)
print(pil_sobel)