Matlab filter2和opencv sobel产生不同的图像梯度

时间:2016-12-29 17:49:26

标签: python matlab opencv gradient sobel

我需要为图像中的补丁实现定向梯度的直方图(每个补丁一个HOG特征向量,而不是整个图像的一个HOG)。我一直在this link使用Matlab代码并将代码翻译成opencv python。我做了一些修改以适应我的目的,Matlab和Python代码之间的主要区别之一是我得到每个单元格的渐变,而在Matlab中我使用 filter2 作为用于上面的链接,在Opencv中我使用 Sobel 运算符。我的问题是这两种方法产生的渐变是不同的,我很难修复它。我尝试改变图像和内核数值表示。我也尝试在opencv中使用 filter2D ,在Matlab中也使用 imfilter ,但基本上没有一个工作。以下是使用 filter2 计算梯度的Matlab代码:

blockSize=26;
cellSize=floor(blockSize/2);
cellPerBlock=4;
numBins=9;
dim = [444,262];
RGB = imread('testImage.jpg');
img= rgb2gray(RGB);

img = imresize(img, [262,444], 'bilinear', 'Antialiasing',false);

%operators 
hx = [-1,0,1];
hy = [-1;0;1] ;

%derivatives 
dx = filter2(hx, double(img));
dy = filter2(hy, double(img));

% Remove the 1 pixel border.
dx = dx(2 : (size(dx, 1) - 1), 2 : (size(dx, 2) - 1));
dy = dy(2 : (size(dy, 1) - 1), 2 : (size(dy, 2) - 1)); 

% Convert the gradient vectors to polar coordinates (angle and magnitude).
ang = atan2(dy, dx);
ang(ang < 0) = ang(ang < 0)+ pi;
mag = ((dy.^2) + (dx.^2)).^.5;

这是我使用 Sobel 运算符编写的Python OpenCV版本:

blockSize=26
cellSize=int(blockSize/2)
cellPerBlock=4
numBins=9
dim = (444,262)
angDiff=10**-6
img = cv2.imread('3132 2016-04-25 12-35-43-53991.jpg',0)
img = cv2.resize(img, dim, interpolation = cv2.INTER_LINEAR)

sobelx = cv2.Sobel(img.astype(float),cv2.CV_64F,1,0,ksize=1)
sobelx = sobelx[1 : np.shape(sobelx)[0] - 1, 1 : np.shape(sobelx)[1] - 1]

sobely = cv2.Sobel(img.astype(float),cv2.CV_64F,0,1,ksize=1)
sobely = sobely[1 : np.shape(sobely)[0] - 1, 1 : np.shape(sobely)[1] - 1]

mag, ang = cv2.cartToPolar(sobelx, sobely)
ang[ang>np.pi+angDiff]= ang[ang>np.pi+angDiff] - np.pi

编辑我已经关注帖子HERE,在Matlab中使用双线性方法,在OpenCV中使用cv2.INTER_LINEAR,以及在Matlab中停用Antialiasing,但两个已调整大小的图像仍然不完全匹配。以下是Matlab中测试图像的大小调整后的图像的一部分: enter image description here

这与OpenCV相同: enter image description here

第二次编辑:事实证明舍入发生的方式导致了这种差异。所以,我将我的OpenCV代码更改为:

img = cv2.resize(img.astype(float), dim, interpolation = cv2.INTER_LINEAR)

和Matlab:

imresize(double(img), [262,444], 'bilinear', 'Antialiasing',false);

现在两个都给了我相同的结果。 enter image description here

我认为问题是由衍生方法引起的。我在OpenCV中检查了cv2.filter2D,但结果仍然不同。我希望有人能给我一些可能导致问题的暗示。

0 个答案:

没有答案