のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

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さんを使います。

f:id:tereka:20140608123826j:plain

実際にやってみた結果

f:id:tereka:20140608124333p:plainf:id:tereka:20140608124444p:plainf:id:tereka:20140608124450p:plain