Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package algorithms;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.Random;
- import model.GreyImage;
- import model.StructElement;
- public class InPainting {
- GreyImage inputImage;
- GreyImage mask;
- GreyImage endomage;;
- GreyImage outputImage;
- int windowSize;
- int patchSize;
- public InPainting(GreyImage inputImage,GreyImage mask,int windowsSize,int patchSize) {
- this.inputImage=inputImage;
- this.mask=mask;
- this.endomage=new GreyImage(inputImage.getSizeX(),inputImage.getSizeY());
- this.outputImage=new GreyImage(inputImage.getSizeX(),inputImage.getSizeY());
- aplyMask();
- for(int i=0;i<endomage.getNbPixels();i++){
- this.outputImage.setOffset(i,endomage.getOffset(i));
- }
- this.windowSize=windowsSize;
- this.patchSize=patchSize;
- }
- public void aplyMask() {
- for (int i = 0; i < inputImage.getNbPixels(); i++) {
- endomage.setOffset(i, inputImage.getOffset(i));
- if(mask.getOffset(i)!=0)
- endomage.setOffset(i, 0);
- }
- }
- private double computeSimilarity(int x1, int y1, int x2, int y2){
- double res=0;;
- for(int y=-patchSize/2;y<patchSize/2;y++){
- for(int x=-patchSize/2;x<patchSize/2;x++){
- int val1=mask.getPixel(x1+x, y1+y);
- int val2=mask.getPixel(x2+x, y2+y);
- if(val1!=0 || val2!=0)
- res+=255*255;
- else
- res+=(val1-val2)*(val1-val2);
- }
- }
- return res;
- }
- private double[] distanceMin(int x,int y){
- double[] min={0,0,Double.POSITIVE_INFINITY,0,0};
- for(int j=y-windowSize/2;j<y+windowSize/2;j++){
- for(int i=x-windowSize/2;i<x+windowSize/2;i++){
- if(x!=i && y!=j && mask.getPixel(i, j)==0){
- double w=computeSimilarity(x,y,i,j);
- if(w<min[2]){
- min[2]=w;
- min[0]=x;
- min[1]=y;
- min[3]=i;
- min[4]=j;
- }
- }
- }
- }
- return min;
- }
- public void process(){
- ArrayList pixelD=new ArrayList();
- for (int i = 0; i < inputImage.getNbPixels(); i++) {
- if (mask.getOffset(i) != 0)
- pixelD.add(distanceMin(i%inputImage.getSizeX(),i/inputImage.getSizeX()));
- }
- while(!pixelD.isEmpty()){
- for (int i = 0; i < pixelD.size(); i++) {
- if (mask.getOffset(i) != 0)
- pixelD.set(i, distanceMin((int)((double[])pixelD.get(i))[0],(int)((double[])pixelD.get(i))[1]));
- }
- Collections.sort(pixelD,new Comparator<Object>(){
- public int compare(Object p11,Object p22){
- double[] p1=(double[])p11;
- double[] p2=(double[])p22;
- return (int) ( p1[2] - p2[2]);
- }
- });
- double[] px=(double[])pixelD.get(o);
- pixelD.remove(o);
- if(mask.getPixel((int)px[0], (int)px[1])!=0){//si cassé !!
- for(int y=-patchSize/2;y<patchSize/2;y++){
- for(int x=-patchSize/2;x<patchSize/2;x++){
- int val=outputImage.getPixel((int)px[3]+x, (int)px[4]+y);
- if(mask.getPixel((int)px[0]+x, (int)px[1]+y)!=0){
- outputImage.setPixel((int)px[0]+x, (int)px[1]+y, val);
- mask.setPixel((int)px[0]+x, (int)px[1]+y, 0);
- }
- }
- }
- }
- }
- }
- /*
- public void process(){
- ArrayList pixelD=new ArrayList();
- for (int i = 0; i < inputImage.getNbPixels(); i++) {
- if (mask.getOffset(i) != 0)
- pixelD.add(distanceMin(i%inputImage.getSizeX(),i/inputImage.getSizeX()));
- }
- while(!pixelD.isEmpty()){
- pixelD=new ArrayList();
- for (int i = 0; i < inputImage.getNbPixels(); i++) {
- if (mask.getOffset(i) != 0)
- pixelD.add(distanceMin(i%inputImage.getSizeX(),i/inputImage.getSizeX()));
- }
- Collections.sort(pixelD,new Comparator<Object>(){
- public int compare(Object p11,Object p22){
- double[] p1=(double[])p11;
- double[] p2=(double[])p22;
- return (int) ( p1[2] - p2[2]);
- }
- });
- double[] px=(double[])pixelD.get(o);
- pixelD.remove(o);
- if(mask.getPixel((int)px[0], (int)px[1])!=0){//si cassé !!
- for(int y=-patchSize/2;y<patchSize/2;y++){
- for(int x=-patchSize/2;x<patchSize/2;x++){
- int val=outputImage.getPixel((int)px[3]+x, (int)px[4]+y);
- if(mask.getPixel((int)px[0]+x, (int)px[1]+y)!=0){
- outputImage.setPixel((int)px[0]+x, (int)px[1]+y, val);
- mask.setPixel((int)px[0]+x, (int)px[1]+y, 0);
- }
- }
- }
- }
- }
- }*/
- public GreyImage getResult() {
- return outputImage;
- }
- public GreyImage getBordel() {
- return endomage;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement