用 Java 使用 OpenCV 编写直方图处理程序_第1页
用 Java 使用 OpenCV 编写直方图处理程序_第2页
用 Java 使用 OpenCV 编写直方图处理程序_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用Java使用OpenCV编写直方图处理程序:(一)计算一个图像的直方图import java.util.ArrayList;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.imgcodecs.Imgcodecs;import org.opencv.imgproc.Imgproc; public class MyHistograms / 加载OpenCV 本地库 static System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); public static void main(Stringargs) Mat image = Imgcodecs.imread(mylena.png); Mat gray = new Mat(image.height(), image.width(), CvType.CV_8U, new Scalar(0); Imgproc.cvtColor(image, gray, Imgproc.COLOR_BGR2GRAY); Mat hist = new Mat(256, 1, CvType.CV_8U, new Scalar(0); ArrayList histsSource = new ArrayList(); histsSource.add(gray); Imgproc.calcHist(histsSource, new MatOfInt(0), new Mat(), hist, new MatOfInt(256), new MatOfFloat(0f, 256f); System.out.println(hist); System.out.println(hist.dump(); int pixAll = gray.rows() * gray.cols(); Mat histNorm = new Mat(hist.rows(), hist.cols(), hist.type(); Core.divide(hist, new Scalar(pixAll), histNorm); System.out.println(histNorm); System.out.println(histNorm.dump(); 直方图从统计学的角度表征图像,它可以反映图片的整体亮度和对比度:整体较暗的图片,直方图集中在灰度值较小的区域整体较亮的图片,直方图集中在灰度值较大的区域对比度较小的图片,直方图分布较集中对比度较大的图片,直方图分布较分散所有,直方图的应用包括亮度调整和对比度调整 (二)图像的直方图均衡直方图均衡用于整体对比度调整。直方图均衡直接针对像素值进行变换 (而不考虑位置信息)。灰度值变换函数表示为: s = T(r), 0=r-L-1 注意:区分这个函数和上面的直方图定义函数,他们的定义域相同,灰度值(如从0到255),但值域不同,直方图定义函数的值是该像素值的个数【0-图片总像素值】,它是个随机分布,而灰度值变换函数的值是该像素将要转换的值,也是0-255。它不是随机分布,而是由图像处理目的决定。为了保证灰度值转换的可逆性,直方图变换有2个要求1. 转换函数 T(r) 在区间 0, L-1 是严格单调递增的。(即保证r, s 一一对应)2. 当 r = 0, L-1 时, T(r) 也 = 0, L-1 从概率论的角度,直方图 nk / M*N 可以看作是在区间 r=0, L-1 上的随机概率分布,概率密度函数(PDF) 设为 pr。直方图均衡的变换函数 T(r) 定义为 pr 的累积分布函数乘以 (L-1),即 (L-1) * CDF即: s = T(r) = (L-1) 积分符号 0 r pr(w) dw这个定义不仅满足上面的两个要求,而且这种转换具有很好的直方图均衡效果。 即 T(r) = (L-1) pr(r)而 T(r) = ps (s)/ pr(r), 所以:ps (s) = 1/(L-1) 即s的概率密度函数是常数。CDF保证在 pr 高密度的区域具有较高的斜率,从而达到“拉伸”的效果,进而达到提高对比度的效果。 采用CDF的直方图均衡算法 不依赖恩和参数,运用的时候非常简单,实际只需调用一个函数即可。例:import java.util.ArrayList;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.imgcodecs.Imgcodecs;import org.opencv.imgproc.Imgproc;public class MyHistogramEqualization static System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); public static void main(Stringargs) Mat image = Imgcodecs.imread(mylena.png); Mat rMat = new Mat(image.height(), image.width(), CvType.CV_8U, new Scalar(0); Imgproc.cvtColor(image, rMat, Imgproc.COLOR_BGR2GRAY); Mat sMat = new Mat(image.height(), image.width(), CvType.CV_8U, new Scalar(0); Imgproc.equalizeHist(rMat, sMat); Mat rNormedHist = calNormedHist(rMat); Mat sNormedHist = calNormedHist(sMat); System.out.println(rNormedHist); System.out.println(rNormedHist.dump(); System.out.println(sNormedHist); System.out.println(sNormedHist.dump(); static Mat calNormedHist(Mat gray) Mat hist = new Mat(256, 1, CvType.CV_8U, new Scalar(0); ArrayList histsSource = new ArrayList(); histsSource.add(gray); Imgproc.calcHist(histsSource, new MatOfInt(0), new Mat(), hist, new MatOfInt(256), new MatOfFloat(0f, 256f); int pixAll = gray.rows() * gray.cols(); Mat histNormed = new Mat(hist.rows(), hist.cols(), hist.type(); Core.divide(hist, n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论