pip安装cython之后,将下面代码写入hogtest2.pyx文件(我通过改文件后缀新建)

import numpy as np
from PIL import Image
cimport numpy as np
cimport cython cdef extern from "math.h":
double sqrt(double i)
double fabs(double i)
double floor(double i) cpdef hog(im, int sbin = 8): cdef np.ndarray[np.double_t, ndim=3] data, feat
cdef np.ndarray[np.double_t, ndim=1] hist, norm cdef int blocks0, blocks1
cdef int out0, out1, out2
cdef int visible0, visible1 cdef double dy, dx, v
cdef double dy2, dx2, v2
cdef double dy3, dx3, v3
cdef double best_dot, dot
cdef int best_o cdef double xp, yp, vx0, vy0, vx1, vy1
cdef int ixp, iyp
cdef double n1, n2, n3, n4, t1, t2, t3, t4, h1, h2, h3, h4
cdef int p cdef np.ndarray[np.double_t, ndim=1] uu
uu = 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] vv
vv = 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 0
cdef unsigned int cc0, cc1, cc2 cdef int x, y, o, q
cdef int dstptr, srcptr width, height = im.size
blocks0 = height / sbin
blocks1 = width / sbin out0 = blocks0 - 2
out1 = blocks1 - 2
out2 = 9 + 4 visible0 = blocks0 * sbin
visible1 = blocks1 * sbin data = 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 * dy dy2 = 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 * dy2 dy3 = 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 * dy3 if v2 > v: # pick channel with strongest gradient
v = v2
dx = dx2
dy = dy2
if v3 > v:
v = v3
dx = dx3
dy = dy3 # snap to one of 9 orientations
best_dot = 0.
best_o = 0
for o from 0 <= o < 9:
dot = fabs(uu[o] * dx + vv[o] * dy)
if dot > best_dot:
best_dot = dot
best_o = o # add to 4 histograms around pixel using linear interpolation
xp = (<double>(x) + 0.5) / <double>(sbin) - 0.5
yp = (<double>(y) + 0.5) / <double>(sbin) - 0.5 ixp = <int>floor(xp)
iyp = <int>floor(yp) vx0 = xp - ixp
vy0 = yp - iyp
vx1 = 1.0 - vx0
vy1 = 1.0 - vy0
v = sqrt(v) if ixp >= 0 and iyp >= 0:
hist[ixp * blocks0 + iyp + best_o*blocks0*blocks1] += vx1 * vy1 * v
if ixp + 1 < blocks1 and iyp >= 0:
hist[(ixp + 1) * blocks0 + iyp + best_o*blocks0*blocks1] += vx0 * vy1 * v
if ixp >= 0 and iyp + 1 < blocks0:
hist[ixp * blocks0 + (iyp + 1) + best_o*blocks0*blocks1] += vx1 * vy0 * v
if 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 orientations
for 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 + 1
n1 = 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 + 1
n3 = 1.0 / sqrt(norm[p] + norm[p+1] + norm[p+blocks0] + norm[p+blocks0+1] + eps)
p = x * blocks0 + y
n4 = 1.0 / sqrt(norm[p] + norm[p+1] + norm[p+blocks0] + norm[p+blocks0+1] + eps) t1 = 0
t2 = 0
t3 = 0
t4 = 0 srcptr = (x+1) * blocks0 + y + 1
for o from 0 <= o < 9:
h1 = hist[srcptr] * n1
h2 = hist[srcptr] * n2
h3 = hist[srcptr] * n3
h4 = hist[srcptr] * n4
# for some reason, gcc will not automatically inline
# the min function here, so we just do it ourselves
# for impressive speedups
if h1 > 0.2:
h1 = 0.2
if h2 > 0.2:
h2 = 0.2
if h3 > 0.2:
h3 = 0.2
if h4 > 0.2:
h4 = 0.2
feat[y, x, o] = 0.5 * (h1 + h2 + h3 + h4)
t1 += h1
t2 += h2
t3 += h3
t4 += h4
srcptr += blocks0 * blocks1 feat[y, x, 9] = 0.2357 * t1
dstptr += out0 * out1
feat[y, x, 10] = 0.2357 * t2
dstptr += out0 * out1
feat[y, x, 11] = 0.2357 * t3
dstptr += out0 * out1
feat[y, x, 12] = 0.2357 * t4 return feat cpdef hogpad(np.ndarray[np.double_t, ndim=3] hog):
cdef np.ndarray[np.double_t, ndim=3] out
cdef int i, j, k
cdef 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 out cpdef 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) * binsize
bin += (<int>data[j,i,2]) / (256/binsize) * binsize * binsize
hist[bin] += 1
return hist cpdef rgbmean(im):
"""
Computes mean and covariances of RGB colors.
"""
cdef int w = im.size[0], h = im.size[1]
cdef double r, g, b
cdef 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] += r
out[1] += g
out[2] += b out[3] += r * r
out[4] += r * g
out[5] += r * b out[6] += g * g
out[7] += g * b out[8] += b * b
return out / (w * h)

然后,新建setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy
setup(name='hog2',
ext_modules=cythonize("hogtest2.pyx"),
include_dirs=[numpy.get_include()]
)

cmd 运行 python setup.py build

继续运行python setup.py install

将运行后出现的build文件夹中的pyd后缀文件放到python的LIB\sit-packages里,或者放在待会要跑的py文件同目录下

我新建了一个test.py

from PIL import Image
import hogtest2
img = Image.open("cat.jpg")
hogtest2.hog(img)
a=hogtest2.rgbmean(img)
print(a)

是可用的

HOG代码来自这里(做了一丢丢修改)

hog cython的更多相关文章

  1. 特征检测之HOG

    参考: http://blog.csdn.net/liulina603/article/details/8291093 http://blog.csdn.net/woxincd/article/det ...

  2. libsvm Minist Hog 手写体识别(源码文件)

    以上是我上一篇文章中的代码实现,里面分别用了opencv中的SVM和LibSVM,opencv的SVM用起来更方便,但貌似内部其实也是基于Libsvm,同样的参数训练出来的结果是一致的,里面有Libs ...

  3. libsvm Minist Hog 手写体识别

    统计手写数字集的HOG特征 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ 这篇文章是模式识别的小作业,利用sv ...

  4. 这是啥-Cython语言简单介绍

    Cython是一种既可以编写c又可以编写python的编程语言,他的目标是成为一个python语言的超集,为python提供高层次的.面向对象的.函数化.动态编程功能.不同于纯粹的python,它提供 ...

  5. HoG

    实现步骤 先计算每一个像素点位置上x和y方向上的梯度. 这样在每一个像素点位置上得到一个二维向量, 计算它的方向和模长 将图片分为一个个的cell, 如\(8\times 8\). 计算它的HOG: ...

  6. matlab实现hog特征

    %%matlab实现hog特征 %修改自http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html %input: img %outp ...

  7. OpenCV人形检测Hog

    #include "iostream" #include "queue" using namespace std; #include "opencv2 ...

  8. 【HOG】

    http://blog.csdn.net/masibuaa/article/details/12917961 把这份资料大概看完了 大概了解Hog了

  9. 学习OpenCV——HOG+SVM

    #include "cv.h" #include "highgui.h" #include "stdafx.h" #include < ...

随机推荐

  1. Asp.netCore之安装centos7 资料收集

    虚拟机的安装和centos的安装看博友的文章:https://www.cnblogs.com/zhaopei/p/netcore.html ifconfig 在centons中用终端写命令比较费劲,可 ...

  2. Linux系统安装nodejs

    参考文档 官网连接 镜像连接 安装方法有三种: 1. 源码安装(耗时) 2. apt-get / yum 安装(版本比较低) 3. 解压后创建软连接(推荐) 方法一. 1 ) 指定目录下下载源码包 $ ...

  3. DBA角色职责

    MySQL DBA分架构DBA,运维DBA和开发DBA三种角色,职责介绍如下: MySQL数据库系统日常管理职责 日常管理的主要职责是对MySQL服务器程序mysqld的运行情况进行管理,使数据库用户 ...

  4. <6>Cocos Creator​​​​​​​调试

    高手在于调试,下面来谈Cocos Creator调试! 1. 网页平台调试 调试常见的三种形式为调试打印.运行时报错与断点调试,这里主要利用编辑器"VS Code"与"C ...

  5. python ---多进程 Multiprocessing

    和 threading 的比较 多进程 Multiprocessing 和多线程 threading 类似, 他们都是在 python 中用来并行运算的. 不过既然有了 threading, 为什么 ...

  6. .NET Core Tools for Visual Studio 2015 安装失败

    You may be blocked from installing the .NET Core Tooling Preview 2 for Visual Studio 2015 installer ...

  7. Nginx技术研究系列3-OpenResty安装配置

    上两篇中介绍了: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 Ngnix技术研究系列2-基于Redis实现动态路由 发现,应该加一篇OpenResty的安装部署说明,方便大家按图索骥 ...

  8. spring boot: ConfigurationProperties

    读取配置信息 1.5 之前 @Component @ConfigurationProperties(prefix = "user", locations= {"class ...

  9. python os.path.dirname()

    ----返回文件所在的路径 ----如果path变量直接是文件名则返回空

  10. linux下安装mysql(rpm文件安装)

    数据库包下载: https://www.mysql.com/downloads/ 在GPL开原协议的社区开源版里边下载 我们用mysql community server里边的 其中workbench ...