Java OpenCV-4.0.0 圖像處理19 直方圖計算
Java OpenCV-4.0.0 直方圖計算
其實對圖像梯度、每個像素的角度、等一切圖像的屬性值,我們都可以建立直方圖。這個纔是直方圖的概念真正意義,不過是基於圖像像素灰度直方圖是最常見的。
直方圖最常見的幾個屬性:
dims 表示維度,對灰度圖像來說只有一個通道值dims=1
bins 表示在維度中子區域大小劃分,bins=256,劃分爲256個級別
range 表示值得範圍,灰度值範圍爲[0~255]之間
split(// 把多通道圖像分爲多個單通道圖像
const Mat &src, //輸入圖像
Mat* mvbegin)// 輸出的通道圖像數組
calcHist(
const Mat* images,//輸入圖像指針
int images,// 圖像數目
const int* channels,// 通道數
InputArray mask,// 輸入mask,可選,不用
OutputArray hist,//輸出的直方圖數據
int dims,// 維數
const int* histsize,// 直方圖級數
const float* ranges,// 值域範圍
bool uniform,// true by default
bool accumulate// false by defaut
)
/**
* OpenCV-4.0.0 直方圖計算
*
* @return: void
* @date: 2019年1月21日 下午9:43:34
*/
public static void calcHist() {
Mat src = Imgcodecs.imread("C:\\Users\\xuhya\\Pictures\\99.jpg");
Mat gray = new Mat();
//圖片灰度化
Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
List<Mat> matList = new LinkedList<Mat>();
matList.add(gray);
Mat histogram = new Mat();
MatOfFloat ranges=new MatOfFloat(0,256);
MatOfInt histSize = new MatOfInt(255);
//計算直方圖
Imgproc.calcHist(matList,new MatOfInt(0),new Mat(),histogram,histSize ,ranges);
//創建直方圖面板
Mat histImage = Mat.zeros( 100, (int)histSize.get(0, 0)[0], CvType.CV_8UC1);
//歸一化直方圖
Core.normalize(histogram, histogram, 1, histImage.rows() , Core.NORM_MINMAX, -1, new Mat() );
//繪製幾何直方圖
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("白蛇", histImage);
HighGui.waitKey(0);
}