好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java实现图片比对算法

采用直方图原理算法比对图片的细微差别效果比较好,以下两张区别很小的图片识别效果如下:

识别结果:

主要代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

import javax.imageio.*;

import java.awt.image.*;

import java.awt.*;

import java.io.*;

 

public class PhotoDigest {

    public static void main(String[] args) throws Exception {

        float percent = compare(getData( "/Users/sun/Downloads/1.jpg" ),

                getData( "/Users/sun/Downloads/3.jpg" ));

        if (percent == 0 ) {

            System.out.println( "无法比较" );

        } else {

            System.out.println( "两张图片的相似度为:" + percent + "%" );

        }

    }

 

    public static int [] getData(String name) {

        try {

            BufferedImage img = ImageIO.read( new File(name));

            BufferedImage slt = new BufferedImage( 100 , 100 ,

                    BufferedImage.TYPE_INT_RGB);

            slt.getGraphics().drawImage(img, 0 , 0 , 100 , 100 , null );

            // ImageIO.write(slt,"jpeg",new File("slt.jpg"));

            int [] data = new int [ 256 ];

            for ( int x = 0 ; x < slt.getWidth(); x++) {

                for ( int y = 0 ; y < slt.getHeight(); y++) {

                    int rgb = slt.getRGB(x, y);

                    Color myColor = new Color(rgb);

                    int r = myColor.getRed();

                    int g = myColor.getGreen();

                    int b = myColor.getBlue();

                    data[(r + g + b) / 3 ]++;

                }

            }

            // data 就是所谓图形学当中的直方图的概念

            return data;

        } catch (Exception exception) {

            System.out.println( "有文件没有找到,请检查文件是否存在或路径是否正确" );

            return null ;

        }

    }

 

    public static float compare( int [] s, int [] t) {

        try {

            float result = 0F;

            for ( int i = 0 ; i < 256 ; i++) {

                int abs = Math.abs(s[i] - t[i]);

                int max = Math.max(s[i], t[i]);

                result += ( 1 - (( float ) abs / (max == 0 ? 1 : max)));

            }

            return (result / 256 ) * 100 ;

        } catch (Exception exception) {

            return 0 ;

        }

    }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:https://blog.csdn.net/qq_24125575/article/details/94458420

查看更多关于Java实现图片比对算法的详细内容...

  阅读:23次