{l}试图理解卷积。在
根据documentation,Sobel核是
-1 0 1
-2 0 2
-1 0 1
因此,我尝试将其应用于以下img
(一个二进制3x3
数组):
现在,我有一个问题来解释输出。我用手工计算得到了不同的结果。据我所知,我必须将核心放在每个像素的中心,然后乘以元素和。在
因此,输出中的第一个条目应该是2
。程序返回0
。在
我错了吗?我希望如此。在
编码
import cv2
import numpy as np
img = np.array([[0,1,0],[1,0,1],[0,1,0]]).astype(float)
# Output dtype = cv2.CV_8U
sobelx8u = cv2.Sobel(img,cv2.CV_8U,1,0,ksize=3)
# Output dtype = cv2.CV_64F. Then take its absolute and convert to cv2.CV_8U
sobelx64f = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
abs_sobel64f = np.absolute(sobelx64f)
sobel_8u = np.uint8(abs_sobel64f)
print 'img'
print img
print 'sobelx8u'
print sobelx8u
print 'sobelx64f'
print sobelx64f
print 'abs_sobel64f'
print abs_sobel64f
print 'sobel_8u'
print sobel_8u
输出
img
[[ 0. 1. 0.]
[ 1. 0. 1.]
[ 0. 1. 0.]]
sobelx8u
[[0 0 0]
[0 0 0]
[0 0 0]]
sobelx64f
[[ 0. 0. 0.]
[ 0. 0. 0.]
[ 0. 0. 0.]]
abs_sobel64f
[[ 0. 0. 0.]
[ 0. 0. 0.]
[ 0. 0. 0.]]
sobel_8u
[[0 0 0]
[0 0 0]
[0 0 0]]
阅读documentation页面的第二段:
让它像你期望的那样工作
为了使它像您预期的那样工作,您必须明确指定要用零值来插值边界。像这样:
输出:
^{pr2}$默认边框类型
borderType
的默认值是BORDER_DEFAULT
,这在我的机器上与BORDER_REFLECT_101
相同。您可以运行此脚本在您的计算机上进行确认:输出:
并且
BORDER_REFLECT_101
的工作方式与您的结果完全一致。以下是不同边框类型的说明:解释你得到了什么
因此,默认的边界插值类型(即
BORDER_REFLECT_101
)使数组在计算之前看起来像这样:通过简单的算法,您可以确认将Sobel内核应用于内部3x3像素后的正确值都是零–这就是通过运行脚本得到的结果。在
相关问题 更多 >
编程相关推荐