关于HOG特征的一个Python代码
生活随笔
收集整理的這篇文章主要介紹了
关于HOG特征的一个Python代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關于HOG特征的一個Python代碼,如下所示:
import numpy as np import Image cimport numpy as np cimport cythoncdef extern from "math.h":double sqrt(double i)double fabs(double i)double floor(double i)cpdef hog(im, int sbin = 8): """Computes a histogram of oriented gradient features.Adopted from Pedro Felzenszwalb's features.cc"""cdef np.ndarray[np.double_t, ndim=3] data, featcdef np.ndarray[np.double_t, ndim=1] hist, normcdef int blocks0, blocks1cdef int out0, out1, out2cdef int visible0, visible1cdef double dy, dx, vcdef double dy2, dx2, v2cdef double dy3, dx3, v3cdef double best_dot, dotcdef int best_ocdef double xp, yp, vx0, vy0, vx1, vy1cdef int ixp, iypcdef double n1, n2, n3, n4, t1, t2, t3, t4, h1, h2, h3, h4cdef int pcdef np.ndarray[np.double_t, ndim=1] uuuu = np.array([ 1.0000, 0.9397, 0.7660, 0.500, 0.1736, -0.1736, -0.5000, -0.7660, -0.9397])cdef np.ndarray[np.double_t, ndim=1] vvvv = np.array([0.0000, 0.3420, 0.6428, 0.8660, 0.9848, 0.9848, 0.8660, 0.6428, 0.3420])cdef double eps = 0.0001 # to avoid division by 0cdef unsigned int cc0, cc1, cc2cdef int x, y, o, qcdef int dstptr, srcptrwidth, height = im.sizeblocks0 = height / sbin blocks1 = width / sbinout0 = blocks0 - 2out1 = blocks1 - 2out2 = 9 + 4visible0 = blocks0 * sbinvisible1 = blocks1 * sbindata = np.asarray(im, dtype=np.double)cc0 = <unsigned int>(0)cc1 = <unsigned int>(1)cc2 = <unsigned int>(2)hist = np.zeros(shape=(blocks0 * blocks1 * 9), dtype=np.double)norm = np.zeros(shape=(blocks0 * blocks1), dtype=np.double)feat = np.zeros(shape=(out0, out1, out2), dtype=np.double)for x from 1 <= x < visible1 - 1:for y from 1 <= y < visible0 - 1:dy = data[y + 1, x, cc0] - data[y - 1, x, cc0]dx = data[y, x + 1, cc0] - data[y, x - 1, cc0]v = dx * dx + dy * dydy2 = data[y + 1, x, cc1] - data[y - 1, x, cc1]dx2 = data[y, x + 1, cc1] - data[y, x - 1, cc1]v2 = dx2 * dx2 + dy2 * dy2dy3 = data[y + 1, x, cc2] - data[y - 1, x, cc2]dx3 = data[y, x + 1, cc2] - data[y, x - 1, cc2]v3 = dx3 * dx3 + dy3 * dy3if v2 > v: # pick channel with strongest gradientv = v2dx = dx2dy = dy2if v3 > v:v = v3dx = dx3dy = dy3# snap to one of 9 orientationsbest_dot = 0.best_o = 0for o from 0 <= o < 9:dot = fabs(uu[o] * dx + vv[o] * dy)if dot > best_dot:best_dot = dotbest_o = o# add to 4 histograms around pixel using linear interpolationxp = (<double>(x) + 0.5) / <double>(sbin) - 0.5 yp = (<double>(y) + 0.5) / <double>(sbin) - 0.5ixp = <int>floor(xp)iyp = <int>floor(yp)vx0 = xp - ixpvy0 = yp - iypvx1 = 1.0 - vx0vy1 = 1.0 - vy0v = sqrt(v)if ixp >= 0 and iyp >= 0:hist[ixp * blocks0 + iyp + best_o*blocks0*blocks1] += vx1 * vy1 * vif ixp + 1 < blocks1 and iyp >= 0:hist[(ixp + 1) * blocks0 + iyp + best_o*blocks0*blocks1] += vx0 * vy1 * vif ixp >= 0 and iyp + 1 < blocks0:hist[ixp * blocks0 + (iyp + 1) + best_o*blocks0*blocks1] += vx1 * vy0 * vif ixp + 1 < blocks1 and iyp + 1 < blocks0:hist[(ixp + 1) * blocks0 + (iyp + 1) + best_o * blocks0 * blocks1] += vx0 * vy0 * v# compute energy in each block by summing over orientationsfor o from 0 <= o < 9:for q from 0 <= q < blocks0 * blocks1:norm[q] += hist[o * blocks0 * blocks1 + q] * hist[o * blocks0 * blocks1 + q] # compute normalized values for x from 0 <= x < out1:for y from 0 <= y < out0:p = (x+1) * blocks0 + y + 1n1 = 1.0 / sqrt(norm[p] + norm[p+1] + norm[p+blocks0] + norm[p+blocks0+1] + eps)p = (x+1) * blocks0 + y n2 = 1.0 / sqrt(norm[p] + norm[p+1] + norm[p+blocks0] + norm[p+blocks0+1] + eps)p = x * blocks0 + y + 1n3 = 1.0 / sqrt(norm[p] + norm[p+1] + norm[p+blocks0] + norm[p+blocks0+1] + eps)p = x * blocks0 + yn4 = 1.0 / sqrt(norm[p] + norm[p+1] + norm[p+blocks0] + norm[p+blocks0+1] + eps)t1 = 0t2 = 0t3 = 0t4 = 0srcptr = (x+1) * blocks0 + y + 1for o from 0 <= o < 9:h1 = hist[srcptr] * n1h2 = hist[srcptr] * n2h3 = hist[srcptr] * n3h4 = hist[srcptr] * n4# for some reason, gcc will not automatically inline# the min function here, so we just do it ourselves# for impressive speedupsif h1 > 0.2:h1 = 0.2if h2 > 0.2:h2 = 0.2if h3 > 0.2:h3 = 0.2if h4 > 0.2:h4 = 0.2feat[y, x, o] = 0.5 * (h1 + h2 + h3 + h4)t1 += h1t2 += h2t3 += h3t4 += h4srcptr += blocks0 * blocks1feat[y, x, 9] = 0.2357 * t1dstptr += out0 * out1feat[y, x, 10] = 0.2357 * t2dstptr += out0 * out1feat[y, x, 11] = 0.2357 * t3dstptr += out0 * out1feat[y, x, 12] = 0.2357 * t4return featcpdef hogpad(np.ndarray[np.double_t, ndim=3] hog):cdef np.ndarray[np.double_t, ndim=3] outcdef int i, j, kcdef int w = hog.shape[0], h = hog.shape[1], z = hog.shape[2]out = np.zeros((w + 2, h + 2, z))for i in range(w):for j in range(h):for k in range(z):out[i+1, j+1, k] = hog[i, j, k]return outcpdef rgbhist(im, int binsize = 8):"""Computes an RGB color histogram with a binsize."""cdef int w = im.size[0], h = im.size[1]cdef np.ndarray[np.uint8_t, ndim=3] data = np.asarray(im)cdef np.ndarray[np.double_t, ndim=1] hist hist = np.zeros(binsize * binsize * binsize)for i from 0 <= i < w:for j from 0 <= j < h:bin = (<int>data[j,i,0]) / (256/binsize)bin += (<int>data[j,i,1]) / (256/binsize) * binsizebin += (<int>data[j,i,2]) / (256/binsize) * binsize * binsizehist[bin] += 1return histcpdef rgbmean(im):"""Computes mean and covariances of RGB colors."""cdef int w = im.size[0], h = im.size[1]cdef double r, g, bcdef np.ndarray[np.uint8_t, ndim=3] data = np.asarray(im)cdef np.ndarray[np.double_t, ndim=1] out = np.zeros(9)for i in range(w):for j in range(h):r = data[j, i, 0] / 255.g = data[j, i, 1] / 255.b = data[j, i, 2] / 255.out[0] += rout[1] += gout[2] += bout[3] += r * r out[4] += r * g out[5] += r * bout[6] += g * gout[7] += g * bout[8] += b * breturn out / (w * h)
from: https://github.com/cvondrick/pyvision/blob/master/vision/features.pyx
總結
以上是生活随笔為你收集整理的关于HOG特征的一个Python代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 精简自己20%的代码
- 下一篇: HOG特征描述算子