【发布时间】:2023-01-31 01:14:36
【问题描述】:
OpenCV 使用 Sobel operator defined here (details here) 的实现。在这个实现中,先生成水平导数,然后生成垂直导数,然后计算梯度作为导数的 L2 范数。
假设我想改用 L1 范数。为了证明这一点,我拍摄了一张图像,并尝试从 OpenCV 的Sobel() 中获得与手动计算梯度的 L2 范数相同的结果:
import cv2
z_img = cv2.imread(".\\some_image.tif", cv2.IMREAD_UNCHANGED)
z_px_rows = z_img.shape[0]
z_px_cols = z_img.shape[1]
print(f'Center pixel intensity (original): {z_img[z_px_rows // 2, z_px_cols // 2]}')
gx = cv2.Sobel(z_img, cv2.CV_32F, 1, 0, ksize=13)
print(f'Center pixel intensity (gx): {gx[z_px_rows // 2, z_px_cols // 2]}')
gy = cv2.Sobel(z_img, cv2.CV_32F, 0, 1, ksize=13)
print(f'Center pixel intensity (gy): {gy[z_px_rows // 2, z_px_cols // 2]}')
mag, _ = cv2.cartToPolar(gx, gy)
print(f'Center pixel intensity (homebrew sobel): {mag[z_px_rows // 2, z_px_cols // 2]}')
native_sobel = cv2.Sobel(z_img, cv2.CV_32F, 1, 1, ksize=13)
print(f'Center pixel intensity (native sobel): {native_sobel[z_px_rows // 2, z_px_cols // 2]}')
这里我使用的是 32 位浮点图像,其中最小值为 0.0,最大值约为 600.0。其输出是:
Center pixel intensity (original): 537.156982421875
Center pixel intensity (gx): -220087.90625
Center pixel intensity (gy): 350005.25
Center pixel intensity (homebrew sobel): 413451.78125
Center pixel intensity (native sobel): 16357.7548828125
显然,事情有点不对劲。我希望最后两个值相同(不是确切地相同,但绝对接近)。我尝试将图像中的像素标准化到 [0, 1] 范围内,但这没有帮助。我尝试将图像转换为 8 位无符号格式,但也无济于事。我对导致这种差异的实施有什么误解?
【问题讨论】:
标签: python opencv derivative sobel