Skip to content
Snippets Groups Projects
Commit ec88c19e authored by theazgra's avatar theazgra
Browse files

Diff_next, but bugged, need to switch to smart pointers.

parent 2e425629
No related branches found
No related tags found
No related merge requests found
......@@ -322,6 +322,30 @@ ImageMatrix CziFile::get_image(const uint subblockId)
return image;
}
void CziFile::differences_between_next(const std::string baseName)
{
if (subBlockDirectory.entries.size() <= 1)
{
printf("There aren't 2 different images in this CZI file.\n");
return;
}
std::string fName;
for (size_t i = 1; i < subBlockDirectory.entries.size(); i++)
{
fName = baseName + "diff_" + std::to_string(i - 1) + "_" + std::to_string(i) + ".ppm";
ImageMatrix ref = get_image(i - 1);
ImageMatrix next = get_image(i);
ImageMatrix diff_ref_next = ref.create_difference_matrix(next);
diff_ref_next.save_as_ppm(fName.c_str());
printf("Saved %s\n", fName.c_str());
}
}
// void CziFile::extract_images(const std::string &baseName) const
// {
// BinaryFileStream cziStream(fileName);
......
......@@ -31,6 +31,8 @@ public:
ImageMatrix get_image(const uint subblockId);
void dump_image_data(const std::string &baseName) const;
//void extract_images(const std::string &baseName) const;
// Save differences between next images, so 0x1;1x2;...
void differences_between_next(const std::string baseName);
};
#include "czi_file.cpp"
\ No newline at end of file
......@@ -114,8 +114,8 @@ ImageMatrix::ImageMatrix(const uint width, const uint height, const PixelType pi
{
always_assert(width > 0 && height > 0 && pixelType != PixelType_None);
this->rowCount = rowCount;
this->colCount = colCount;
this->rowCount = height;
this->colCount = width;
this->pixelType = pixelType;
// Allocate memory.
......@@ -142,10 +142,13 @@ ImageMatrix::ImageMatrix(const uint width, const uint height, const PixelType pi
ImageMatrix::~ImageMatrix()
{
//TODO: This is bonkers bad. Let's use either std::shared_ptr or std::unique_ptr...
printf("ImageMatrix destructor...\n");
for (size_t i = 0; i < data.size(); i++)
{
if (data[i])
printf("Trying to delete data[%lu]\n", i);
if (data[i] && !data[i]->isEmpty)
{
delete data[i];
}
......@@ -190,11 +193,10 @@ bool ImageMatrix::operator!=(const ImageMatrix &other) const
return (!equals(other));
}
void ImageMatrix::save_as_ppm(std::string baseFileName) const
void ImageMatrix::save_as_ppm(const char *fName) const
{
always_assert((this->pixelType == PixelType_Gray8 || this->pixelType == PixelType_Bgr24) && "Currently only those pixel types are supported.");
std::string fName = baseFileName + ".ppm";
if (this->pixelType == PixelType_Gray8)
{
auto bwImage = cimg_wrapper::create_grayscale_image(colCount, rowCount);
......@@ -206,7 +208,7 @@ void ImageMatrix::save_as_ppm(std::string baseFileName) const
cimg_wrapper::set_grayscale_pixel(bwImage, row, col, ((Gray8Pixel *)data[index++])->value);
}
}
bwImage.save_pnm(fName.c_str());
bwImage.save_pnm(fName);
}
else if (this->pixelType == PixelType_Bgr24)
{
......@@ -221,7 +223,7 @@ void ImageMatrix::save_as_ppm(std::string baseFileName) const
cimg_wrapper::set_color_pixel(colorImage, row, col, *px);
}
}
colorImage.save_pnm(fName.c_str());
colorImage.save_pnm(fName);
}
}
......@@ -244,7 +246,7 @@ ImageMatrix ImageMatrix::create_difference_matrix(const ImageMatrix &other)
ulong diffCounter = 0;
for (size_t i = 0; i < size; i++)
{
if (!(this->data[i]->equals(other.get(size))))
if (!(this->data[i]->equals(other.get(i))))
{
diffCounter++;
diff.set(i, whitePixel);
......
......@@ -6,56 +6,57 @@
class ImageMatrix
{
private:
// Number of rows, height of an image.
uint rowCount;
// Number of columns, width of an image.
uint colCount;
// Image data.
std::vector<BasePixel *> data;
// Type of an image pixel.
PixelType pixelType = PixelType_None;
private:
// Number of rows, height of an image.
uint rowCount;
// Number of columns, width of an image.
uint colCount;
//TODO: Bad.Bad.Bad. Replace with smart pointer.
// Image data.
std::vector<BasePixel *> data;
// Type of an image pixel.
PixelType pixelType = PixelType_None;
// Check equality of two ImageMatrices.
bool equals(const ImageMatrix &other) const;
// Returns function to parse bytes into corresponding Pixel structure based on `PixelType`
std::function<BasePixel *(const std::vector<byte> &, ulong &)> get_pixel_parse_function(const PixelType pixelType);
// Get number of bytes needed to encode specific `PixelType`
int get_bytes_per_pixel_type(const PixelType &pt) const;
// Parse bytes to this matrix.
void parse_bytes_to_image(const std::vector<byte> &bytes, const PixelType &pt);
// Check equality of two ImageMatrices.
bool equals(const ImageMatrix &other) const;
// Returns function to parse bytes into corresponding Pixel structure based on `PixelType`
std::function<BasePixel *(const std::vector<byte> &, ulong &)> get_pixel_parse_function(const PixelType pixelType);
// Get number of bytes needed to encode specific `PixelType`
int get_bytes_per_pixel_type(const PixelType &pt) const;
// Parse bytes to this matrix.
void parse_bytes_to_image(const std::vector<byte> &bytes, const PixelType &pt);
public:
// Default constructor for empty image.
ImageMatrix();
// Constuctor creating an empty image with allocated space.
ImageMatrix(const uint width, const uint height, const PixelType pixelType);
// Constuctor creating image matrix from image data.
ImageMatrix(const uint width, const uint height, const PixelType pixelType, const std::vector<byte> &imageBytes);
~ImageMatrix();
// Get number of rows.
uint rows() const;
// Get number of cols.
uint cols() const;
// Get pixel type of an image.
PixelType pixel_type() const;
// Set pixel at row and col.
inline void set(const uint &row, const uint &col, BasePixel *px);
// Set pixel at raw index.
inline void set(const ulong index, BasePixel *px);
// Get pixel at row and col.
inline const BasePixel *get(const uint &row, const uint &col) const;
// Get pixel at raw index.
inline const BasePixel *get(const ulong index) const;
// Equal operator.
bool operator==(const ImageMatrix &other) const;
// Not equal operator.
bool operator!=(const ImageMatrix &other) const;
// Save Matrix as image, supports pixels: `Bgr24`, `Gray8`
void save_as_ppm(std::string baseFileName) const;
// Set all pixels to one value of `px`.
void fill(BasePixel *px);
ImageMatrix create_difference_matrix(const ImageMatrix &other);
public:
// Default constructor for empty image.
ImageMatrix();
// Constuctor creating an empty image with allocated space.
ImageMatrix(const uint width, const uint height, const PixelType pixelType);
// Constuctor creating image matrix from image data.
ImageMatrix(const uint width, const uint height, const PixelType pixelType, const std::vector<byte> &imageBytes);
~ImageMatrix();
// Get number of rows.
uint rows() const;
// Get number of cols.
uint cols() const;
// Get pixel type of an image.
PixelType pixel_type() const;
// Set pixel at row and col.
inline void set(const uint &row, const uint &col, BasePixel *px);
// Set pixel at raw index.
inline void set(const ulong index, BasePixel *px);
// Get pixel at row and col.
inline const BasePixel *get(const uint &row, const uint &col) const;
// Get pixel at raw index.
inline const BasePixel *get(const ulong index) const;
// Equal operator.
bool operator==(const ImageMatrix &other) const;
// Not equal operator.
bool operator!=(const ImageMatrix &other) const;
// Save Matrix as image, supports pixels: `Bgr24`, `Gray8`
void save_as_ppm(const char *fName) const;
// Set all pixels to one value of `px`.
void fill(BasePixel *px);
ImageMatrix create_difference_matrix(const ImageMatrix &other);
};
#include "image_matrix.cpp"
\ No newline at end of file
......@@ -3,21 +3,17 @@
int main(int argc, char **argv)
{
std::string cziFile;
// #if DEBUG
// printf("***DEBUG MODE***\n");
// if (argc == 1)
// {
// argv[1] = (char *)"/home/mor0146/gitlab/data_project/czi-format/data/MultiResolution-Mosaic.czi";
// argv[2] = (char *)"--dump-image-data";
// argv[3] = (char *)"imgdump/";
// }
// argc = 4;
// cziFile = argv[1];
// #else
// #endif
cziFile = (argc > 1) ? argv[1] : "/home/mor0146/gitlab/data_project/czi-format/data/CZT-Stack-Anno.czi"; //"/home/mor0146/gitlab/data_project/czi-format/data/m2/exampleSingleChannel.czi";
std::string cziFile = (argc > 1) ? argv[1] : "/home/mor0146/gitlab/data_project/czi-format/data/CZT-Stack-Anno.czi"; //"/home/mor0146/gitlab/data_project/czi-format/data/m2/exampleSingleChannel.czi";
if (cziFile == "-v" || cziFile == "--version")
{
#if DEBUG
printf("Running `Debug` version\n.");
#else
printf("Running `Release` version\n.");
#endif
return 0;
}
always_assert(is_file(cziFile));
......@@ -28,6 +24,7 @@ int main(int argc, char **argv)
bool reportAll = method == "--report-verbose";
bool dumpRawImageData = method == "--dump-raw-image-data";
bool dumpImageData = method == "--dump-image-data";
bool nextImageDiff = method == "--diff-next";
auto name = get_filename_without_extension(cziFile);
auto x = get_files_in_parent_directory(cziFile, true);
......@@ -45,10 +42,15 @@ int main(int argc, char **argv)
else if (dumpImageData)
{
auto imgMat = parseResult.get_image(0);
imgMat.save_as_ppm("matrix");
imgMat.save_as_ppm("matrix.ppm");
//TODO: Re-Enable it.
//parseResult.extract_images(dumpName);
}
else if (nextImageDiff)
{
always_assert(dumpName != "");
parseResult.differences_between_next(dumpName);
}
printf("Finished.\n");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment