Pillow

Форк
0
/
ModeFilter.c 
81 строка · 2.2 Кб
1
/*
2
 * The Python Imaging Library
3
 * $Id$
4
 *
5
 * mode filter
6
 *
7
 * history:
8
 * 2002-06-08 fl    Created (based on code from IFUNC95)
9
 * 2004-10-05 fl    Rewritten; use a simpler brute-force algorithm
10
 *
11
 * Copyright (c) Secret Labs AB 2002-2004.  All rights reserved.
12
 *
13
 * See the README file for information on usage and redistribution.
14
 */
15

16
#include "Imaging.h"
17

18
Imaging
19
ImagingModeFilter(Imaging im, int size) {
20
    Imaging imOut;
21
    int x, y, i;
22
    int xx, yy;
23
    int maxcount;
24
    UINT8 maxpixel;
25
    int histogram[256];
26

27
    if (!im || im->bands != 1 || im->type != IMAGING_TYPE_UINT8) {
28
        return (Imaging)ImagingError_ModeError();
29
    }
30

31
    imOut = ImagingNewDirty(im->mode, im->xsize, im->ysize);
32
    if (!imOut) {
33
        return NULL;
34
    }
35

36
    size = size / 2;
37

38
    for (y = 0; y < imOut->ysize; y++) {
39
        UINT8 *out = &IMAGING_PIXEL_L(imOut, 0, y);
40
        for (x = 0; x < imOut->xsize; x++) {
41
            /* calculate histogram over current area */
42

43
            /* FIXME: brute force! to improve, update the histogram
44
               incrementally.  may also add a "frequent list", like in
45
               the old implementation, but I'm not sure that's worth
46
               the added complexity... */
47

48
            memset(histogram, 0, sizeof(histogram));
49
            for (yy = y - size; yy <= y + size; yy++) {
50
                if (yy >= 0 && yy < imOut->ysize) {
51
                    UINT8 *in = &IMAGING_PIXEL_L(im, 0, yy);
52
                    for (xx = x - size; xx <= x + size; xx++) {
53
                        if (xx >= 0 && xx < imOut->xsize) {
54
                            histogram[in[xx]]++;
55
                        }
56
                    }
57
                }
58
            }
59

60
            /* find most frequent pixel value in this region */
61
            maxpixel = 0;
62
            maxcount = histogram[maxpixel];
63
            for (i = 1; i < 256; i++) {
64
                if (histogram[i] > maxcount) {
65
                    maxcount = histogram[i];
66
                    maxpixel = (UINT8)i;
67
                }
68
            }
69

70
            if (maxcount > 2) {
71
                out[x] = maxpixel;
72
            } else {
73
                out[x] = IMAGING_PIXEL_L(im, x, y);
74
            }
75
        }
76
    }
77

78
    ImagingCopyPalette(imOut, im);
79

80
    return imOut;
81
}
82

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

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

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

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