Pillow
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
18Imaging
19ImagingModeFilter(Imaging im, int size) {20Imaging imOut;21int x, y, i;22int xx, yy;23int maxcount;24UINT8 maxpixel;25int histogram[256];26
27if (!im || im->bands != 1 || im->type != IMAGING_TYPE_UINT8) {28return (Imaging)ImagingError_ModeError();29}30
31imOut = ImagingNewDirty(im->mode, im->xsize, im->ysize);32if (!imOut) {33return NULL;34}35
36size = size / 2;37
38for (y = 0; y < imOut->ysize; y++) {39UINT8 *out = &IMAGING_PIXEL_L(imOut, 0, y);40for (x = 0; x < imOut->xsize; x++) {41/* calculate histogram over current area */42
43/* FIXME: brute force! to improve, update the histogram44incrementally. may also add a "frequent list", like in
45the old implementation, but I'm not sure that's worth
46the added complexity... */
47
48memset(histogram, 0, sizeof(histogram));49for (yy = y - size; yy <= y + size; yy++) {50if (yy >= 0 && yy < imOut->ysize) {51UINT8 *in = &IMAGING_PIXEL_L(im, 0, yy);52for (xx = x - size; xx <= x + size; xx++) {53if (xx >= 0 && xx < imOut->xsize) {54histogram[in[xx]]++;55}56}57}58}59
60/* find most frequent pixel value in this region */61maxpixel = 0;62maxcount = histogram[maxpixel];63for (i = 1; i < 256; i++) {64if (histogram[i] > maxcount) {65maxcount = histogram[i];66maxpixel = (UINT8)i;67}68}69
70if (maxcount > 2) {71out[x] = maxpixel;72} else {73out[x] = IMAGING_PIXEL_L(im, x, y);74}75}76}77
78ImagingCopyPalette(imOut, im);79
80return imOut;81}
82