void P3Grayscale::convertToMonochrome()
{
	fstream image(fileName);
	skipHeader(image);

	int amountOfPixelsInImage = 0;
	int num;
	for (; false == image.eof(); amountOfPixelsInImage++)
	{
		image >> num;
		image >> num;
		image >> num;
	}

	image.clear();
	image.seekg(0);
	skipHeader(image);

	int numToCheck;
	int* blackAndWhitePixelValues = new int[amountOfPixelsInImage];

	for (int i = 0; i < amountOfPixelsInImage; i++)
	{
		image >> numToCheck;
		image >> numToCheck;
		image >> numToCheck;
		if (numToCheck <= maxValue / 2)
			blackAndWhitePixelValues[i] = 0;
		else
			blackAndWhitePixelValues[i] = maxValue;
	}

	image.close();

	ifstream imageOriginal(fileName);
	ofstream imageCopy(fileCopyName);

	copyHeader(imageCopy, imageOriginal);

	imageOriginal.close();

	for (int i = 0; i < amountOfPixelsInImage; i++)
	{
		imageCopy << blackAndWhitePixelValues[i] << ' '; //R
		imageCopy << blackAndWhitePixelValues[i] << ' '; //G
		imageCopy << blackAndWhitePixelValues[i] << ' '; //B
	}
	imageCopy.close();
	delete[] blackAndWhitePixelValues;
}
   static void Apply( GenericImage<P>& image, const LocalHistogramEqualizationInstance& instance )
   {
      if ( image.IsColor() )
      {
         Image L;
         image.GetLightness( L );
         L.Status() = image.Status();
         Apply( L, instance );
         image.Status() = L.Status();
         image.SetLightness( L );
         return;
      }

      // create copy of the luminance to evaluate histogram from
      GenericImage<P> imageCopy( image );
      imageCopy.EnsureUnique(); // really not necessary, but we'll be safer if this is done

      size_type N = image.NumberOfPixels();

      int numberOfThreads = Thread::NumberOfThreads( image.Height(), 1 );
      int rowsPerThread = image.Height()/numberOfThreads;

      image.Status().Initialize( "CLAHE", N );

      AbstractImage::ThreadData data( image, N );

      // create processing threads
      ReferenceArray<LocalHistogramEqualizationThread<P> > threads;
      for ( int i = 0, j = 1; i < numberOfThreads; ++i, ++j )
         threads.Add( new LocalHistogramEqualizationThread<P>( data,
                                 instance,
                                 image,
                                 imageCopy,
                                 i*rowsPerThread,
                                 (j < numberOfThreads) ? j*rowsPerThread : image.Height() ) );

      AbstractImage::RunThreads( threads, data );

      threads.Destroy();

      image.Status() = data.status;
   }
void P6Grayscale::convertToMonochrome()
{
	fstream image(fileName, ios::binary);
	skipHeader(image);

	int amountOfPixelsInImage = 0;
	unsigned char num[1];
	unsigned char* numP = &num[0];

	for (; false == image.eof(); amountOfPixelsInImage++)
	{
		image.read((char*)numP, 1);
		image.read((char*)numP, 1);
		image.read((char*)numP, 1);
	}

	image.clear();
	image.seekg(0);
	skipHeader(image);

	unsigned char numToCheck[1];
	unsigned char* numToCheckPointer = &numToCheck[0];
	unsigned char* blackAndWhitePixelValues;
	try
	{
		blackAndWhitePixelValues = new unsigned char[amountOfPixelsInImage];
	}
	catch (exception& e)
	{
		cout << "Standard exception: " << e.what() << endl;
		return;
	}

	for (int i = 0; i < amountOfPixelsInImage; i++)
	{
		image.read((char*)numToCheckPointer, 1);
		image.read((char*)numToCheckPointer, 1);
		image.read((char*)numToCheckPointer, 1);
		if (numToCheck[0] <= maxValue / 2)
			blackAndWhitePixelValues[i] = 0;
		else
			blackAndWhitePixelValues[i] = maxValue;
	}

	image.close();

	ifstream imageOriginal(fileName, ios::binary);
	ofstream imageCopy(fileCopyName, ios::binary);

	copyHeader(imageCopy, imageOriginal);

	unsigned char* blackAndWhitePixelValuesPointer = &blackAndWhitePixelValues[0];
	for (int i = 0; i < amountOfPixelsInImage; i++, blackAndWhitePixelValuesPointer++)
	{
		image.write((char*)blackAndWhitePixelValuesPointer, 1);
		image.write((char*)blackAndWhitePixelValuesPointer, 1);
		image.write((char*)blackAndWhitePixelValuesPointer, 1);
	}
	image.close();
	delete[] blackAndWhitePixelValues;
}