OpenCVJava图像直⽅图均衡化及直⽅图绘制
什么是直⽅图均衡化
直⽅图均衡化通常⽤来增加图像的全局对⽐度,尤其是当图像的有⽤数据的对⽐度相当接近的时候。通过这种⽅法,亮度可以更好地在直⽅图上分布。这样就可以⽤于增强局部的对⽐度⽽不影响整体的对⽐度,直⽅图均衡化通过有效地扩展常⽤的亮度来实现这种功能。
这种⽅法对于背景和前景都太亮或者太暗的图像⾮常有⽤,这种⽅法尤其是可以带来X光图像中更好的⾻骼结构显⽰以及曝光过度或者曝光不⾜照⽚中更好的细节。这种⽅法的⼀个主要优势是它是⼀个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直⽅图,并且计算量也不⼤。这种⽅法的⼀个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对⽐度并且降低有⽤信号的对⽐度。
绘制直⽅图为什么要先归⼀化
opencv中⽤calHist函数得到直⽅图信息后,需要将其绘制出来,但是有些像素点的统计次数可能⼏千次甚⾄上万次,为了将其在⼀个预先确定⼤⼩的图中绘制出来,需要将得到的直⽅图各个像素点的次数归⼀化到范围内,再进⾏绘制。
package;
import LinkedList;
import List;
import Core;
import CvType;
import Mat;
import MatOfFloat;
import MatOfInt;
import Scalar;
import HighGui;
import Imgcodecs;
import Imgproc;
public class OpenCvMain {
//静态代码块加载动态链接库
static{
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static void main(String[] args){
/*
* 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("D:\\1234.jpg",0);局部直方图均衡化
//size(src, src, new ls()/ws()/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 = s(150,((0,0)[0], CvType.CV_8UC1);
//归⼀化直⽅图详见blog.csdn/ren365880/article/details/103923813
/
/绘制直线详见:blog.csdn/ren365880/article/details/103952856
for(int i =0; i <((0,0)[0]; i++){
Imgproc.line(histImage,new Point(i, ws()),new Point(i, ws()-und( (i,0)[0])) ,new Scalar(255,255,255),1,8,0);
}
HighGui.imshow(windowName, histImage);
HighGui.waitKey();
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。