2015-12-05 4 views
0

Мне нужно сравнить два изображения подобного типа, но оба имеют разный размер в JAVA, то есть у вас низкая ширина фона, а у другой - высокая ширина фона. И размер изображений также отличается. Я приложил два файла. В каком лице и футболке одинаковы, поэтому мне нужно показать результат, поскольку изображение такое же. Но когда я иду с пиксельным мудрым изображением, то это не показывает мне истинный результат из-за разной ширины фона. Затем я попытался удалить фон, а затем сравнить его еще одну проблему. Пожалуйста, заполните прилагаемые изображения и код. Пожалуйста, помогите Ссылок на изображения: Image one & Image twoОбработка и сравнение изображений в java

Код:

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.color.ColorSpace; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.Random; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 

import javax.swing.JFrame; 
import static javax.swing.JFrame.EXIT_ON_CLOSE; 
import javax.swing.JOptionPane; 

public class ImageProcesing extends Canvas { 

    private static int x1 = 0, y1 = 0; 
    private static int h, w; 
    private static final Random random = new Random(); 
    private Color mycolor; 

    BufferedImage img, img1; 

    public BufferedImage scaleImage(int WIDTH, int HEIGHT, String filename) { 
     BufferedImage bi = null; 
     try { 
      ImageIcon ii = new ImageIcon(filename);//path to image 
      h = 512; 
      w = 512; 
      bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
      Graphics2D g2d = (Graphics2D) bi.createGraphics(); 
      g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY)); 
      g2d.drawImage(ii.getImage(), 0, 0, w, h, null); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
     return bi; 
    } 

    public BufferedImage scaleImage2(String filename) { 
     BufferedImage bi = null; 
     try { 
      ImageIcon ii = new ImageIcon(filename);//path to image 
      bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
      Graphics2D g2d = (Graphics2D) bi.createGraphics(); 
      g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY)); 
      g2d.drawImage(ii.getImage(), 0, 0, w, h, null); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
     return bi; 
    } 

    public ImageProcesing() { 
     try { 

      this.img = scaleImage(512, 512, "D:\\I Tech Solutions\\Rahul Ratda\\Experiments\\1.jpeg"); 
      this.img1 = scaleImage2("D:\\I Tech Solutions\\Rahul Ratda\\Experiments\\3.jpeg"); 
     } catch (Exception ex) { 
      Logger.getLogger(ImageProcesing.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    @Override 
    public void paint(Graphics g) { 
     int n = 0, k = 0, l = 0; 
     int tp = 0; 
     super.paint(g); 
     Color oldColor = new Color(img1.getRGB(0, 0)); 
     for (int x = 0; x < h; x++) { 
      tp = 0; 
      w=512; 
      for (int y = 0; y < w; y++) { 
       oldColor = new Color(img1.getRGB(y, x)); 
       mycolor = new Color(img.getRGB(y, x));     
        if (tp == 0 && oldColor.equals(Color.WHITE)) { 
         continue; 
        } else { 
         if (tp == 0) { 
          tp = 1; 
          w = w - y; 
         } 
         k++; 
         if ((mycolor.equals(oldColor))) { 
          g.setColor(mycolor); 
          g.drawLine(y, x, y, x); 
          n++; 
           } 
         } 
        } 
       } 
       System.out.println("K : "+k+"\n N : "+n); 
       if (n >= (k * 0.70)) { 
        System.out.println("Same"); 
       } 
       else 
        System.out.println("Not Same"); 

       /* oldColor=new Color(img1.getRGB(0,0)); 
       for(int i = 0 ; i < WIDTH1; i++) { 
       for(int y = 0; y < HEIGHT1; y++) { 
       mycolor=new Color(img1.getRGB(i,y)); 
       if((mycolor.equals(oldColor))){ 
       y1++; 
       g.setColor(mycolor); 
       g.drawLine(i, y, i, y); 
       } 
       else 
       oldColor=mycolor; 
       } 
       }*/ 
       /*if(x1>y1) 
       { 
       if(x1*0.6<y1) 
       JOptionPane.showMessageDialog(null,"Images are More than 60% Equal."); 
       else 
       JOptionPane.showMessageDialog(null,"Images are Less than 60% Equal."); 
       } 
       else{ 
       if(y1*0.6<x1) 
       JOptionPane.showMessageDialog(null,"Images are More than 60% Equal."); 
       else 
       JOptionPane.showMessageDialog(null,"Images are Less than 60% Equal."); 
       }*/ 
      } 
      /* private Color randomColor() { 
      return new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)); 
      }*/ 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     System.out.println("width = " + w); 
     System.out.println("height = " + h); 
     frame.setSize(1000, 1000); 
     frame.add(new ImageProcesing()); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 
} 

ответ

1

Вы можете разработать свой собственный алгоритм для такого рода структуры. Поскольку я вижу, что фон ваших изображений белый, прежде всего, вы выполняете операцию удаления фона на своих изображениях.

Затем вы изменяете размер изображения ниже уровня 256x256 или чего-то подобного. У вас нет только объекта на изображении, так как цвет уже выведен. Таким образом, вы можете пойти со своим сравнением по пикселям за пикселями и сохранить прибыль в размере 84-90%, что даст вам ожидаемый результат, который вы хотите.

Непосредственное сравнение изображений по пикселям не будет работать, поскольку изображения различаются по размеру, а также пространство фона также различно, а также размер объектов варьируется.

0

Вы должны применить некоторые методики обработки изображений, как гистограммы, прежде чем сравнивать изображения. Java API opencv - отличный инструмент для таких операций. See the link