Changeset 2807 for libpipi/trunk


Ignore:
Timestamp:
Aug 29, 2008, 11:55:21 PM (12 years ago)
Author:
Sam Hocevar
Message:
  • median.c: use the libc's qsort to find the median value. Not really the best method anyway (see the research notes on the wiki), but now X = 8 is faster than the previous implementation's X = 6.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libpipi/trunk/pipi/filter/median.c

    r2748 r2807  
    2828#include "pipi_internals.h"
    2929
     30static int cmpint(void const *i1, void const *i2)
     31{
     32    return *(int const *)i1 > *(int const *)i2;
     33}
     34
    3035pipi_image_t *pipi_median(pipi_image_t *src, int radius)
    3136{
     
    4651    float *srcdata, *dstdata;
    4752    double *list;
    48     int x, y, w, h, i, j, k, size, gray;
     53    int x, y, w, h, i, j, size, gray;
    4954
    5055    w = src->w;
     
    6974        for(x = 0; x < w; x++)
    7075        {
    71             double tmp;
    7276            double *parser = list;
    7377
     
    9195                    else
    9296                    {
    93                         *parser++ = srcdata[4 * (y2 * w + x2)];
    94                         *parser++ = srcdata[4 * (y2 * w + x2) + 1];
    95                         *parser++ = srcdata[4 * (y2 * w + x2) + 2];
    96                         *parser++ = srcdata[4 * (y2 * w + x2) + 3];
     97                        parser[0] = srcdata[4 * (y2 * w + x2)];
     98                        parser[size * 1] = srcdata[4 * (y2 * w + x2) + 1];
     99                        parser[size * 2] = srcdata[4 * (y2 * w + x2) + 2];
     100                        parser[size * 3] = srcdata[4 * (y2 * w + x2) + 3];
     101                        parser++;
    97102                    }
    98103                }
     
    100105
    101106            /* Sort the list */
    102             for(i = 0; i < size; i++)
     107            qsort(list, size, sizeof(int), cmpint);
     108            if(!gray)
    103109            {
    104                 for(j = 0; j < i; j++)
    105                 {
    106                     if(gray)
    107                     {
    108                         if(list[i] < list[j])
    109                         {
    110                             tmp = list[i];
    111                             list[i] = list[j];
    112                             list[j] = tmp;
    113                         }
    114                     }
    115                     else
    116                     {
    117                         for(k = 0; k < 4; k++)
    118                         {
    119                             if(list[4 * i + k] < list[4 * j + k])
    120                             {
    121                                 tmp = list[4 * i + k];
    122                                 list[4 * i + k] = list[4 * j + k];
    123                                 list[4 * j + k] = tmp;
    124                             }
    125                         }
    126                     }
    127                 }
     110                qsort(list + size, size, sizeof(int), cmpint);
     111                qsort(list + 2 * size, size, sizeof(int), cmpint);
     112                qsort(list + 3 * size, size, sizeof(int), cmpint);
    128113            }
    129114
     
    135120            else
    136121            {
    137                 dstdata[4 * (y * w + x)] = list[size / 2 * 4];
    138                 dstdata[4 * (y * w + x) + 1] = list[size / 2 * 4 + 1];
    139                 dstdata[4 * (y * w + x) + 2] = list[size / 2 * 4 + 2];
    140                 dstdata[4 * (y * w + x) + 3] = list[size / 2 * 4 + 3];
     122                dstdata[4 * (y * w + x)] = list[size / 2];
     123                dstdata[4 * (y * w + x) + 1] = list[size / 2 + size * 1];
     124                dstdata[4 * (y * w + x) + 2] = list[size / 2 + size * 2];
     125                dstdata[4 * (y * w + x) + 3] = list[size / 2 + size * 3];
    141126            }
    142127        }
Note: See TracChangeset for help on using the changeset viewer.