#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 #define KIDO_SIZE 256 #define GRAPH_HEIGHT 512 void histgram(unsigned int *out, unsigned char *in, int inHeight, int inWidth, int inChannel); void PercentileMethod(unsigned char *out, unsigned int *histData, unsigned char *in, int inHeight, int inWidth, int inChannel, double rate); int main(){ IplImage *in, *out; unsigned int *histData; int i,j; double maxRate; in = cvLoadImage("./image640.bmp", 0); out = cvCreateImage(cvSize(in->width, in->height), in->depth, in->nChannels); histData = (unsigned int *)malloc(sizeof(unsigned int) * (KIDO_SIZE + 1)); // 0初期化 memset(histData, 0, sizeof(unsigned int) * (KIDO_SIZE + 1)); histgram(histData, (unsigned char*)in->imageData, in->height, in->width, in->nChannels); PercentileMethod((unsigned char*)out->imageData, histData,(unsigned char*)in->imageData, in->height, in->width, in->nChannels, 0.3); cvNamedWindow("in", 1); cvShowImage("in", in); cvNamedWindow("out", 1); cvShowImage("out", out); cvWaitKey(-1); cvDestroyWindow("in"); cvDestroyWindow("out"); cvReleaseImage( &in ); cvReleaseImage( &out ); free(histData); 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 ]; } } } } void PercentileMethod(unsigned char *out, unsigned int *histData, unsigned char *in, int inHeight, int inWidth, int inChannel, double rate){ int i, j; int index; int allData = 0; int th; // ヒストグラムの合計 for(i = 0; i < KIDO_SIZE; ++i){ allData += histData[i]; } // rate分のヒストグラムの合計値 th = allData * rate; // rate分のヒストグラムの合計値を超えた輝度を閾値とする allData = 0; for(i = 0; i < KIDO_SIZE; ++i){ allData += histData[i]; if(allData > th){ th = i; break; } } for(i = 0; i < inHeight; ++i){ for(j = 0; j < inWidth; ++j){ index = i * inWidth + j; if(in[index] > th){ out[index] = 255; } else { out[index] = 0; } } } }