diff --git a/ccv/sheet6/CMakeLists.txt b/ccv/sheet6/CMakeLists.txt new file mode 100644 index 0000000..a3d96d3 --- /dev/null +++ b/ccv/sheet6/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.5) +project(sheet6) + +set(CMAKE_CXX_STANDARD 11) + +find_package( OpenCV REQUIRED ) + +add_executable(sheet6 fusion.cpp main.cpp) +target_link_libraries(sheet6 ${OpenCV_LIBS}) diff --git a/ccv/sheet6/fusion.cpp b/ccv/sheet6/fusion.cpp new file mode 100644 index 0000000..36f8d61 --- /dev/null +++ b/ccv/sheet6/fusion.cpp @@ -0,0 +1,40 @@ +#include +#include "fusion.h" + +/** + * Returns the mean fusion of two feature maps. + * + * @param f_on_off feature map on off + * @param f_off_on feature map off on + * @return conspicuity map + */ +cv::Mat mean_fusion(cv::Mat f_on_off, cv::Mat f_off_on) { + cv::Mat C_l = 0.5 * (f_on_off + f_off_on); + double max_on_off; + double max_off_on; + cv::minMaxLoc(f_on_off, nullptr, &max_on_off); + cv::minMaxLoc(f_off_on, nullptr, &max_off_on); + double max = max_on_off >= max_off_on ? max_on_off : max_off_on; + cv::normalize(C_l, C_l, 0, max, cv::NORM_MINMAX, -1); + + return C_l.clone(); +} + +/** + * Returns the max fusion of two feature maps. + * + * @param f_on_off feature map on off + * @param f_off_on feature map off on + * @return constpicuity map + */ +cv::Mat max_fusion(cv::Mat f_on_off, cv::Mat f_off_on) { + cv::Mat C_l = cv::max(f_on_off, f_off_on); + double max_on_off; + double max_off_on; + cv::minMaxLoc(f_on_off, nullptr, &max_on_off); + cv::minMaxLoc(f_off_on, nullptr, &max_off_on); + double max = max_on_off >= max_off_on ? max_on_off : max_off_on; + cv::normalize(C_l, C_l, 0, max, cv::NORM_MINMAX, -1); + + return C_l.clone(); +} diff --git a/ccv/sheet6/fusion.h b/ccv/sheet6/fusion.h new file mode 100644 index 0000000..57eac93 --- /dev/null +++ b/ccv/sheet6/fusion.h @@ -0,0 +1,7 @@ +#ifndef SHEET6_FUSION_H +#define SHEET6_FUSION_H + +cv::Mat mean_fusion(cv::Mat f_on_off, cv::Mat f_off_on); +cv::Mat max_fusion(cv::Mat f_on_off, cv::Mat f_off_on); + +#endif //SHEET6_FUSION_H diff --git a/ccv/sheet6/main.cpp b/ccv/sheet6/main.cpp new file mode 100644 index 0000000..7f38554 --- /dev/null +++ b/ccv/sheet6/main.cpp @@ -0,0 +1,67 @@ +#include +#include "fusion.h" + +int main(int argc, char **argv) { + std::vector on_off(10); + std::vector off_on(10); + for (int i = 0; i < 10; ++i) { + std::stringstream ss; + ss << i; + std::string i_as_str = ss.str(); + + std::string off_on_filename = "../contrasts/off_on_L_" + i_as_str + ".png"; + off_on[i] = cv::imread(off_on_filename.c_str(), CV_LOAD_IMAGE_GRAYSCALE); + off_on[i].convertTo(off_on[i], CV_32F); + + std::string on_off_filename = "../contrasts/on_off_L_" + i_as_str + ".png"; + on_off[i] = cv::imread(on_off_filename.c_str(), CV_LOAD_IMAGE_GRAYSCALE); + on_off[i].convertTo(on_off[i], CV_32F); + + /*cv::namedWindow(off_on_filename.c_str(), CV_WINDOW_NORMAL); + cv::imshow(off_on_filename.c_str(), off_on[i]); + cv::namedWindow(on_off_filename.c_str(), CV_WINDOW_NORMAL); + cv::imshow(on_off_filename.c_str(), on_off[i]); + + cv::waitKey(0); + cv::destroyWindow(off_on_filename.c_str()); + cv::destroyWindow(on_off_filename.c_str());*/ + } + cv::Mat feature_map_on_off = (cv::Mat &&) on_off.at(0); + cv::Mat feature_map_off_on = (cv::Mat &&) off_on.at(0); + cv::Size original_size_on_off = feature_map_on_off.size(); + cv::Size original_size_off_on = feature_map_off_on.size(); + for (unsigned long i = 1; i < 10; i++) { + cv::Mat resized_image; + cv::resize(on_off.at(i), resized_image, original_size_on_off, 0, 0, cv::INTER_CUBIC); + feature_map_on_off += resized_image; + cv::resize(off_on.at(i), resized_image, original_size_off_on, 0, 0, cv::INTER_CUBIC); + feature_map_off_on += resized_image; + } + + cv::Mat f_on_off_norm; + cv::normalize(feature_map_on_off, f_on_off_norm, 0, 1, cv::NORM_MINMAX, -1); + cv::namedWindow("F on off", CV_WINDOW_NORMAL); + cv::imshow("F on off", f_on_off_norm); + cv::Mat f_off_on_norm; + cv::normalize(feature_map_off_on, f_off_on_norm, 0, 1, cv::NORM_MINMAX, -1); + cv::namedWindow("F off on", CV_WINDOW_NORMAL); + cv::imshow("F off on", f_off_on_norm); + + cv::waitKey(0); + cv::destroyAllWindows(); + + cv::Mat C_l_mean = mean_fusion(feature_map_on_off, feature_map_off_on); + cv::Mat C_l_mean_norm; + cv::normalize(C_l_mean, C_l_mean_norm, 0, 1, cv::NORM_MINMAX, -1); + cv::namedWindow("C_l_mean", CV_WINDOW_NORMAL); + cv::imshow("C_l_mean", C_l_mean_norm); + cv::Mat C_l_max = max_fusion(feature_map_on_off, feature_map_off_on); + cv::Mat C_l_max_norm; + cv::normalize(C_l_max, C_l_max_norm, 0, 1, cv::NORM_MINMAX, -1); + cv::namedWindow("C_l_max", CV_WINDOW_NORMAL); + cv::imshow("C_l_max", C_l_max_norm); + cv::waitKey(0); + + + return 0; +}