Android Open Source - ImageFilter Median Filter






From Project

Back to project page ImageFilter.

License

The source code is released under:

GNU General Public License

If you think the Android project ImageFilter listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package ca.tannerrutgers.ImageFilter.models;
//from  w  w w  .  ja  va2s. c om
import android.graphics.Bitmap;
import android.graphics.Color;
import ca.tannerrutgers.ImageFilter.utils.BitmapUtils;

import java.util.ArrayList;
import java.util.Collections;

/**
 * Created by Tanner on 1/18/14.
 */
public class MedianFilter extends ImageFilter {

    public MedianFilter(Bitmap image) {
        super(image);
    }

    public MedianFilter(Bitmap image, int size) {
        super(image, size);
    }

    @Override
    public Bitmap applyFilter() {

        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int offset = maskSize/2;

        // Retrieve pixels of bitmap for efficiency
        int[] pixels = BitmapUtils.getPixels(bitmap);

        // Iterate over all pixels of image determine new values
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {

                // If filtering has been asked to cancel, stop filtering
                if (cancelFiltering) {
                    return null;
                }

                ArrayList<Integer> reds = new ArrayList<Integer>(offset);
                ArrayList<Integer> greens = new ArrayList<Integer>(offset);
                ArrayList<Integer> blues = new ArrayList<Integer>(offset);
                ArrayList<Integer> alphas = new ArrayList<Integer>(offset);

                // Retrieve mask pixels and calculate median value for new pixel
                // This is done primitively for efficiency
                for (int row = y-offset; row <= y+offset; row++) {
                    for (int col = x-offset; col <= x+offset; col++) {
                        if (row >= 0 && col >= 0 && row < height && col < width) {

                            int color = pixels[row*width+col];

                            reds.add(Color.red(color));
                            greens.add(Color.green(color));
                            blues.add(Color.blue(color));
                            alphas.add(Color.alpha(color));
                        }
                    }
                }

                int red = getMedian(reds);
                int green = getMedian(greens);
                int blue = getMedian(blues);
                int alpha = getMedian(alphas);

                pixels[y*width+x] = Color.argb(alpha,red,green,blue);
            }
        }
        return Bitmap.createBitmap(pixels,width,height,bitmap.getConfig());
    }

    /**
     * Returns the median value of the passed value list
     */
    private int getMedian(ArrayList<Integer> values) {
        Collections.sort(values);
        int size = values.size();

        if (size % 2 != 0) {
            return values.get(size/2);
        } else {
            return (values.get(size/2) + values.get(size/2 - 1))/2;
        }
    }
}




Java Source Code List

ca.tannerrutgers.ImageFilter.activities.MainActivity.java
ca.tannerrutgers.ImageFilter.activities.SettingsActivity.java
ca.tannerrutgers.ImageFilter.dialogs.FilterSelectionDialog.java
ca.tannerrutgers.ImageFilter.dialogs.MaskSizePreference.java
ca.tannerrutgers.ImageFilter.models.ImageFilter.java
ca.tannerrutgers.ImageFilter.models.MeanFilter.java
ca.tannerrutgers.ImageFilter.models.MedianFilter.java
ca.tannerrutgers.ImageFilter.utils.BitmapUtils.java