Exemplo n.º 1
0
    //-----------------------------------------------------
    // return a downsampled image (factor 1/2)
    public MaskedImage downsample()
    {
        int newW=width/2, newH=height/2;

        // Binomial coefficient
        int[] kernel = {1,5,10,10,5,1};

        MaskedImage newimage = new MaskedImage(newW, newH);

        for(int y=0;y<height-1;y+=2) {
            for(int x=0;x<width-1;x+=2) {

                int r=0,g=0,b=0,m=0,ksum=0;

                for(int dy=-2;dy<=3;dy++) {
                    int yk=y+dy;
                    if (yk<0 || yk>=height) continue;
                    int ky = kernel[2+dy];
                    for(int dx=-2;dx<=3;dx++) {
                        int xk = x+dx;
                        if (xk<0 || xk>=width) continue;

                        if (mask[xk,yk]) continue;
                        int k = kernel[2+dx]*ky;
                        r+= k*this.getSample(xk, yk, 0);
                        g+= k*this.getSample(xk, yk, 1);
                        b+= k*this.getSample(xk, yk, 2);
                        ksum+=k;
                        m++;
                    }
                }
                if (ksum>0) {r/=ksum; g/=ksum; b/=ksum;}

                if (m!=0) {
                    newimage.setSample(x/2, y/2, 0, r);
                    newimage.setSample(x/2, y/2, 1, g);
                    newimage.setSample(x/2, y/2, 2, b);
                    newimage.setMask(x/2, y/2, false);
                } else {
                    newimage.setMask(x/2, y/2, true);
                }
            }
        }

        return newimage;
    }
Exemplo n.º 2
0
    //-----------------------------------------------------
    // return an upscaled image
    public MaskedImage upscale(int newW,int newH)
    {
        MaskedImage newimage = new MaskedImage(newW, newH);

        for(int y=0;y<newH;y++) {
            for(int x=0;x<newW;x++) {

                // original pixel
                int xs = (x*width)/newW;
                int ys = (y*height)/newH;

                // copy to new image
                if (!mask[xs,ys]) {
                    newimage.setSample(x, y, 0, this.getSample(xs, ys, 0));
                    newimage.setSample(x, y, 1, this.getSample(xs, ys, 1));
                    newimage.setSample(x, y, 2, this.getSample(xs, ys, 2));
                    newimage.setMask(x, y, false);
                } else {
                    newimage.setMask(x, y, true);
                }
            }
        }

        return newimage;
    }
Exemplo n.º 3
0
    //-----------------------------------------------------
    // Maximization Step : Maximum likelihood of target pixel
    public void MaximizationStep(MaskedImage target, double[,,] vote)
    {
        for(int y=0;y<target.height;y++) {
            for(int x=0;x<target.width;x++) {
                if (vote[x,y,3]>0) {
                    int r = (int) ( vote[x,y,0]/vote[x,y,3] );
                    int g = (int) ( vote[x,y,1]/vote[x,y,3] );
                    int b = (int) ( vote[x,y,2]/vote[x,y,3] );

                    target.setSample(x, y, 0, r );
                    target.setSample(x, y, 1, g );
                    target.setSample(x, y, 2, b );
                    target.setMask(x,y,false);
                } else {
                    // conserve the values from previous target
                    //target.setMask(x,y,true);
                }
            }
        }
    }