JAVA做了个简易图像相似度计算器
来源:互联网 发布:阿里云域名隐私保护 编辑:程序博客网 时间:2024/05/29 02:06
使用最简单最基础的感知哈希算法,算法原理戳这里,绝对比笔主讲的要好:
http://www.ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html
UI设计图:
实际运行效果图:
关键算法:
1 // 全流程 2 public static void main(String[] args) throws IOException { 3 // 获取图像 4 File imageFile = new File("c:/1.jpg"); 5 Image image = ImageIO.read(imageFile); 6 // 转换至灰度 7 image = toGrayscale(image); 8 // 缩小成32x32的缩略图 9 image = scale(image);10 // 获取灰度像素数组11 int[] pixels = getPixels(image);12 // 获取平均灰度颜色13 int averageColor = getAverageOfPixelArray(pixels);14 // 获取灰度像素的比较数组(即图像指纹序列)15 pixels = getPixelDeviateWeightsArray(pixels, averageColor);16 // 获取两个图的汉明距离(假设另一个图也已经按上面步骤得到灰度比较数组)17 int hammingDistance = getHammingDistance(pixels, pixels);18 // 通过汉明距离计算相似度,取值范围 [0.0, 1.0]19 double similarity = calSimilarity(hammingDistance);20 }21 22 // 将任意Image类型图像转换为BufferedImage类型,方便后续操作23 public static BufferedImage convertToBufferedFrom(Image srcImage) {24 BufferedImage bufferedImage = new BufferedImage(srcImage.getWidth(null),25 srcImage.getHeight(null), BufferedImage.TYPE_INT_ARGB);26 Graphics2D g = bufferedImage.createGraphics();27 g.drawImage(srcImage, null, null);28 g.dispose();29 return bufferedImage;30 }31 32 // 转换至灰度图33 public static BufferedImage toGrayscale(Image image) {34 BufferedImage sourceBuffered = convertToBufferedFrom(image);35 ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);36 ColorConvertOp op = new ColorConvertOp(cs, null);37 BufferedImage grayBuffered = op.filter(sourceBuffered, null);38 return grayBuffered;39 }40 41 // 缩放至32x32像素缩略图42 public static Image scale(Image image) {43 image = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH);44 return image;45 }46 47 // 获取像素数组48 public static int[] getPixels(Image image) {49 int width = image.getWidth(null);50 int height = image.getHeight(null);51 int[] pixels = convertToBufferedFrom(image).getRGB(0, 0, width, height,52 null, 0, width);53 return pixels;54 }55 56 // 获取灰度图的平均像素颜色值57 public static int getAverageOfPixelArray(int[] pixels) {58 Color color;59 long sumRed = 0;60 for (int i = 0; i < pixels.length; i++) {61 color = new Color(pixels[i], true);62 sumRed += color.getRed();63 }64 int averageRed = (int) (sumRed / pixels.length);65 return averageRed;66 }67 68 // 获取灰度图的像素比较数组(平均值的离差)69 public static int[] getPixelDeviateWeightsArray(int[] pixels,final int averageColor) {70 Color color;71 int[] dest = new int[pixels.length];72 for (int i = 0; i < pixels.length; i++) {73 color = new Color(pixels[i], true);74 dest[i] = color.getRed() - averageColor > 0 ? 1 : 0;75 }76 return dest;77 }78 79 // 获取两个缩略图的平均像素比较数组的汉明距离(距离越大差异越大)80 public static int getHammingDistance(int[] a, int[] b) {81 int sum = 0;82 for (int i = 0; i < a.length; i++) {83 sum += a[i] == b[i] ? 0 : 1;84 }85 return sum;86 }87 88 // 通过汉明距离计算相似度89 public static double calSimilarity(int hammingDistance){90 int length = 32*32;91 double similarity = (length - hammingDistance) / (double) length;92 93 // 使用指数曲线调整相似度结果94 similarity = java.lang.Math.pow(similarity, 2);95 return similarity;96 }
0 0
- JAVA做了个简易图像相似度计算器
- Java GUI做简易计算器
- Java做的简易计算器
- java 做的简易进制计算器
- Java Swing做的简易计算器
- Xcode做简易计算器
- Xcode做简易计算器
- 做一个简易计算器
- JSP学习笔记---应用做个简易计算器JSP+javabean
- java 余弦相似度计算简易实现
- 闲来无事,写了个简易计算器
- 平时关注.net今个儿用java做了个计算器.
- Java简易计算器V1.0-第一个Java GUI项目
- 用NetBeans做简易计算器
- netbeans做简易的计算器
- python split做简易计算器
- java学习的第一个成果 一 简易的计算器
- 简易Java控制台计算器
- HDU 1242 Rescue
- 大话设计模式3 装饰模式 的java代码实现
- c++中 getline(), cin.get(), cin.getline() 总结
- ArrayList和LinkedList的源码分析
- Android PhoneGap简析
- JAVA做了个简易图像相似度计算器
- the currently displayed page contains invalid values
- MySQL取上周上月上季度的起止时间
- hibernate---table_Generator
- Visual Studio 2013开发 mini-filter driver step by step (1) - 创建 mini filter driver 工程
- LBA(逻辑区块地址)及PBA(物理区块地址)
- 【九度OJ】1022【模拟】
- 大话重构连载10:小设计而不是大布局
- AVL树