#include "imgmanipbs.h" #include ImgManipBS::ImgManipBS() { width = height = 0; } ImgManipBS::ImgManipBS(const char* fileName) { mainImage = CImg<>(fileName); width = mainImage.width(); height = mainImage.height(); noOfWSquares = width / squareSize; noOfHSquares = height / squareSize; whiteMeanValues = new int*[noOfWSquares]; blackMeanValues = new int*[noOfWSquares]; for (int i = 0; i < noOfWSquares; ++i) { whiteMeanValues[i] = new int[noOfHSquares]; blackMeanValues[i] = new int[noOfHSquares]; } // Output image outImages[0] = CImg<>(width,height); // B&W Image with same size: White outImages[1] = CImg<>(width,height); // B&W Image with same size: Black printf("Original image size %dx%d\n",width,height); EvaluateImage(); CreateGradiantImage(); outImages[0].save_jpeg("ref_white.jpg"); outImages[1].save_jpeg("ref_black.jpg"); printf("Done.\n"); } void ImgManipBS::CreateGradiantImage() { for(auto yy = 0; yy < noOfHSquares-1; yy++) { for (auto xx = 0; xx < noOfWSquares-1; xx++ ) { int x = (xx*squareSize) + squareMargin; int y = (yy*squareSize) + squareMargin; DrawGradRect(0, x,y,whiteMeanValues[xx][yy],whiteMeanValues[xx+1][yy],whiteMeanValues[xx][yy+1],whiteMeanValues[xx+1][yy+1]); DrawGradRect(1, x,y,blackMeanValues[xx][yy],blackMeanValues[xx+1][yy],blackMeanValues[xx][yy+1],blackMeanValues[xx+1][yy+1]); if( yy == 0 ) // Only top row { DrawTopGradRect(0,x,0,whiteMeanValues[xx][yy],whiteMeanValues[xx+1][yy]); DrawTopGradRect(1,x,0,blackMeanValues[xx][yy],blackMeanValues[xx+1][yy]); } } } } void ImgManipBS::DrawGradRect(int imageNo,int x,int y, unsigned char p1, unsigned char p2, unsigned char p3, unsigned char p4) { CImg tempImage = CImg<>(squareSize,squareSize); // Black and white image const unsigned char white[] = { 255,255,255 }; const float opacity=1.0; float fp1 = (1.0 / 255) * p1; float fp2 = (1.0 / 255) * p2; float fp3 = (1.0 / 255) * p3; float fp4 = (1.0 / 255) * p4; tempImage.draw_triangle(0,0,0,squareSize,squareSize,squareSize,white,fp1,fp3,fp4,opacity); tempImage.draw_triangle(0,0,squareSize,0,squareSize,squareSize,white,fp1,fp2,fp4,opacity); outImages[imageNo].draw_image(x,y,tempImage); } void ImgManipBS::DrawTopGradRect(int imageNo,int x,int y, unsigned char p1, unsigned char p2) { CImg tempImage = CImg<>(squareSize,squareMargin); // Black and white image const unsigned char white[] = { 255,255,255 }; const float opacity=1.0; float fp1 = (1.0 / 255) * p1; float fp2 = (1.0 / 255) * p2; tempImage.draw_triangle(0,0,0,squareSize,squareSize,squareSize,white,fp1,fp1,fp2,opacity); tempImage.draw_triangle(0,0,squareSize,0,squareSize,squareSize,white,fp1,fp2,fp2,opacity); outImages[imageNo].draw_image(x,y,tempImage); } void ImgManipBS::EvaluateImage() { printf("Starting to evaluate image....\n\n"); for(auto yy = 0; yy < noOfHSquares; yy++) { for (auto xx = 0; xx < noOfWSquares; xx++ ) { int x = (xx*squareSize) + squareMargin; int y = (yy*squareSize) + squareMargin; double mW,mB; findNearValues(x,y,mW,mB); whiteMeanValues[xx][yy] = mW; blackMeanValues[xx][yy] = mB; //printf("%d,%d #%x%x%x ",x,y,(int)mW,(int)mW,(int)mW);*/ //MarkPixelInOutImage(0, x,y); } } printf("\n"); } void ImgManipBS::findNearValues(int x,int y, double &meanWhite, double &meanBlack) { std::list brList; for(auto yy=y-(measureSquareSize/2);yy<=y+(measureSquareSize/2);yy++) { for(auto xx=x-(measureSquareSize/2);xx<=x+(measureSquareSize/2);xx++) { double br = GetBrightness(xx,yy); brList.push_back( br ); //MarkPixelInOutImage(0, xx,yy); } } brList.sort(); // Iterate through the list from the front (most black) std::list::iterator it=brList.begin(); double brSum=0; int cnt=0; for( auto i=0; i < noOfMeanValues && it != brList.end(); i++ ) { brSum += *it; cnt++; it++; } meanBlack = brSum / cnt; // Iterate through the list from the end (most white) it=brList.end(); brSum=0; cnt=0; for( auto i=0; i < noOfMeanValues && it != brList.begin(); i++ ) { brSum += *it; cnt++; it--; } meanWhite = brSum / cnt; } void ImgManipBS::MarkPixelInOutImage(int imageNo,int x,int y) { outImages[imageNo](x,y,0,0) = 255; outImages[imageNo](x,y,0,1) = 255; //outImages[imageNo](x,y,0,2) = 255; } double ImgManipBS::GetBrightness(unsigned int x,unsigned int y) { return( (mainImage(x,y,0,0)+mainImage(x,y,0,1)+mainImage(x,y,0,2))/3 ); }