繪制灰度直方圖(OpenCV + Java)
標簽: OpenCV
本文介紹一下如何使用Java語言繪制灰度圖的直方圖。由于Java環境下OpenCV不提供Mat圖像的顯示方法,如imshow(),因此需要使用SWing組件自己編寫顯示方法。同時,OpenCV的Jar包也并沒有提供相關的抽象數據類型和方法,比如CvHistogram等。
灰度直方圖是灰度級的函數,描述圖像中該灰度級的像素個數(或該灰度級像素出現的頻率):其橫坐標是灰度級,縱坐標表示圖像中該灰度級出現的個數(頻率)。下面的方法是繪制一張灰度圖的直方圖:
/**
* Plot histogram of a single channel grayscale image
*
* @param img a single channel grayscale image
*/
public static void plotGrayHistogram(Mat img) {
java.util.List<Mat> images = new ArrayList<>();
images.add(img);
MatOfInt channels = new MatOfInt(0); // 圖像通道數,0表示只有一個通道
MatOfInt histSize = new MatOfInt(256); // CV_8U類型的圖片范圍是0~255,共有256個灰度級
Mat histogramOfGray = new Mat(); // 輸出直方圖結果,共有256行,行數的相當于對應灰度值,每一行的值相當于該灰度值所占比例
MatOfFloat histRange = new MatOfFloat(0, 255);
Imgproc.calcHist(images, channels, new Mat(), histogramOfGray, histSize, histRange, false); // 計算直方圖
// 按行歸一化
Core.normalize(histogramOfGray, histogramOfGray, 0, histogramOfGray.rows(), Core.NORM_MINMAX, -1, new Mat());
// 創建畫布
int histImgRows = 300;
int histImgCols = 300;
int colStep = (int) Math.floor(histImgCols / histSize.get(0, 0)[0]);
Mat histImg = new Mat(histImgRows, histImgCols, CvType.CV_8UC3, new Scalar(255,255,255)); // 重新建一張圖片,繪制直方圖
for (int i = 0; i < histSize.get(0, 0)[0]; i++) { // 畫出每一個灰度級分量的比例,注意OpenCV將Mat最左上角的點作為坐標原點
Imgproc.line(histImg,
new org.opencv.core.Point(colStep * i, histImgRows - 20),
new org.opencv.core.Point(colStep * i, histImgRows - Math.round(histogramOfGray.get(i, 0)[0]) - 20),
new Scalar(0, 0,0), 2,8,0);
if (i%50 == 0) {
Imgproc.putText(histImg, Integer.toString(i), new org.opencv.core.Point(colStep * i, histImgRows - 5), 1, 1, new Scalar(0, 0, 0)); // 附上x軸刻度
}
}
MatView.imshow(histImg, "Gray Histogram");
}
下面的方法是在Java環境下顯示一張Mat圖像:
/**
* Display Mat image
*
* @param image
* @param windowName
*/
public static void imshow(Mat image, String windowName){
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
JFrame jFrame = new JFrame(windowName);
JLabel imageView = new JLabel();
final JScrollPane imageScrollPane = new JScrollPane(imageView);
imageScrollPane.setPreferredSize(new Dimension(500, 500)); // set window size
jFrame.add(imageScrollPane, BorderLayout.CENTER);
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Image loadedImage = Mat2BufferedImage(image);
imageView.setIcon(new ImageIcon(loadedImage));
jFrame.pack();
jFrame.setLocationRelativeTo(null);
jFrame.setVisible(true);
}
下圖分別是測試原圖圖與其對應的灰度圖和直方圖:
智能推薦
opencv python matplotlib.pyplot.hist() 如何繪制灰度直方圖,如何根據灰度直方圖確定最優二值化值
什么是灰度直方圖? 圖像直方圖(histogram)是圖像的統計學特征,常用于了解圖像的基本特征以便分析。不過圖像的直方圖不具有空間特征。 圖像的灰度直方圖(histogram),就是將圖像轉化成灰度圖像之后,統計各個像素點的灰度值,繪制成直方圖,其橫軸是灰度值(0,255),縱軸是該灰度值所對應的像素的數目。對灰度直方圖做積分=圖像的size。 使用pyplot繪制灰度直方圖 原圖: 結果: 注...
【openCV-python系列學習】五、openCV灰度直方圖繪制
openCV繪制直方圖 先直接放代碼: 其中: .hist()作用是繪制直方圖 .ravel()作用是將多維數組降為一維數組,格式為:一維數組 = 多維數組.ravel() 輸入圖片: 輸出結果: 注意,在繪制的直方圖中,橫坐標表示圖像中各個像素點的灰度級,縱坐標表示具有該灰度級的像素個數。 開始學習openCV第五課,主要學習來源: [Python圖像處理] 十一.灰度直方圖概念及...
opencv筆記(十一)——灰度直方圖
一、灰度直方圖 c++的原型函數:void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const floa...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
猜你喜歡
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...