Visual Studio 2013 Express Visual C++( アンマネージドコード ) OpenCV 3.1 |
■242.OpenCV ヒストグラム | Prev Top Next | |
|
今回は画像の全ピクセルに対するHSV色空間上での成分ごとの強さをヒストグラムで表現します。
#include <iostream> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #pragma comment( lib, "opencv_world300d.lib" ) void createHist( std::string readPath ) { cv::Mat src, hsv; // 画像読み込み src = cv::imread(readPath, cv::IMREAD_COLOR); // BGR色空間をHSV色空間に変換 // HSVとは、色相(Hue)、彩度(Saturation・Chroma)、明度(Value・Lightness・Brightness) cv::cvtColor(src, hsv, CV_BGR2HSV); // HSV色空間のどのチャンネルのヒストグラムを作成するかをここで指定 // 色相( 0を指定 )、彩度( 1を指定 )、明度( 2を指定 ) const int channels[] = { 2 }; // 出力されるヒストグラム cv::MatND hist; // ヒストグラムの次元数 const int dims = 1; // 320 分割レベルで量子化 const int bins = 320; // 出力するチャンネルの分割レベルを指定 const int histSize[] = { bins }; // 色相の範囲は 0 から 179 らしい const float hranges[] = { 0, 180 }; // 彩度の範囲は 0 (黒-灰色-白)から 255 (純粋なスペクトルカラー)まで const float sranges[] = { 0, 256 }; // 明度の範囲は 0 から 255 まで const float vranges[] = { 0, 256 }; // 範囲を指定 const float *ranges[] = { vranges }; // ヒストグラム生成 // HSV色空間で指定したチャンネルについて全ピクセルの色の総数を出力する cv::calcHist(&hsv, 1, // 入力配列の個数 channels, cv::Mat(), // マスクは使用しない hist, dims, histSize, ranges, true, false); // std::cout << hist << std::endl; double maxVal = 0; // ヒストグラムの各データの最大値を取得 cv::minMaxLoc(hist, 0, &maxVal, 0, 0); // ヒストグラムの高さ const int height = 100; // ヒストグラムの行列を 0 クリア cv::Mat histImg = cv::Mat::zeros(height, // 行の最大値 bins, // 列の最大値 CV_8UC3 // 符号なし8bit整数、チャンネル数3 ); // ヒストグラムを表示する for (int s = 0; s < bins; s++) { // ヒストグラムの値を取得 float binVal = hist.at<float>(s, 0); // 値を 0 - height の範囲内に変換し銀行丸め int intensity = cvRound(binVal * height / maxVal); // 矩形描画 cv::rectangle(histImg, cv::Point(s, height - intensity), // 矩形の1つ目の点の座標 cv::Point(s + 1, height), // 対角線上にあるもう一つの点の座標 cv::Scalar::all(255), // 矩形の色 CV_FILLED // 矩形の枠線の太さ。CV_FILLEDの場合塗りつぶし ); } // 元画像のウィンドウ表示 cv::namedWindow("Source", 1); imshow("Source", src); // ヒストグラムのウィンドウ表示 cv::namedWindow("HSV Histogram", 1); imshow("HSV Histogram", histImg); // キー入力待ち cv::waitKey(0); } int main(int argc, const char* argv[]) { int hr = -1; try { createHist("D:/TEMP/MaverickProj/Image/OpenCV/04/Texture.png"); std::cout << "Successed" << std::endl; hr = 0; } catch (cv::Exception ex) { std::cout << ex.err << std::endl; } // ウィンドウの破棄 cv::destroyAllWindows(); return hr; }