如何在OpenCV中找到x和y渐变?

时间:2013-11-16 03:16:03

标签: c++ opencv image-processing

我正在尝试实现定向渐变直方图的自定义版本。我的渐变内核是[-1.2 0 1.2]。必须在x和y方向(沿着行和沿着列)应用此内核,以在x和y方向上找到图像渐变G x 和G y 。 / p>

在Matlab中,这就像

hx = [-1.2 0 1.2]
hy = hx'                        %transpose
Gx = imfilter(double(I),hx)     %Gx is the gradient along x, I is the image
Gy = imfilter(double(I),hy)     %Gy is the gradient along y

我如何在OpenCV中执行此操作?我看了创建createSeparableLinearFilter,但它似乎给出了某种Gx和Gy的总和。我需要分别找到Gx和Gy。 我正在寻找像

这样的东西
Ptr<FilterEngine> Fx = createRowFilter(...);
Ptr<FilterEngine> Fy = createColumnFilter(...);
Fx->apply(img, Gx, ...);  //Gx is x gradient, Gx and Gy are float or double
Fy->apply(img, Gy, ...);  //Gy is y gradient

当然这可以通过编写我自己的for循环,访问每个像素来完成,但我想知道是否有任何OpenCV方法来做到这一点。

2 个答案:

答案 0 :(得分:2)

我认为你在寻找 filter2D

每次使用不同的内核时都会使用它。

Mathai的解决方案:

float kernelY[9] = {0,-1.0,0,0,0,0,0,1.0,0};
float kernelX[9] = {0,0,0,-1.0,0,1.0,0,0,0};
Mat filterY(3, 3, CV_32F, kernelY);
Mat filterX(3, 3, CV_32F, kernelX);
filter2D(img,dsty,-1 ,filterY, Point( -1, -1 ),0, BORDER_DEFAULT );
filter2D(img,dstx,-1 ,filterX, Point( -1, -1 ),0, BORDER_DEFAULT );

答案 1 :(得分:2)

关注this tutorial制作自己的自定义内核。我认为您需要为OpenCV创建一个NxN内核才能正确识别它(对hx; hx; hx来说基本上是Gx。)

HTH