OpenCV直方图Java 演示程序

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

直方图Java 演示程序

以下文件编码为utf-8 为佳。

代码

文件名:OpenCvMain.java

package org.opencv;

import java.net.URL;

import java.util.LinkedList;

import java.util.List;

import org.opencv.core.Core;

import org.opencv.core.CvType;

import org.opencv.core.Mat;

import org.opencv.core.MatOfFloat;

import org.opencv.core.MatOfInt;

import org.opencv.core.Scalar;

import org.opencv.highgui.HighGui;

import org.opencv.imgcodecs.Imgcodecs;

import org.opencv.imgproc.Imgproc;

public class OpenCvMain {

//静态代码块加载动态链接库

// static {

// System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

// }

public static void main(String[] args) {

loadDll();

/*

* IMREAD_UNCHANGED = -1 :不进行转化比如保存为了16位的图片读取出来仍然为16位。

* IMREAD_GRAYSCALE = 0 :进行转化为灰度图比如保存为了16位的图片读取出来为8位类型为CV_8UC1。

* IMREAD_COLOR = 1 :进行转化为三通道图像。

* IMREAD_ANYDEPTH = 2 :如果图像深度为16位则读出为16位32位则读出为32位其余的转化为8位。

* IMREAD_ANYCOLOR = 4 :图像以任何可能的颜色格式读取

* IMREAD_LOAD_GDAL = 8 :使用GDAL驱动读取文件GDAL(Geospatial Data Abstraction

* Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。

* 它还有一系列命令行工具来进行数据转换和处理。

*/

Mat src = Imgcodecs.imread("C:\\temp\\1234.png",0);

//Imgproc.resize(src, src, new Size(src.cols()/2,src.rows()/2));

HighGui.imshow("原图", src);

HighGui.waitKey();

ImgCalcHist(src,"原图直方图");

Mat dst = new Mat();

//直方图均衡化,该算法对亮度进行归一化并增加图像的对比度。

Imgproc.equalizeHist(src,dst);

HighGui.imshow("直方图均衡化", dst);

HighGui.waitKey();

ImgCalcHist(dst,"直方图均衡化后的直方图");

}

/**

* 直方图

* @param src

* @param windowName

*/

public static void ImgCalcHist(Mat src,String windowName) {

List<Mat> matList = new LinkedList<Mat>();

matList.add(src);

Mat histogram = new Mat();

MatOfFloat ranges=new MatOfFloat(0,256);

MatOfInt histSize = new MatOfInt(300);

/*

* 计算直方图

* List<Mat> images:输入图像

* MatOfInt channels:需要统计直方图的第几通道

* Mat mask:掩膜计算掩膜内的直方图

* Mat hist:输出的直方图数组

* MatOfInt histSize:指的是直方图分成多少个区间就是bin的个数

* MatOfFloat ranges:统计像素值得区间

*/

Imgproc.calcHist(matList,new MatOfInt(0),new Mat(),histogram,histSize ,ranges);

//创建直方图面板

Mat histImage = Mat.zeros( 150, (int)histSize.get(0, 0)[0], CvType.CV_8UC1);

//归一化直方图详见https://blog.csdn.net/ren365880/article/details/103923813

Core.normalize(histogram, histogram, 1, histImage.rows() , Core.NORM_MINMAX, -1, new Mat() );

//绘制直线详见:https://blog.csdn.net/ren365880/article/details/103952856

for( int i = 0; i < (int)histSize.get(0, 0)[0]; i++ ){

Imgproc.line(histImage,new org.opencv.core.Point(i, histImage.rows()),new org.opencv.core.Point(i, histImage.rows()-Math.round( histogram.get(i,0)[0])) ,new Scalar( 255, 255, 255),1, 8, 0 );

}

HighGui.imshow(windowName, histImage);

HighGui.waitKey();

}

public static void loadDll() {

// 解决awt 报错问题

System.setProperty("java.awt.headless", "false");

System.out.println(System.getProperty("java.library.path"));

// 加载动态库

// URL url = ClassLoader.getSystemResource("lib/opecv_java455.dll");

// System.load(url.getPath());

System.load("C:\\project\\java-study\\histogram\\src\\main\\resources\\lib\\opencv_java455.dll"); //绝对路径

}

}

文件结构

创建的是Maven 项目。

Pom.xml 内容:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 " target="_blank">http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>org.opencv</groupId>

<artifactId>histogram</artifactId>

<version>1.0-SNAPSHOT</version>

<dependencies>

<dependency>

<groupId>org</groupId>

<artifactId>opencv</artifactId>

<scope>system</scope>

<systemPath>${project.basedir}\src\main\resources\lib\opencv-455.jar</systemPath>

<version>4.5.5</version>

</dependency>

</dependencies>

<properties>

<maven.compiler.source>8</maven.compiler.source>

<maven.compiler.target>8</maven.compiler.target>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

</properties>

</project>

运行

程序运行有二处注意:

  1. 图片的引用是绝对路径。

  1. Dll 文件的引用是绝对路径。因为是测试程序就没有完善。

输入空格

关闭。

代码修改v1

把直方图和原图组合显示:

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java