package ip.gui.frames;

import java.awt.*;
import java.awt.event.ActionEvent;

public class MorphFrame extends EdgeFrame {


    private Menu morphMenu = getMenu("Morph");
    private Menu morphEdgeMenu = getMenu("Edge");
    private Menu dilateMenu = getMenu("Dilate");
    private Menu erodeMenu = getMenu("Erode");
    private Menu openMorphMenu = getMenu("Open");
    private Menu closeMorphMenu = getMenu("Close");
    private Menu insideContourMenu = getMenu("Inside Contour");
    private Menu outsideContourMenu = getMenu("Outside Contour");
    private Menu middleContourMenu = getMenu("Middle Contour");
    private Menu serraMenu = getMenu("Serra Transform (experimental)");
    private Menu morphColorMenu = getMenu("Color (experimental)");

    private MenuItem dilateh_mi = addMenuItem(dilateMenu, "h");
    private MenuItem dilatev_mi = addMenuItem(dilateMenu, "v");
    private MenuItem dilateSquare_mi = addMenuItem(dilateMenu, "square");
    private MenuItem dilateCross_mi = addMenuItem(dilateMenu, "cross");

    private MenuItem erodeh_mi = addMenuItem(erodeMenu, "h");
    private MenuItem erodeh5_mi = addMenuItem(erodeMenu, "hx5");
    private MenuItem erodev_mi = addMenuItem(erodeMenu, "v");
    private MenuItem erodeSquare_mi = addMenuItem(erodeMenu, "square");
    private MenuItem erodeCross_mi = addMenuItem(erodeMenu, "cross");

    private MenuItem openh_mi = addMenuItem(openMorphMenu, "h");
    private MenuItem openv_mi = addMenuItem(openMorphMenu, "v");
    private MenuItem openSquare_mi = addMenuItem(openMorphMenu, "square");
    private MenuItem openCross_mi = addMenuItem(openMorphMenu, "cross");

    private MenuItem closeh_mi = addMenuItem(closeMorphMenu, "h");
    private MenuItem closev_mi = addMenuItem(closeMorphMenu, "v");
    private MenuItem closeSquare_mi = addMenuItem(closeMorphMenu, "square");
    private MenuItem closeCross_mi = addMenuItem(closeMorphMenu, "cross");

    private MenuItem insideContourh_mi = addMenuItem(insideContourMenu, "h");
    private MenuItem insideContourv_mi = addMenuItem(insideContourMenu, "v");
    private MenuItem insideContourSquare_mi = addMenuItem(insideContourMenu, "square");
    private MenuItem insideContourCross_mi = addMenuItem(insideContourMenu, "cross");

    private MenuItem outsideContourh_mi = addMenuItem(outsideContourMenu, "h");
    private MenuItem outsideContourv_mi = addMenuItem(outsideContourMenu, "v");
    private MenuItem outsideContourSquare_mi = addMenuItem(outsideContourMenu, "square");
    private MenuItem outsideContourCross_mi =
            addMenuItem(outsideContourMenu, "[x]cross");

    private MenuItem middleContourh_mi = addMenuItem(middleContourMenu, "h");
    private MenuItem middleContourv_mi = addMenuItem(middleContourMenu, "v");
    private MenuItem middleContourSquare_mi = addMenuItem(middleContourMenu, "square");
    private MenuItem middleContourCross_mi = addMenuItem(middleContourMenu, "cross");

    private MenuItem serrah_mi = addMenuItem(serraMenu, "h");
    private MenuItem serrav_mi = addMenuItem(serraMenu, "v");
    private MenuItem serraSquare_mi = addMenuItem(serraMenu, "square");
    private MenuItem serraCross_mi = addMenuItem(serraMenu, "cross");

    private MenuItem skeleton_mi = addMenuItem(morphEdgeMenu, "[s]keleton");
    private MenuItem thin_mi = addMenuItem(morphEdgeMenu, "[t]hin");


    private MenuItem hatMorph_mi = addMenuItem(morphEdgeMenu, "hat Morph");

    private MenuItem colorDilateErode_mi = addMenuItem(morphColorMenu, "[E-c]olor Dilate-Erode");
    private MenuItem colorDilate_mi = addMenuItem(morphColorMenu, "[E-d]color Dilate");
    private MenuItem colorErode_mi = addMenuItem(morphColorMenu, "[E-e]color Erode");
    private MenuItem colorOpen_mi = addMenuItem(morphColorMenu, "color open");
    private MenuItem colorClose_mi = addMenuItem(morphColorMenu, "color close");
    private MenuItem colorPyramid_mi = addMenuItem(morphColorMenu, "[p]yramid");

    public void actionPerformed(ActionEvent e) {
        if (match(e, thin_mi)) {
            thin();
            return;
        }

        if (match(e, colorPyramid_mi)) {
            colorPyramid(kSquare);
            return;
        }
        if (match(e, colorOpen_mi)) {
            colorOpen(kSquare);
            return;
        }
        if (match(e, colorClose_mi)) {
            colorClose(kSquare);
            return;
        }
        if (match(e, serraSquare_mi)) {
            serra(kSquare);
            return;
        }

        if (match(e, serrah_mi)) {
            serra(kh);
            return;
        }

        if (match(e, serrav_mi)) {
            serra(kv);
            return;
        }

        if (match(e, serraCross_mi)) {
            serra(kCross);
            return;
        }

        if (match(e, colorErode_mi)) {
            colorErode(kSquare);
            return;
        }
        if (match(e, colorDilate_mi)) {
            colorDilate(kSquare);
            return;
        }
        if (match(e, colorDilateErode_mi)) {
            colorDilateErode(kSquare);
            return;
        }
        if (match(e, skeleton_mi)) {
            skeleton();
            return;
        }
        if (match(e, hatMorph_mi)) {
            hat13v2();
            thresh();
            insideContour(kh);
            return;
        }

        if (match(e, middleContourh_mi)) {
            middleContour(kh);
            return;
        }
        if (match(e, middleContourv_mi)) {
            middleContour(kv);
            return;
        }
        if (match(e, middleContourSquare_mi)) {
            middleContour(kSquare);
            return;
        }
        if (match(e, middleContourCross_mi)) {
            middleContour(kCross);
            return;
        }
        if (match(e, insideContourh_mi)) {
            insideContour(kh);
            return;
        }
        if (match(e, insideContourv_mi)) {
            insideContour(kv);
            return;
        }
        if (match(e, insideContourSquare_mi)) {
            insideContour(kSquare);
            return;
        }
        if (match(e, insideContourCross_mi)) {
            insideContour(kCross);
            return;
        }

        if (match(e, outsideContourh_mi)) {
            outsideContour(kh);
            return;
        }
        if (match(e, outsideContourv_mi)) {
            outsideContour(kv);
            return;
        }
        if (match(e, outsideContourSquare_mi)) {
            outsideContour(kSquare);
            return;
        }
        if (match(e, outsideContourCross_mi)) {
            outsideContour(kCross);
            return;
        }
        if (match(e, openh_mi)) {
            open(kh);
            return;
        }
        if (match(e, openv_mi)) {
            open(kv);
            return;
        }
        if (match(e, openSquare_mi)) {
            open(kSquare);
            return;
        }
        if (match(e, openCross_mi)) {
            open(kCross);
            return;
        }
        if (match(e, closeh_mi)) {
            close(kh);
            return;
        }
        if (match(e, closev_mi)) {
            close(kv);
            return;
        }
        if (match(e, closeSquare_mi)) {
            close(kSquare);
            return;
        }
        if (match(e, closeCross_mi)) {
            close(kCross);
            return;
        }
        if (match(e, erodeCross_mi)) {
            erode(kCross);
            return;
        }
        if (match(e, erodeSquare_mi)) {
            erode(kSquare);
            return;
        }

        if (match(e, erodeh5_mi)) {
            erode(kh);
            erode(kh);
            erode(kh);
            erode(kh);
            erode(kh);
            return;
        }
        if (match(e, erodeh_mi)) {
            erode(kh);
            return;
        }
        if (match(e, erodev_mi)) {
            erode(kv);
            return;
        }
        if (match(e, dilateCross_mi)) {
            dilate(kCross);
            return;
        }
        if (match(e, dilateSquare_mi)) {
            dilate(kSquare);
            return;
        }
        if (match(e, dilateh_mi)) {
            dilate(kh);
            return;
        }
        if (match(e, dilatev_mi)) {
            dilate(kv);
            return;
        }
        super.actionPerformed(e);

    }

    public void colorPyramid(float k[][]) {
        setR(dilategs(erodegs(getR(), k), k));
        setG(dilategs(erodegs(getG(), k), k));
        setB(dilategs(erodegs(getB(), k), k));
        setR(erodegs(dilategs(getR(), k), k));
        setG(erodegs(dilategs(getG(), k), k));
        setB(erodegs(dilategs(getB(), k), k));
        resample(2);
        short2Image();
    }

    public void resample2(int ratio) {
        child = new MorphFrame("MorphFrame");
        ImageFrameInterface frame = getChild();
        int width1 = getImageWidth() / 2;
        frame.setImageWidth(width1);
        ImageFrameInterface frame1 = getChild();
        int height1 = getImageHeight() / 2;
        frame1.setImageHeight(height1);
        getChild().setR(resampleArray(getR(), 2));
        getChild().setG(resampleArray(getG(), 2));
        getChild().setB(resampleArray(getB(), 2));
    }

    public void resample(int ratio) {
        int width1 = getImageWidth() / 2;
        setImageWidth(width1);
        int height1 = getImageHeight() / 2;
        setImageHeight(height1);
        setR(resampleArray(getR(), 2));
        setG(resampleArray(getG(), 2));
        setB(resampleArray(getB(), 2));
    }

    public short[][] resampleArray(short a[][], int ratio) {
        int w = a.length;
        int h = a[0].length;
        int nw = w / ratio;
        int nh = h / ratio;
        short c[][] = new short[nw][nh];
        for (int i = 0; i < w; i++)
            for (int j = 0; j < h; j++)
                c[i / ratio][j / ratio] = a[i][j];
        return c;
    }

    public void colorOpen(float k[][]) {
        setR(dilategs(erodegs(getR(), k), k));
        setG(dilategs(erodegs(getG(), k), k));
        setB(dilategs(erodegs(getB(), k), k));
        short2Image();
    }

    public void colorClose(float k[][]) {
        setR(erodegs(dilategs(getR(), k), k));
        setG(erodegs(dilategs(getG(), k), k));
        setB(erodegs(dilategs(getB(), k), k));
        short2Image();
    }

    public void open(float k[][]) {
        setR(dilate(erode(getR(), k), k));
        copyRedToGreenAndBlue();
        short2Image();
    }

    public void close(float k[][]) {
        setR(erode(dilate(getR(), k), k));
        copyRedToGreenAndBlue();
        short2Image();
    }

    public void serra(float k[][]) {
        setR(erode(getR(), k));
        setG(erode(complement(getG()), kSquare));
        setR(intersect(getR(), getG()));
        copyRedToGreenAndBlue();
        short2Image();
    }

    public short[][] intersect(short a[][], short b[][]) {
        int w = a.length;
        int h = a[0].length;
        short c[][] = new short[w][h];
        for (int x = 0; x < w; x++)
            for (int y = 0; y < h; y++)
                if (a[x][y] == b[x][y])
                    c[x][y] = a[x][y];
        return c;
    }

    public short[][] complement(short s[][]) {
        int w = s.length;
        int h = s[0].length;
        short sComp[][] = new short[w][h];
        for (int x = 0; x < w; x++)
            for (int y = 0; y < h; y++)
                sComp[x][y] = (short) (255 - s[x][y]);
        return sComp;
    }

    public static void main(String args[]) {
        MorphFrame ef = new MorphFrame("MorphFrame");
        ef.show();
    }


    public void dilate(float k[][]) {
        setR(dilate(getG(), k));
        copyRedToGreenAndBlue();
        short2Image();
    }

    public void erode(float k[][]) {
        setR(erode(getG(), k));
        copyRedToGreenAndBlue();
        short2Image();
    }

    public void colorDilateErode(float k[][]) {
        for (int i = 0; i < 5; i++)
            colorDilate(k);
        for (int i = 0; i < 5; i++)
            colorErode(k);
    }

    public void colorDilate(float k[][]) {
        setR(dilategs(getR(), k));
        setG(dilategs(getG(), k));
        setB(dilategs(getB(), k));
        short2Image();
    }

    public void colorErode(float k[][]) {
        setR(erodegs(getR(), k));
        setG(erodegs(getG(), k));
        setB(erodegs(getB(), k));
        short2Image();
    }


    public void insideContour(float k[][]) {
        setR(subtract(getG(), erode(getG(), k)));
        copyRedToGreenAndBlue();
        short2Image();
    }

    public void outsideContour(float k[][]) {
        setR(subtract(dilate(getG(), k), getG()));
        copyRedToGreenAndBlue();
        short2Image();
    }

    public void middleContour(float k[][]) {
        setR(subtract(
                dilate(getG(), k),
                erode(getG(), k)));
        copyRedToGreenAndBlue();
        short2Image();
    }

    public void clip(short a[][], short min, short max) {
        int w = a.length;
        int h = a[0].length;
        for (int x = 0; x < w; x++)
            for (int y = 0; y < h; y++) {
                if (a[x][y] < min) a[x][y] = min;
                if (a[x][y] > max) a[x][y] = max;
            }
    }

    public short[][] subtract(
            short a[][], short b[][]) {

        int w = a.length;
        int h = a[0].length;

        short c[][] = new short[w][h];
        for (int x = 0; x < w; x++)
            for (int y = 0; y < h; y++) {
                int s = a[x][y] - b[x][y];
                c[x][y] = (short) Math.abs(s);
            }
        return c;
    }

    public void thin() {
        skeletonRedPassSuen(true);
        skeletonRedPassSuen(false);
        copyRedToGreenAndBlue();
        short2Image();
    }

    public void skeleton() {
        while (
                skeletonRedPassSuen(true) &&
                skeletonRedPassSuen(false)) {
        }
        copyRedToGreenAndBlue();
        short2Image();
    }

    // p7 p0 p1
    // p6 --- p2
    // p5 p4 p3
    public boolean skeletonRedPassSuen(
            boolean firstPass) {
        boolean p[] = new boolean[8];
        short c = 0;
        for (int x = 1; x < getImageWidth() - 1; x++) {
            for (int y = 1; y < getImageHeight() - 1; y++) {
                getG()[x][y] = 0; // use g for 1st pass
                if (getR()[x][y] == 0) continue;
                p[0] = getR()[x][y + 1] != 0;
                p[1] = getR()[x + 1][y + 1] != 0;
                p[2] = getR()[x + 1][y] != 0;
                p[3] = getR()[x + 1][y - 1] != 0;
                p[4] = getR()[x][y - 1] != 0;
                p[5] = getR()[x - 1][y - 1] != 0;
                p[6] = getR()[x - 1][y] != 0;
                p[7] = getR()[x - 1][y + 1] != 0;
                int n = numberOfNeighbors(p);
                if ((n < 2) || (n > 6)) continue;
                if (numberOf01Transitions(p) != 1) continue;

                if (firstPass) {
                    if ((p[0] && p[2] && p[4]))
                        continue;
                    if ((p[2] && p[4] && p[6]))
                        continue;
                    getG()[x][y] = 255;
                    c++;
                } else {
                    if ((p[0] && p[2] && p[6]))
                        continue;
                    if ((p[0] && p[4] && p[6]))
                        continue;
                    getG()[x][y] = 255;
                    c++;

                }
            }
        }
        //System.out.println("c="+c);
        if (c == 0) return false;
        deleteFlagedPoints();
        return true;
    }

    public void deleteFlagedPoints() {
        for (int x = 1; x < getImageWidth() - 1; x++)
            for (int y = 1; y < getImageHeight() - 1; y++)
                if (getG()[x][y] != 0)
                    getR()[x][y] = 0;
    }


    public short[][] erode(short f[][], float k[][]) {
        int uc = k.length / 2;
        int vc = k[0].length / 2;

        short h[][] = new short[getImageWidth()][getImageHeight()];
        short sum = 0;

        for (int x = uc; x < getImageWidth() - uc; x++) {
            for (int y = vc; y < getImageHeight() - vc; y++) {
                sum = 255;
                for (int v = -vc; v <= vc; v++)
                    for (int u = -uc; u <= uc; u++)
                        if (k[u + uc][v + vc] == 1)
                            if (f[x - u][y - v] < sum)
                                sum = f[x - u][y - v];
                h[x][y] = sum;
            }
        }
        return h;
    }

    public short[][] erodegs(short f[][], float k[][]) {
        int uc = k.length / 2;
        int vc = k[0].length / 2;

        short h[][] = new short[getImageWidth()][getImageHeight()];
        short min = 0;
        short sum = 0;

        for (int x = uc; x < getImageWidth() - uc; x++) {
            for (int y = vc; y < getImageHeight() - vc; y++) {
                min = 255;
                sum = 0;
                for (int v = -vc; v <= vc; v++)
                    for (int u = -uc; u <= uc; u++)
                        if (k[u + uc][v + vc] == 1) {
                            sum = f[x - u][y - v];
                            if (sum < min)
                                min = sum;
                        }
                h[x][y] = min;
            }
        }
        return h;
    }

    public short[][] dilategs(short f[][], float k[][]) {
        int uc = k.length / 2;
        int vc = k[0].length / 2;

        short h[][] = new short[getImageWidth()][getImageHeight()];
        short max = 0;
        short sum = 0;

        for (int x = uc; x < getImageWidth() - uc; x++) {
            for (int y = vc; y < getImageHeight() - vc; y++) {
                max = 0;
                sum = 0;
                for (int v = -vc; v <= vc; v++)
                    for (int u = -uc; u <= uc; u++)
                        if (k[u + uc][v + vc] == 1) {
                            sum = f[x - u][y - v];
                            if (sum > max)
                                max = sum;
                        }

                h[x][y] = max;
            }
        }
        return h;
    }


    public short[][] dilate(short f[][], float k[][]) {
        int uc = k.length / 2;
        int vc = k[0].length / 2;

        short h[][] = new short[getImageWidth()][getImageHeight()];
        short sum;

        for (int x = uc; x < getImageWidth() - uc; x++) {
            for (int y = vc; y < getImageHeight() - vc; y++) {
                sum = 0;
                for (int v = -vc; v <= vc; v++)
                    for (int u = -uc; u <= uc; u++)
                        if (k[u + uc][v + vc] == 1)
                            if (f[x - u][y - v] > sum)
                                sum = f[x - u][y - v];
                h[x][y] = sum;
            }
        }
        return h;
    }


    MorphFrame(String title) {
        super(title);
        morphMenu.add(erodeMenu);
        morphMenu.add(dilateMenu);
        morphMenu.add(openMorphMenu);
        morphMenu.add(closeMorphMenu);
        morphMenu.add(insideContourMenu);
        morphMenu.add(middleContourMenu);
        morphMenu.add(outsideContourMenu);
        morphMenu.add(morphEdgeMenu);
        morphMenu.add(morphColorMenu);
        morphMenu.add(serraMenu);
        getSpatialFilterMenu().add(morphMenu);

    }

    private static final
            float kv[][] = {
                {0, 1, 0},
                {0, 1, 0},
                {0, 1, 0}
            };
    private static final
            float kh[][] = {
                {0, 0, 0},
                {1, 1, 1},
                {0, 0, 0}
            };
    private static final
            float kCross[][] = {
                {0, 1, 0},
                {1, 1, 1},
                {0, 1, 0}
            };
    private static final
            float kSquare[][] = {
                {1, 1, 1},
                {1, 1, 1},
                {1, 1, 1}
            };
    private static final
            float kThinTop[][] = {
                {0, 1, 0},
                {1, 1, 1},
                {0, 0, 0}
            };
    private static final
            float kThinBottom[][] = {
                {0, 0, 0},
                {1, 1, 1},
                {0, 1, 0}
            };
    private static final
            float kOutline[][] = {
                {0, 1, 1, 1, 0},
                {1, 1, 1, 1, 1},
                {1, 1, 1, 1, 1},
                {1, 1, 1, 1, 1},
                {0, 1, 1, 1, 0}
            };

    public int numberOfNeighbors(boolean p[]) {
        int n = 0;
        if (p[0]) n++;
        if (p[1]) n++;
        if (p[2]) n++;
        if (p[3]) n++;
        if (p[4]) n++;
        if (p[5]) n++;
        if (p[6]) n++;
        if (p[7]) n++;
        return n;
    }

    private int numberOf01Transitions(boolean p[]) {
        int n = 0;
        if ((!p[0]) && p[1]) n++;
        if ((!p[1]) && p[2]) n++;
        if ((!p[2]) && p[3]) n++;
        if ((!p[3]) && p[4]) n++;
        if ((!p[4]) && p[5]) n++;
        if ((!p[5]) && p[6]) n++;
        if ((!p[6]) && p[7]) n++;
        if ((!p[7]) && p[0]) n++;
        return n;
    }

    public Menu getMorphMenu() {
        return morphMenu;
    }

    public void setMorphMenu(Menu morphMenu) {
        this.morphMenu = morphMenu;
    }

    public Menu getMorphEdgeMenu() {
        return morphEdgeMenu;
    }

    public void setMorphEdgeMenu(Menu morphEdgeMenu) {
        this.morphEdgeMenu = morphEdgeMenu;
    }

    public Menu getDilateMenu() {
        return dilateMenu;
    }

    public void setDilateMenu(Menu dilateMenu) {
        this.dilateMenu = dilateMenu;
    }

    public Menu getErodeMenu() {
        return erodeMenu;
    }

    public void setErodeMenu(Menu erodeMenu) {
        this.erodeMenu = erodeMenu;
    }

    public Menu getOpenMorphMenu() {
        return openMorphMenu;
    }

    public void setOpenMorphMenu(Menu openMorphMenu) {
        this.openMorphMenu = openMorphMenu;
    }

    public Menu getCloseMorphMenu() {
        return closeMorphMenu;
    }

    public void setCloseMorphMenu(Menu closeMorphMenu) {
        this.closeMorphMenu = closeMorphMenu;
    }

    public Menu getInsideContourMenu() {
        return insideContourMenu;
    }

    public void setInsideContourMenu(Menu insideContourMenu) {
        this.insideContourMenu = insideContourMenu;
    }

    public Menu getOutsideContourMenu() {
        return outsideContourMenu;
    }

    public void setOutsideContourMenu(Menu outsideContourMenu) {
        this.outsideContourMenu = outsideContourMenu;
    }

    public Menu getMiddleContourMenu() {
        return middleContourMenu;
    }

    public void setMiddleContourMenu(Menu middleContourMenu) {
        this.middleContourMenu = middleContourMenu;
    }

    public Menu getSerraMenu() {
        return serraMenu;
    }

    public void setSerraMenu(Menu serraMenu) {
        this.serraMenu = serraMenu;
    }

    public Menu getMorphColorMenu() {
        return morphColorMenu;
    }

    public void setMorphColorMenu(Menu morphColorMenu) {
        this.morphColorMenu = morphColorMenu;
    }

    public MenuItem getDilateh_mi() {
        return dilateh_mi;
    }

    public void setDilateh_mi(MenuItem dilateh_mi) {
        this.dilateh_mi = dilateh_mi;
    }

    public MenuItem getDilatev_mi() {
        return dilatev_mi;
    }

    public void setDilatev_mi(MenuItem dilatev_mi) {
        this.dilatev_mi = dilatev_mi;
    }

    public MenuItem getDilateSquare_mi() {
        return dilateSquare_mi;
    }

    public void setDilateSquare_mi(MenuItem dilateSquare_mi) {
        this.dilateSquare_mi = dilateSquare_mi;
    }

    public MenuItem getDilateCross_mi() {
        return dilateCross_mi;
    }

    public void setDilateCross_mi(MenuItem dilateCross_mi) {
        this.dilateCross_mi = dilateCross_mi;
    }

    public MenuItem getErodeh_mi() {
        return erodeh_mi;
    }

    public void setErodeh_mi(MenuItem erodeh_mi) {
        this.erodeh_mi = erodeh_mi;
    }

    public MenuItem getErodeh5_mi() {
        return erodeh5_mi;
    }

    public void setErodeh5_mi(MenuItem erodeh5_mi) {
        this.erodeh5_mi = erodeh5_mi;
    }

    public MenuItem getErodev_mi() {
        return erodev_mi;
    }

    public void setErodev_mi(MenuItem erodev_mi) {
        this.erodev_mi = erodev_mi;
    }

    public MenuItem getErodeSquare_mi() {
        return erodeSquare_mi;
    }

    public void setErodeSquare_mi(MenuItem erodeSquare_mi) {
        this.erodeSquare_mi = erodeSquare_mi;
    }

    public MenuItem getErodeCross_mi() {
        return erodeCross_mi;
    }

    public void setErodeCross_mi(MenuItem erodeCross_mi) {
        this.erodeCross_mi = erodeCross_mi;
    }

    public MenuItem getOpenh_mi() {
        return openh_mi;
    }

    public void setOpenh_mi(MenuItem openh_mi) {
        this.openh_mi = openh_mi;
    }

    public MenuItem getOpenv_mi() {
        return openv_mi;
    }

    public void setOpenv_mi(MenuItem openv_mi) {
        this.openv_mi = openv_mi;
    }

    public MenuItem getOpenSquare_mi() {
        return openSquare_mi;
    }

    public void setOpenSquare_mi(MenuItem openSquare_mi) {
        this.openSquare_mi = openSquare_mi;
    }

    public MenuItem getOpenCross_mi() {
        return openCross_mi;
    }

    public void setOpenCross_mi(MenuItem openCross_mi) {
        this.openCross_mi = openCross_mi;
    }

    public MenuItem getCloseh_mi() {
        return closeh_mi;
    }

    public void setCloseh_mi(MenuItem closeh_mi) {
        this.closeh_mi = closeh_mi;
    }

    public MenuItem getClosev_mi() {
        return closev_mi;
    }

    public void setClosev_mi(MenuItem closev_mi) {
        this.closev_mi = closev_mi;
    }

    public MenuItem getCloseSquare_mi() {
        return closeSquare_mi;
    }

    public void setCloseSquare_mi(MenuItem closeSquare_mi) {
        this.closeSquare_mi = closeSquare_mi;
    }

    public MenuItem getCloseCross_mi() {
        return closeCross_mi;
    }

    public void setCloseCross_mi(MenuItem closeCross_mi) {
        this.closeCross_mi = closeCross_mi;
    }

    public MenuItem getInsideContourh_mi() {
        return insideContourh_mi;
    }

    public void setInsideContourh_mi(MenuItem insideContourh_mi) {
        this.insideContourh_mi = insideContourh_mi;
    }

    public MenuItem getInsideContourv_mi() {
        return insideContourv_mi;
    }

    public void setInsideContourv_mi(MenuItem insideContourv_mi) {
        this.insideContourv_mi = insideContourv_mi;
    }

    public MenuItem getInsideContourSquare_mi() {
        return insideContourSquare_mi;
    }

    public void setInsideContourSquare_mi(MenuItem insideContourSquare_mi) {
        this.insideContourSquare_mi = insideContourSquare_mi;
    }

    public MenuItem getInsideContourCross_mi() {
        return insideContourCross_mi;
    }

    public void setInsideContourCross_mi(MenuItem insideContourCross_mi) {
        this.insideContourCross_mi = insideContourCross_mi;
    }

    public MenuItem getOutsideContourh_mi() {
        return outsideContourh_mi;
    }

    public void setOutsideContourh_mi(MenuItem outsideContourh_mi) {
        this.outsideContourh_mi = outsideContourh_mi;
    }

    public MenuItem getOutsideContourv_mi() {
        return outsideContourv_mi;
    }

    public void setOutsideContourv_mi(MenuItem outsideContourv_mi) {
        this.outsideContourv_mi = outsideContourv_mi;
    }

    public MenuItem getOutsideContourSquare_mi() {
        return outsideContourSquare_mi;
    }

    public void setOutsideContourSquare_mi(MenuItem outsideContourSquare_mi) {
        this.outsideContourSquare_mi = outsideContourSquare_mi;
    }

    public MenuItem getOutsideContourCross_mi() {
        return outsideContourCross_mi;
    }

    public void setOutsideContourCross_mi(MenuItem outsideContourCross_mi) {
        this.outsideContourCross_mi = outsideContourCross_mi;
    }

    public MenuItem getMiddleContourh_mi() {
        return middleContourh_mi;
    }

    public void setMiddleContourh_mi(MenuItem middleContourh_mi) {
        this.middleContourh_mi = middleContourh_mi;
    }

    public MenuItem getMiddleContourv_mi() {
        return middleContourv_mi;
    }

    public void setMiddleContourv_mi(MenuItem middleContourv_mi) {
        this.middleContourv_mi = middleContourv_mi;
    }

    public MenuItem getMiddleContourSquare_mi() {
        return middleContourSquare_mi;
    }

    public void setMiddleContourSquare_mi(MenuItem middleContourSquare_mi) {
        this.middleContourSquare_mi = middleContourSquare_mi;
    }

    public MenuItem getMiddleContourCross_mi() {
        return middleContourCross_mi;
    }

    public void setMiddleContourCross_mi(MenuItem middleContourCross_mi) {
        this.middleContourCross_mi = middleContourCross_mi;
    }

    public MenuItem getSerrah_mi() {
        return serrah_mi;
    }

    public void setSerrah_mi(MenuItem serrah_mi) {
        this.serrah_mi = serrah_mi;
    }

    public MenuItem getSerrav_mi() {
        return serrav_mi;
    }

    public void setSerrav_mi(MenuItem serrav_mi) {
        this.serrav_mi = serrav_mi;
    }

    public MenuItem getSerraSquare_mi() {
        return serraSquare_mi;
    }

    public void setSerraSquare_mi(MenuItem serraSquare_mi) {
        this.serraSquare_mi = serraSquare_mi;
    }

    public MenuItem getSerraCross_mi() {
        return serraCross_mi;
    }

    public void setSerraCross_mi(MenuItem serraCross_mi) {
        this.serraCross_mi = serraCross_mi;
    }

    public MenuItem getSkeleton_mi() {
        return skeleton_mi;
    }

    public void setSkeleton_mi(MenuItem skeleton_mi) {
        this.skeleton_mi = skeleton_mi;
    }

    public MenuItem getThin_mi() {
        return thin_mi;
    }

    public void setThin_mi(MenuItem thin_mi) {
        this.thin_mi = thin_mi;
    }

    public MenuItem getHatMorph_mi() {
        return hatMorph_mi;
    }

    public void setHatMorph_mi(MenuItem hatMorph_mi) {
        this.hatMorph_mi = hatMorph_mi;
    }

    public MenuItem getColorDilateErode_mi() {
        return colorDilateErode_mi;
    }

    public void setColorDilateErode_mi(MenuItem colorDilateErode_mi) {
        this.colorDilateErode_mi = colorDilateErode_mi;
    }

    public MenuItem getColorDilate_mi() {
        return colorDilate_mi;
    }

    public void setColorDilate_mi(MenuItem colorDilate_mi) {
        this.colorDilate_mi = colorDilate_mi;
    }

    public MenuItem getColorErode_mi() {
        return colorErode_mi;
    }

    public void setColorErode_mi(MenuItem colorErode_mi) {
        this.colorErode_mi = colorErode_mi;
    }

    public MenuItem getColorOpen_mi() {
        return colorOpen_mi;
    }

    public void setColorOpen_mi(MenuItem colorOpen_mi) {
        this.colorOpen_mi = colorOpen_mi;
    }

    public MenuItem getColorClose_mi() {
        return colorClose_mi;
    }

    public void setColorClose_mi(MenuItem colorClose_mi) {
        this.colorClose_mi = colorClose_mi;
    }

    public MenuItem getColorPyramid_mi() {
        return colorPyramid_mi;
    }

    public void setColorPyramid_mi(MenuItem colorPyramid_mi) {
        this.colorPyramid_mi = colorPyramid_mi;
    }

    public static float[][] getKv() {
        return kv;
    }

    public static float[][] getKh() {
        return kh;
    }

    public static float[][] getKcross() {
        return kCross;
    }

    public static float[][] getKsquare() {
        return kSquare;
    }

    public static float[][] getKthintop() {
        return kThinTop;
    }

    public static float[][] getKthinbottom() {
        return kThinBottom;
    }

    public static float[][] getKoutline() {
        return kOutline;
    }
}