scikit-image
77 строк · 3.0 Кб
1#cython: cdivision=True
2#cython: boundscheck=False
3#cython: nonecheck=False
4#cython: wraparound=False
5cimport numpy as cnp
6
7cnp.import_array()
8
9
10def _censure_dob_loop(Py_ssize_t n,
11cnp.float64_t[:, ::1] integral_img,
12cnp.float64_t[:, ::1] filtered_image,
13cnp.float64_t inner_weight, cnp.float64_t outer_weight):
14# This function calculates the value in the DoB filtered image using
15# integral images. If r = right. l = left, u = up, d = down, the sum of
16# pixel values in the rectangle formed by (u, l), (u, r), (d, r), (d, l)
17# is calculated as I(d, r) + I(u - 1, l - 1) - I(u - 1, r) - I(d, l - 1).
18
19cdef Py_ssize_t i, j
20cdef cnp.float64_t inner, outer
21cdef Py_ssize_t n2 = 2 * n
22cdef cnp.float64_t total_weight = inner_weight + outer_weight
23
24with nogil:
25
26# top-left pixel
27inner = (integral_img[n2 + n, n2 + n]
28+ integral_img[n2 - n - 1, n2 - n - 1]
29- integral_img[n2 + n, n2 - n - 1]
30- integral_img[n2 - n - 1, n2 + n])
31
32outer = integral_img[2 * n2, 2 * n2]
33
34filtered_image[n2, n2] = (outer_weight * outer
35- total_weight * inner)
36
37# left column
38for i in range(n2 + 1, integral_img.shape[0] - n2):
39inner = (integral_img[i + n, n2 + n]
40+ integral_img[i - n - 1, n2 - n - 1]
41- integral_img[i + n, n2 - n - 1]
42- integral_img[i - n - 1, n2 + n])
43
44outer = (integral_img[i + n2, 2 * n2]
45- integral_img[i - n2 - 1, 2 * n2])
46
47filtered_image[i, n2] = (outer_weight * outer
48- total_weight * inner)
49
50# top row
51for j in range(n2 + 1, integral_img.shape[1] - n2):
52inner = (integral_img[n2 + n, j + n]
53+ integral_img[n2 - n - 1, j - n - 1]
54- integral_img[n2 + n, j - n - 1]
55- integral_img[n2 - n - 1, j + n])
56
57outer = (integral_img[2 * n2, j + n2]
58- integral_img[2 * n2, j - n2 - 1])
59
60filtered_image[n2, j] = (outer_weight * outer
61- total_weight * inner)
62
63# remaining block
64for i in range(n2 + 1, integral_img.shape[0] - n2):
65for j in range(n2 + 1, integral_img.shape[1] - n2):
66inner = (integral_img[i + n, j + n]
67+ integral_img[i - n - 1, j - n - 1]
68- integral_img[i + n, j - n - 1]
69- integral_img[i - n - 1, j + n])
70
71outer = (integral_img[i + n2, j + n2]
72+ integral_img[i - n2 - 1, j - n2 - 1]
73- integral_img[i + n2, j - n2 - 1]
74- integral_img[i - n2 - 1, j + n2])
75
76filtered_image[i, j] = (outer_weight * outer
77- total_weight * inner)
78