0

画像内のパッチの方向勾配のヒストグラムを実装する必要があります (画像全体に対して 1 つの HOG ではなく、パッチごとに 1 つの HOG 特徴ベクトル)。このリンクでMatlabコードを使用し、コードをopencv pythonに変換しています。目的に合わせていくつかの変更を加えました。Matlab と Python コードの主な違いの 1 つは、各セルの勾配を取得する方法にありますが、Matlab では上記のリンクで使用されているようにfilter2を使用しています。 Opencv ではSobel演算子を使用します。私の問題は、これら 2 つの方法が生成する勾配が異なり、修正に苦労したことです。画像とカーネルの数値表現の両方を変更してみました。また、 opencvでfilter2Dを使用してみました。これもimfilterですMatlabで、しかし基本的にどれも機能しませんでした。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 でアンチエイリアシングを無効にしましたが、サイズ変更された 2 つの画像は完全には一致しません。以下は、Matlab のテスト イメージのサイズ変更されたイメージの一部です。 ここに画像の説明を入力

これは OpenCV の同じ部分です。 ここに画像の説明を入力

2番目の編集:丸めが発生する方法がこの違いを引き起こすことがわかりました。そこで、OpenCV コードを次のように変更しました。

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

そしてMatlab:

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

そして今、両方とも同じ結果が得られます。 ここに画像の説明を入力

問題は導関数によるものだと思います。OpenCV で cv2.filter2D を確認しましたが、結果は異なります。誰かが問題の原因についてのヒントを教えてくれることを願っています。

4

0 に答える 0