Як вызначыць сродкі блокаў выявы з выкарыстаннем OpenCV гістаграмы

Я хацеў бы, каб вызначыць сярэдні блок майго малюнка з дапамогай гістаграмы. Скажам, маё малюнак мае 64 па 64 памер, мне трэба падзяліць яго на 4 на 4 блока, то вызначаюць кожны блок сярэдняга (гэта значыць зараз у мяне будзе 4 блокаў).

Выкарыстанне OpenCV, Як я магу выкарыстоўваць мой IplImage для вызначэння блока азначае выкарыстанне гістаграмы бункераў?

Код ніжэй OpenCV гістаграмы для таго, каб вызначыць ўсю сярэдзіну малюнка:

int i, hist_size = 256;
float max_value,min_value;
float min_idx,max_idx;
float bin_w;
float mean =0, low_mean =0, high_mean =0, variance =0;

float range_0[]={0,256};
float *ranges[]={range_0};

IplImage* im = cvLoadImage("killerbee.jpg");
//Create a single planed image of the same size as the original
IplImage* grayImage = cvCreateImage(cvSize(im->width,im->height),IPL_DEPTH_8U, 1);
//convert the original image to gray
cvCvtColor(im, grayImage, CV_BGR2GRAY);

/* Remark this, since wanna evaluate whole area.
    //create a rectangular area to evaluate
    CvRect rect = cvRect(0, 0, 500, 600 );
    //apply the rectangle to the image and establish a region of interest
    cvSetImageROI(grayImage, rect);
End remark*/

//create an image to hold the histogram
IplImage* histImage = cvCreateImage(cvSize(320,200), 8, 1);
//create a histogram to store the information from the image
CvHistogram* hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
//calculate the histogram and apply to hist
cvCalcHist( &grayImage, hist, 0, NULL );

//grab the min and max values and their indeces
cvGetMinMaxHistValue( hist, &min_value, &max_value, 0, 0);
//scale the bin values so that they will fit in the image representation
cvScale( hist->bins, hist->bins, ((double)histImage->height)/max_value, 0 );

//set all histogram values to 255
cvSet( histImage, cvScalarAll(255), 0 );
//create a factor for scaling along the width
bin_w = cvRound((double)histImage->width/hist_size);

for( i = 0; i < hist_size; i++ ) {
    //draw the histogram data onto the histogram image
    cvRectangle( histImage, cvPoint(i*bin_w, histImage->height),cvPoint((i+1)*bin_w,histImage->height - cvRound(cvGetReal1D(hist->bins,i))),cvScalarAll(0), -1, 8, 0 );
    //get the value at the current histogram bucket
    float* bins = cvGetHistValue_1D(hist,i);
    //increment the mean value
    mean += bins[0];
}
//finish mean calculation
mean /= hist_size;

//display mean value onto output window
cout<<"MEAN VALUE of THIS IMAGE : "<<"\n";

//go back through now that mean has been calculated in order to calculate variance
for( i = 0; i < hist_size; i++ ) {
    float* bins = cvGetHistValue_1D(hist,i);
    variance += pow((bins[0] - mean),2);
}
//finish variance calculation
variance /= hist_size;
cvNamedWindow("Original", 0);
cvShowImage("Original", im );

cvNamedWindow("Gray", 0);
cvShowImage("Gray", grayImage );

cvNamedWindow("Histogram", 0);
cvShowImage("Histogram", histImage );

//hold the images until a key is pressed
cvWaitKey(0);

//clean up images
cvReleaseImage(&histImage);
cvReleaseImage(&grayImage);
cvReleaseImage(&im);

//remove windows
cvDestroyWindow("Original");
cvDestroyWindow("Gray");
cvDestroyWindow("Histogram");

Сапраўды дзякуй загадзя.

0

1 адказы

Вы можаце зрабіць гэта з дапамогай гістаграм, але значна больш эфектыўнага спосабам зрабіць гэта з'яўляецца цэласным чынам, які робіць амаль тое, што вы хочаце.

Чытайце тут http://en.wikipedia.org/wiki/Summed_area_table , а затым выкарыстоўваць яго для разліку сума ўсіх пікселяў ў кожным блоку. Затым падзяліць на колькасць пікселяў ў кожным блоку (4х4 = 16). Хіба гэта не прыемна?

OpenCV мае функцыю для вылічэнні інтэгральнага малюнка, з цяжкім назвай гатунку :: інтэгральную ()

І яшчэ больш просты спосаб зрабіць гэта з'яўляецца сціплым змены памеру ().

Выклік змяніць памер (image64_64, image_16_16, памер (16, 16), INTER_AREA), і вынік будзе менш малюнкаў, значэнне якога пікселі мае сапраўды значэнне, якія вы шукаеце. Хіба гэта не выдатна?

Толькі не забудзьцеся сцяг INTER_AREA. Ён вызначае правільны алгарытм, які будзе выкарыстоўвацца.

0
дададзена
дзякуй за адказ і разуменне, так як мне патрэбна гістаграма, а таксама для далейшых мэтаў, такім чынам, я да гэтага часу аддаю перавагу выкарыстоўваць гістаграму. Любая ідэя, каб працягваць выкарыстоўваць гістаграму, каб вызначыць блок на ўвазе?
дададзена аўтар Mr.K, крыніца