直方图比较

直方图系图像的本身属性之一,所受外界操纵变化较小,可用来比较图像间的相似度。假设两幅图像的直方图为H1与H2,其距离d则表示其相互匹配的程度,下面是OpenCV提供的计算方法:

compareHist(H1, H2, method);

H1与H2系Mat对象,method系计算方法,枚举类型,其值如下:

  • HISTCMP_CORREL
    相关性

  • HISTCMP_CHISQR
    卡方

  • HISTCMP_INTERSECT
    相交

  • HISTCMP_BHATTACHARYYA
    巴氏距离

  • HISTCMP_HELLINGER
    同上

  • HISTCMP_CHISQR_ALT
    可选卡方

  • HISTCMP_KL_DIV
    散度

其中相关性越接近1表示越像;卡方越接近0表示越像;相交法数值越大表示越像;巴氏距离越接近0表示越像。

Java代码(JavaFX Controller层)

public class Controller{@FXML private Text fxText;@FXML private ImageView imageView;@FXML private TextArea textArea;@FXML public void handleButtonEvent(ActionEvent actionEvent) throws IOException {Node source = (Node) actionEvent.getSource();Window theStage = source.getScene().getWindow();FileChooser fileChooser = new FileChooser();FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.png");fileChooser.getExtensionFilters().add(extFilter);fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("JPG Files(*.jpg)", "*.jpg"));File file = fileChooser.showOpenDialog(theStage);runInSubThread(file.getPath());}private void runInSubThread(String filePath){new Thread(new Runnable() {@Overridepublic void run() {try {WritableImage writableImage = histogramCompared(filePath);Platform.runLater(new Runnable() {@Overridepublic void run() {imageView.setImage(writableImage);}});} catch (IOException e) {e.printStackTrace();}}}).start();}private WritableImage histogramCompared(String filePath) throws IOException {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);// Read source image to src.Mat src = Imgcodecs.imread(filePath);Mat dst = new Mat();Mat gray = new Mat();Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);Imgproc.equalizeHist(gray, dst);List<Mat> images = new ArrayList<>();images.add(gray);Mat mask = Mat.ones(src.size(), CvType.CV_8UC1);Mat hist_1 = new Mat();Imgproc.calcHist(images, new MatOfInt(0), mask, hist_1, new MatOfInt(256), new MatOfFloat(0,255));Core.normalize(hist_1, hist_1,0,255, Core.NORM_MINMAX);images.clear();Mat src_2 = Imgcodecs.imread("E:/Chrome/lenna_test.jpg");Mat dst_2 = new Mat();Mat gray_2 = new Mat();Imgproc.cvtColor(src_2, gray_2, Imgproc.COLOR_BGR2GRAY);Imgproc.equalizeHist(gray_2, dst_2);images.add(gray_2);Mat hist_2 = new Mat();Imgproc.calcHist(images, new MatOfInt(0), mask, hist_2, new MatOfInt(256), new MatOfFloat(0,255));Core.normalize(hist_2, hist_2,0,255, Core.NORM_MINMAX);double[] distanceArray = new double[7];distanceArray[0] = Imgproc.compareHist(hist_1, hist_2, Imgproc.HISTCMP_CORREL);distanceArray[1] = Imgproc.compareHist(hist_1, hist_2, Imgproc.HISTCMP_CHISQR);distanceArray[2] = Imgproc.compareHist(hist_1, hist_2, Imgproc.HISTCMP_INTERSECT);distanceArray[3] = Imgproc.compareHist(hist_1, hist_2, Imgproc.HISTCMP_BHATTACHARYYA);distanceArray[4] = Imgproc.compareHist(hist_1, hist_2, Imgproc.HISTCMP_HELLINGER);distanceArray[5] = Imgproc.compareHist(hist_1, hist_2, Imgproc.HISTCMP_CHISQR_ALT);distanceArray[6] = Imgproc.compareHist(hist_1, hist_2, Imgproc.HISTCMP_KL_DIV);List<String> typeList = new ArrayList<>();typeList.add("HISTCMP_CORREL");typeList.add("HISTCMP_CHISQR");typeList.add("HISTCMP_INTERSECT");typeList.add("HISTCMP_BHATTACHARYYA");typeList.add("HISTCMP_HELLINGER");typeList.add("HISTCMP_CHISQR_ALT");typeList.add("HISTCMP_KL_DIV");for (int i = 0; i < 7; i++) {textArea.appendText("Type: " + typeList.get(i) + " | Distance: "+ distanceArray[i] + "\n");}src.copyTo(dst);src_2.copyTo(dst_2);MatOfByte matOfByte = new MatOfByte();Imgcodecs.imencode(".jpg", dst, matOfByte);byte[] bytes = matOfByte.toArray();InputStream in = new ByteArrayInputStream(bytes);BufferedImage bufImage = ImageIO.read(in);WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);return writableImage;}}

相关图片

图1 - lenna原图

图2 - 经处理后的lenna图

图3 - 运行图

OpenCV.直方图比较相关推荐

  1. OpenCV直方图比较Histogram Comparison

    OpenCV直方图比较Histogram Comparison 直方图比较Histogram Comparison 目标 理论 代码 这个程序做什么? 解释 结果 直方图比较Histogram Com ...

  2. OpenCV学习-P29-P32 Opencv直方图均衡化、掩膜

    OpenCV学习-P29-P32 Opencv直方图均衡化及掩膜 1 直方图 2 直方图均衡化 3 直方图自适应均衡化 1 直方图 直方图原理:统计图像各个灰度区间的像素数 cv2.calcHist( ...

  3. OpenCV基础(16)OpenCV直方图均衡化和自适应直方图均衡化(CLAHE)

    在本教程中,您将学习使用OpenCV实现直方图均衡化和自适应直方图均衡化(CLAHE). 直方图均衡化是一种基本的图像处理技术,通过更新图像直方图的像素强度分布来调整图像的全局对比度.这样做可以使低对 ...

  4. Python,OpenCV直方图均衡化以提高图像对比度

    Python,OpenCV直方图均衡化以提高图像对比度 1. 效果图 2. 原理 2.1 直方图均衡化应用 2.2 直方图均衡化分类 3. 源代码 参考 这篇博客将介绍直方图均衡化(全局 & ...

  5. OpenCV 直方图的计算和绘制

    图像直方图 是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素个数.这种直方图中,横坐标的左侧为较暗的区域,而右侧为较亮的区域.因此一张较暗图片的直方图中的数据多集中于左侧和中间部分, ...

  6. OpenCV直方图计算Histogram Calculation

    OpenCV直方图均衡Histogram Equalization 直方图均衡Histogram Equalization 目标 什么是直方图? OpenCV为您提供什么 代码 解释 结果 直方图均衡 ...

  7. opencv 直方图_OpenCV之图像直方图反向投影

    python代码: import cv2 as cv import numpy as np from matplotlib import pyplot as pltdef back_projectio ...

  8. [Python图像处理] 三十七.OpenCV直方图统计两万字详解(掩膜直方图、灰度直方图对比、黑夜白天预测)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  9. python opencv直方图_【python opencv】直方图均衡

    搜索热词 考虑这样一个图像,它的像素值仅局限于某个特定的值范围.例如,较亮的图像将把所有像素限制在高值上.但是一幅好的图像会有来自图像所有区域的像素.因此,您需要将这个直方图拉伸到两端(如下图所示,来 ...

  10. opencv 直方图反向投影

    转载至:http://www.cnblogs.com/zsb517/archive/2012/06/20/2556508.html 直方图反向投影式通过给定的直方图信息,在图像找到相应的像素分布区域, ...

最新文章

  1. activeMQ - 消息重发策略和DLQ死信队列
  2. 配置Windows 2008 R2 防火墙允许远程访问SQL Server 2008 R2
  3. JQuery弹出窗口小插件ColorBox
  4. Android4.0-4.4 加入支持状态栏显示耳机图标方法(支持带不带MIC的两种耳机自己主动识别)...
  5. LAMP集群项目四 安装apache、php及其插件
  6. 单继承-问题的抛出-单纯封装可能会出现重复的代码
  7. sqlserver 查看锁表,解锁
  8. 三层交换机工作原理介绍
  9. building for iOS simulator, but linking in object file built for tvOS, for architecture x86_64
  10. Github TOP100 Android开源,android开发环境搭建实验报心得
  11. 华为首度公开披露员工薪酬:去年平均年薪近28万
  12. UrU4000B指纹仪驱动
  13. MicroPython中I2C模块的设计与实现(1) - machine_i2c框架的机制
  14. TP-LINK路由器怎么删除DDNS创建的域名
  15. Windows中软件的安装
  16. java详细安装教程一一java(jdk)安装
  17. HAUTOJ 1262魔法宝石 优先队列
  18. 井字棋小游戏代码(Visual Studio)
  19. 哈尔滨工业大学2019年计算机复试线,2019年哈尔滨工业大学考研复试分数线信息分析...
  20. 康华医疗旗下康华医院道歉:生命不该用钱衡量,还曾是中植系

热门文章

  1. [FPS网络游戏]关于通过万能码定位到战宠伤害搜法
  2. English Learning - L2 语音作业打卡 辅音唇齿音 [f] [v] Day28 2023.3.20 周一
  3. pub格式文件如何打开
  4. c语言输出一个符号的ascii码,编写一个程序,要求输入一个ASCII码值,然后输出相应的字符....
  5. 阿里云服务器配置教程,超超详细~!
  6. chinakang8提供伤感日志_谁能知道,点烟时的寂寞
  7. 用竞聘方案选拔真正胜任岗位的管理干部
  8. Python __doc__属性:查看文档
  9. Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
  10. 论IT运维自动化的重要性