scikit-image

Форк
0
/
censure_cy.pyx 
77 строк · 3.0 Кб
1
#cython: cdivision=True
2
#cython: boundscheck=False
3
#cython: nonecheck=False
4
#cython: wraparound=False
5
cimport numpy as cnp
6

7
cnp.import_array()
8

9

10
def _censure_dob_loop(Py_ssize_t n,
11
                      cnp.float64_t[:, ::1] integral_img,
12
                      cnp.float64_t[:, ::1] filtered_image,
13
                      cnp.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

19
    cdef Py_ssize_t i, j
20
    cdef cnp.float64_t inner, outer
21
    cdef Py_ssize_t n2 = 2 * n
22
    cdef cnp.float64_t total_weight = inner_weight + outer_weight
23

24
    with nogil:
25

26
        # top-left pixel
27
        inner = (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

32
        outer = integral_img[2 * n2, 2 * n2]
33

34
        filtered_image[n2, n2] = (outer_weight * outer
35
                                  - total_weight * inner)
36

37
        # left column
38
        for i in range(n2 + 1, integral_img.shape[0] - n2):
39
            inner = (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

44
            outer = (integral_img[i + n2, 2 * n2]
45
                     - integral_img[i - n2 - 1, 2 * n2])
46

47
            filtered_image[i, n2] = (outer_weight * outer
48
                                     - total_weight * inner)
49

50
        # top row
51
        for j in range(n2 + 1, integral_img.shape[1] - n2):
52
            inner = (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

57
            outer = (integral_img[2 * n2, j + n2]
58
                     - integral_img[2 * n2, j - n2 - 1])
59

60
            filtered_image[n2, j] = (outer_weight * outer
61
                                     - total_weight * inner)
62

63
        # remaining block
64
        for i in range(n2 + 1, integral_img.shape[0] - n2):
65
            for j in range(n2 + 1, integral_img.shape[1] - n2):
66
                inner = (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

71
                outer = (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

76
                filtered_image[i, j] = (outer_weight * outer
77
                                        - total_weight * inner)
78

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.