diff --git a/include/hdrplus/merge.h b/include/hdrplus/merge.h index 68956ea..d3aa550 100644 --- a/include/hdrplus/merge.h +++ b/include/hdrplus/merge.h @@ -2,6 +2,7 @@ #include #include // all opencv header +#include #include "hdrplus/burst.h" namespace hdrplus @@ -26,6 +27,35 @@ class merge */ void process( const hdrplus::burst& burst_images, \ std::vector>>>& alignments); + + private: + cv::Mat cosineWindow1D(cv::Mat input, int window_size = 16) { + cv::Mat output = input.clone(); + for (int i = 0; i < input.cols; ++i) { + output.at(0, i) = 1. / 2. - 1. / 2. * cos(2 * M_PI * (input.at(0, i) + 1 / 2.) / window_size); + } + return output; + } + + cv::Mat cosineWindow2D(cv::Mat tile) { + int window_size = tile.rows; // Assuming square tile + cv::Mat output_tile = tile.clone(); + + cv::Mat window = cv::Mat::zeros(1, window_size, CV_32F); + for(int i = 0; i < window_size; ++i) { + window.at(i) = i; + } + + cv::Mat window_x = cosineWindow1D(window, window_size); + window_x = cv::repeat(window_x, window_size, 1); + cv::Mat window_2d = window_x.mul(window_x.t()); + + cv::Mat window_applied; + cv::multiply(tile, window_2d, window_applied, 1, CV_32F); + return window_applied; + } + + std::vector getReferenceTiles(cv::Mat reference_image); }; } // namespace hdrplus diff --git a/src/merge.cpp b/src/merge.cpp index 21b8204..ed7602b 100644 --- a/src/merge.cpp +++ b/src/merge.cpp @@ -14,24 +14,26 @@ void merge::process( const hdrplus::burst& burst_images, \ std::tie(lambda_shot, lambda_read) = burst_images.bayer_images[burst_images.reference_image_idx].get_noise_params(); // Obtain tiles - std::vector reference_tiles; cv::Mat reference_image = burst_images.grayscale_images_pad[0]; - std::cout << reference_image.rows << " " << reference_image.cols << std::endl; - for (int y = 0; y < reference_image.rows - 8; y += 8) { - for (int x = 0; x < reference_image.cols - 8; x += 8) { - cv::Mat tile = reference_image(cv::Rect(x, y, 16, 16)); - reference_tiles.push_back(tile); - } - } - - + std::vector reference_tiles = getReferenceTiles(reference_image); // cv::Mat outputImg = reference_image.clone(); // cv::cvtColor(outputImg, outputImg, cv::COLOR_GRAY2RGB); // cv::imwrite("ref.jpg", outputImg); - // cv::Mat outputImg1 = reference_tiles[0].clone(); + // cv::Mat outputImg1 = cosineWindow2D(reference_tiles[0].clone()); // cv::cvtColor(outputImg1, outputImg1, cv::COLOR_GRAY2RGB); // cv::imwrite("tile0.jpg", outputImg1); } +std::vector merge::getReferenceTiles(cv::Mat reference_image) { + std::vector reference_tiles; + for (int y = 0; y < reference_image.rows - 8; y += 8) { + for (int x = 0; x < reference_image.cols - 8; x += 8) { + cv::Mat tile = reference_image(cv::Rect(x, y, 16, 16)); + reference_tiles.push_back(tile); + } + } + return reference_tiles; +} + } // namespace hdrplus