//----------------------------------------------------- // 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; }
//----------------------------------------------------- // 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; }
//----------------------------------------------------- // 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); } } } }