double Block::GetDistanceTo(Block& block) { double rDistance = 0.0; double gDistance = 0.0; double bDistance = 0.0; for (int i = 0; i < Block::P; ++i) { for (int j = 0; j < Block::Q; ++j) { rDistance += std::abs((double)(this->block[i][j].GetR() - block.GetBlockPixel(i,j).GetR())); gDistance += std::abs((double)(this->block[i][j].GetG() - block.GetBlockPixel(i,j).GetG())); bDistance += std::abs((double)(this->block[i][j].GetB() - block.GetBlockPixel(i,j).GetB())); } } /*cout << "rDist = " << rDistance << " / P=" << Block::P << " / Q=" << Block::Q << endl; cout << "gDist = " << gDistance << " / P=" << Block::P << " / Q=" << Block::Q << endl; cout << "bDist = " << bDistance << " / P=" << Block::P << " / Q=" << Block::Q << endl;*/ rDistance /= (Block::P * Block::Q); gDistance /= (Block::P * Block::Q); bDistance /= (Block::P * Block::Q); //cout << "Distance is: " << (rDistance + gDistance + bDistance) / 3 << endl; return (rDistance + gDistance + bDistance) / 3; }
void Huffman::GenerateIndexFromCodes(GHT& ght, Image& image) { Node *root = new Node(); for (int i = 0; i < this->codes.size(); ++i) { this->CreateHuffmanTreeFromCodes(root, i, 0); } int sIterator = 0; int codeIterator = 0; while (codeIterator < this->compressedCode.size()) { this->GetHuffmanIndex(root, codeIterator, sIterator, ght); ++sIterator; } int sIndex = 0; for (int imageX = 0; imageX < image.GetImageSizeI(); imageX += Block::P) { for (int imageY = 0; imageY < image.GetImageSizeJ(); imageY += Block::Q) { int blockIndex = ght.GetS(sIndex++); Block block = ght.GetBlockFromC(blockIndex); for (int u = 0; u < Block::P; ++u) { for (int v = 0; v < Block::Q; ++v) { Pixel pixel = block.GetBlockPixel(u,v); image.SetImagePixel(imageX + u, imageY + v, pixel); } } } } delete root; }