#include #include "cv.h" #include "cxcore.h" #include "highgui.h" #pragma comment(lib,"cv.lib") #pragma comment(lib,"cxcore.lib") #pragma comment(lib,"highgui.lib") #define KIDO_SIZE 256 #define GRAPH_HEIGHT 512 void histgram(unsigned int *out, unsigned char *in, int inHeight, int inWidth, int inChannel); int main(){ IplImage *in, *graph; unsigned int *outData; int i,j; double maxRate; in = cvLoadImage("./image640.bmp", 0); graph = cvCreateImage(cvSize(KIDO_SIZE, GRAPH_HEIGHT), in->depth, in->nChannels); outData = (unsigned int *)malloc(sizeof(unsigned int) * (KIDO_SIZE + 1)); // 0初期化 memset(outData, 0, sizeof(unsigned int) * (KIDO_SIZE + 1)); histgram(outData, (unsigned char*)in->imageData, in->height, in->width, in->nChannels); // 最大数の要素の値がグラフの最大値に来るように調整 maxRate = (double)graph->height / (double)outData[KIDO_SIZE]; for(i = 0; i < KIDO_SIZE; ++i){ cvLine(graph, cvPoint(i, graph->height - outData[i] * maxRate), cvPoint(i, graph->height), CV_RGB(255, 255, 255), 1); } cvNamedWindow("in", 1); cvShowImage("in", in); cvNamedWindow("graph", 1); cvShowImage("graph", graph); cvWaitKey(-1); cvDestroyWindow("in"); cvDestroyWindow("graph"); cvReleaseImage( &in ); cvReleaseImage( &graph ); free(outData); return 0; } void histgram(unsigned int *out, unsigned char *in, int inHeight, int inWidth, int inChannel){ int i, j; int index; for(i = 0; i < inHeight; ++i){ for(j = 0; j < inWidth; ++j){ // 入力画像の輝度値と等しい配列番号の要素をインクリメント index = in[i * inWidth + j]; ++out[ index ]; // 最大値を格納する if(out[KIDO_SIZE] < out[ index ]){ out[KIDO_SIZE] = out[ index ]; } } } }