OpenCVの使い方(3) カラーヒストグラムの生成
Sponsored Links
皆さんこんにちは
お元気ですか。私は久々に疲れを取ってます
さて、本日もOpencv
前回、ピクセルへのアクセスを行ったので、今回はヒストグラムを作りましょう
カラーヒストグラム
画像の類似度を計測するのによく使われる尺度であります。
まぁ要は一つひとつのピクセルが集まって、画像を構成しているので画像の構成要素を調べましょ!みたいな感じです。
あまり細かくとっても、人間が見極められないので、今回は32pixelごとに区切ったものを使います。
(0-31,32-63......,0-31が同じ扱いです。)
ソースコード
#include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/nonfree/nonfree.hpp> using namespace std; using namespace cv; class Image{ private: Mat image; void pointer(); void iterator(); void atData(); void execPoint(); void readData(); public: Image(string path); void executeProgram(); void createHistogram(); int calcIndex(int pixel,int index); }; Image::Image(string path){ image = cv::imread(path); } void Image::createHistogram(){ int index = 32; vector<vector<int> > histogram(3); for(int i = 0; i < 3; i++){ vector<int> hist(255 / index + 1); fill(hist.begin(),hist.end(),0); histogram[i] = hist; } for(int height = 0; height < image.rows; height++){ for(int width = 0; width < image.cols; width++){ int blue_pixel = image.data[height * image.step + width * image.elemSize() + 0]; histogram[0][calcIndex(blue_pixel, index)]++; int green_pixel = image.data[height * image.step + width * image.elemSize() + 1]; histogram[1][calcIndex(green_pixel, index)]++; int red_pixel = image.data[height * image.step + width * image.elemSize() + 2]; histogram[2][calcIndex(red_pixel, index)]++; } } for(int i = 0; i < histogram.size(); i++){ for(int j = 0; j < histogram[i].size(); j++){ cout << j<< " " << histogram[i][j] << endl; } } } int Image::calcIndex(int pixel,int index){ return pixel / index; } int main(int argc, char const *argv[]){ Image image(argv[1]); image.createHistogram(); return 0; }
解析画像
画像認識で有名な画像であるlennaさんを使います。
実際にやってみた結果