This is a follow-up question for An Updated Multi-dimensional Image Data Structure with Variadic Template Functions in C++. I implemented histogram
template function to get histogram of an image in this post.
The experimental implementation
histogram
template function implementation// histogram template function implementation template<class ElementT = std::uint8_t> constexpr static auto histogram(const Image<ElementT>& input) { std::array<std::size_t, std::numeric_limits<ElementT>::max() - std::numeric_limits<ElementT>::lowest() + 1> histogram_output; std::fill(std::begin(histogram_output), std::end(histogram_output), std::size_t{ 0 }); auto image_data = input.getImageData(); for (std::size_t i = 0; i < image_data.size(); ++i) { ++histogram_output[image_data[i]]; } return histogram_output; }
rgb2hsv
template function implementation// rgb2hsv template function implementation template<typename ElementT, typename OutputT = HSV> requires (std::same_as<ElementT, RGB> || std::same_as<ElementT, RGB_DOUBLE>) constexpr static auto rgb2hsv(const Image<ElementT>& input) { return pixelwiseOperation([](ElementT input) { return rgb2hsv(input); }, input); } // rgb2hsv template function implementation template<class ExPo, typename ElementT, typename OutputT = HSV> requires (std::same_as<ElementT, RGB> || std::same_as<ElementT, RGB_DOUBLE>) && (std::is_execution_policy_v<std::remove_cvref_t<ExPo>>) constexpr static auto rgb2hsv(ExPo execution_policy, const Image<ElementT>& input) { return pixelwiseOperation(execution_policy, [](ElementT input) { return rgb2hsv(input); }, input); }
The usage of histogram
template function:
/* Developed by Jimmy Hu */ #include <chrono> #include "../base_types.h" #include "../basic_functions.h" #include "../image.h" #include "../image_io.h" #include "../image_operations.h" template<class ExPo, class ElementT> requires (std::is_execution_policy_v<std::remove_cvref_t<ExPo>>) constexpr static auto HistogramTest( ExPo execution_policy, const TinyDIP::Image<ElementT>& input, std::ostream& os = std::cout ) { auto hsv_image = TinyDIP::rgb2hsv(execution_policy, input); auto grayscale_image = TinyDIP::im2uint8(TinyDIP::getVplane(hsv_image)); auto start1 = std::chrono::system_clock::now(); auto histogram_result1 = TinyDIP::histogram(grayscale_image); auto end1 = std::chrono::system_clock::now(); std::chrono::duration<double> elapsed_seconds1 = end1 - start1; os << "elapsed time: " << elapsed_seconds1.count() << '\n'; return histogram_result1; } int main() { auto start = std::chrono::system_clock::now(); std::string image_filename = "1.bmp"; auto image_input = TinyDIP::bmp_read(image_filename.c_str(), true); image_input = TinyDIP::copyResizeBicubic(image_input, 3 * image_input.getWidth(), 3 * image_input.getHeight()); auto histogram_result = HistogramTest(std::execution::par, image_input); for (std::size_t i = 0; i < histogram_result.size(); i++) { std::cout << i << " count: " << histogram_result[i] << " / " << image_input.count() << '\n'; } std::cout << "Sum = " << TinyDIP::recursive_reduce(histogram_result, std::size_t{ 0 }) << '\n'; auto end = std::chrono::system_clock::now(); std::chrono::duration<double> elapsed_seconds = end - start; std::time_t end_time = std::chrono::system_clock::to_time_t(end); std::cout << "Computation finished at " << std::ctime(&end_time) << "elapsed time: " << elapsed_seconds.count() << '\n'; return EXIT_SUCCESS; }
The output of the test code above:
Width of the input image: 454 Height of the input image: 341 Size of the input image(Byte): 464442 elapsed time: 0.0007759 0 count: 1966 / 1393326 1 count: 65 / 1393326 2 count: 72 / 1393326 3 count: 75 / 1393326 4 count: 71 / 1393326 5 count: 49 / 1393326 6 count: 67 / 1393326 7 count: 52 / 1393326 8 count: 78 / 1393326 9 count: 58 / 1393326 10 count: 60 / 1393326 11 count: 58 / 1393326 12 count: 66 / 1393326 13 count: 75 / 1393326 14 count: 86 / 1393326 15 count: 98 / 1393326 16 count: 105 / 1393326 17 count: 139 / 1393326 18 count: 301 / 1393326 19 count: 554 / 1393326 20 count: 1052 / 1393326 21 count: 1551 / 1393326 22 count: 2407 / 1393326 23 count: 3593 / 1393326 24 count: 5618 / 1393326 25 count: 8144 / 1393326 26 count: 10541 / 1393326 27 count: 12335 / 1393326 28 count: 14096 / 1393326 29 count: 15881 / 1393326 30 count: 16950 / 1393326 31 count: 17881 / 1393326 32 count: 18950 / 1393326 33 count: 19432 / 1393326 34 count: 20085 / 1393326 35 count: 20687 / 1393326 36 count: 21367 / 1393326 37 count: 21758 / 1393326 38 count: 22450 / 1393326 39 count: 23288 / 1393326 40 count: 23501 / 1393326 41 count: 23818 / 1393326 42 count: 24173 / 1393326 43 count: 23949 / 1393326 44 count: 23445 / 1393326 45 count: 22823 / 1393326 46 count: 22218 / 1393326 47 count: 21807 / 1393326 48 count: 21137 / 1393326 49 count: 20491 / 1393326 50 count: 19820 / 1393326 51 count: 19644 / 1393326 52 count: 19148 / 1393326 53 count: 18567 / 1393326 54 count: 18190 / 1393326 55 count: 17536 / 1393326 56 count: 16935 / 1393326 57 count: 16640 / 1393326 58 count: 15821 / 1393326 59 count: 15337 / 1393326 60 count: 14813 / 1393326 61 count: 14085 / 1393326 62 count: 13722 / 1393326 63 count: 13101 / 1393326 64 count: 12752 / 1393326 65 count: 12188 / 1393326 66 count: 11973 / 1393326 67 count: 11385 / 1393326 68 count: 11036 / 1393326 69 count: 10681 / 1393326 70 count: 10205 / 1393326 71 count: 9761 / 1393326 72 count: 9574 / 1393326 73 count: 9162 / 1393326 74 count: 9056 / 1393326 75 count: 8700 / 1393326 76 count: 8270 / 1393326 77 count: 8096 / 1393326 78 count: 7671 / 1393326 79 count: 7575 / 1393326 80 count: 7366 / 1393326 81 count: 7262 / 1393326 82 count: 7011 / 1393326 83 count: 6692 / 1393326 84 count: 6533 / 1393326 85 count: 6459 / 1393326 86 count: 5996 / 1393326 87 count: 5783 / 1393326 88 count: 5764 / 1393326 89 count: 5554 / 1393326 90 count: 5413 / 1393326 91 count: 5310 / 1393326 92 count: 5069 / 1393326 93 count: 5021 / 1393326 94 count: 5026 / 1393326 95 count: 4816 / 1393326 96 count: 4788 / 1393326 97 count: 4561 / 1393326 98 count: 4528 / 1393326 99 count: 4296 / 1393326 100 count: 4308 / 1393326 101 count: 4316 / 1393326 102 count: 4123 / 1393326 103 count: 4023 / 1393326 104 count: 3850 / 1393326 105 count: 3873 / 1393326 106 count: 3731 / 1393326 107 count: 3737 / 1393326 108 count: 3685 / 1393326 109 count: 3566 / 1393326 110 count: 3505 / 1393326 111 count: 3462 / 1393326 112 count: 3383 / 1393326 113 count: 3350 / 1393326 114 count: 3264 / 1393326 115 count: 3204 / 1393326 116 count: 3216 / 1393326 117 count: 3187 / 1393326 118 count: 3191 / 1393326 119 count: 3163 / 1393326 120 count: 2903 / 1393326 121 count: 3040 / 1393326 122 count: 2956 / 1393326 123 count: 2899 / 1393326 124 count: 2802 / 1393326 125 count: 2916 / 1393326 126 count: 2833 / 1393326 127 count: 2745 / 1393326 128 count: 2918 / 1393326 129 count: 2843 / 1393326 130 count: 2795 / 1393326 131 count: 2718 / 1393326 132 count: 2758 / 1393326 133 count: 2781 / 1393326 134 count: 2821 / 1393326 135 count: 2755 / 1393326 136 count: 2763 / 1393326 137 count: 2739 / 1393326 138 count: 2770 / 1393326 139 count: 2705 / 1393326 140 count: 2812 / 1393326 141 count: 2733 / 1393326 142 count: 2766 / 1393326 143 count: 2792 / 1393326 144 count: 2790 / 1393326 145 count: 2813 / 1393326 146 count: 2674 / 1393326 147 count: 2655 / 1393326 148 count: 2544 / 1393326 149 count: 2562 / 1393326 150 count: 2542 / 1393326 151 count: 2668 / 1393326 152 count: 2586 / 1393326 153 count: 2521 / 1393326 154 count: 2525 / 1393326 155 count: 2497 / 1393326 156 count: 2503 / 1393326 157 count: 2513 / 1393326 158 count: 2517 / 1393326 159 count: 2406 / 1393326 160 count: 2526 / 1393326 161 count: 2571 / 1393326 162 count: 2531 / 1393326 163 count: 2504 / 1393326 164 count: 2536 / 1393326 165 count: 2454 / 1393326 166 count: 2529 / 1393326 167 count: 2651 / 1393326 168 count: 2530 / 1393326 169 count: 2519 / 1393326 170 count: 2522 / 1393326 171 count: 2600 / 1393326 172 count: 2614 / 1393326 173 count: 2603 / 1393326 174 count: 2748 / 1393326 175 count: 2711 / 1393326 176 count: 2783 / 1393326 177 count: 2877 / 1393326 178 count: 2921 / 1393326 179 count: 2909 / 1393326 180 count: 2814 / 1393326 181 count: 2747 / 1393326 182 count: 2648 / 1393326 183 count: 2615 / 1393326 184 count: 2510 / 1393326 185 count: 2526 / 1393326 186 count: 2363 / 1393326 187 count: 2284 / 1393326 188 count: 2036 / 1393326 189 count: 2022 / 1393326 190 count: 1908 / 1393326 191 count: 1912 / 1393326 192 count: 1920 / 1393326 193 count: 1818 / 1393326 194 count: 1896 / 1393326 195 count: 1977 / 1393326 196 count: 2016 / 1393326 197 count: 2030 / 1393326 198 count: 2004 / 1393326 199 count: 1855 / 1393326 200 count: 1660 / 1393326 201 count: 1485 / 1393326 202 count: 1395 / 1393326 203 count: 1314 / 1393326 204 count: 1278 / 1393326 205 count: 1064 / 1393326 206 count: 899 / 1393326 207 count: 850 / 1393326 208 count: 847 / 1393326 209 count: 824 / 1393326 210 count: 834 / 1393326 211 count: 838 / 1393326 212 count: 839 / 1393326 213 count: 833 / 1393326 214 count: 913 / 1393326 215 count: 844 / 1393326 216 count: 807 / 1393326 217 count: 827 / 1393326 218 count: 837 / 1393326 219 count: 846 / 1393326 220 count: 889 / 1393326 221 count: 863 / 1393326 222 count: 871 / 1393326 223 count: 931 / 1393326 224 count: 909 / 1393326 225 count: 924 / 1393326 226 count: 950 / 1393326 227 count: 878 / 1393326 228 count: 895 / 1393326 229 count: 833 / 1393326 230 count: 909 / 1393326 231 count: 959 / 1393326 232 count: 870 / 1393326 233 count: 943 / 1393326 234 count: 915 / 1393326 235 count: 870 / 1393326 236 count: 897 / 1393326 237 count: 986 / 1393326 238 count: 925 / 1393326 239 count: 1003 / 1393326 240 count: 999 / 1393326 241 count: 1016 / 1393326 242 count: 1003 / 1393326 243 count: 1032 / 1393326 244 count: 1067 / 1393326 245 count: 1062 / 1393326 246 count: 1148 / 1393326 247 count: 1188 / 1393326 248 count: 1311 / 1393326 249 count: 1391 / 1393326 250 count: 1522 / 1393326 251 count: 1704 / 1393326 252 count: 2114 / 1393326 253 count: 2766 / 1393326 254 count: 4315 / 1393326 255 count: 39663 / 1393326 Sum = 1393326 Computation finished at Thu Feb 20 14:09:02 2025 elapsed time: 0.701304
All suggestions are welcome.
All suggestions are welcome.
The summary information:
Which question it is a follow-up to?
An Updated Multi-dimensional Image Data Structure with Variadic Template Functions in C++
What changes has been made in the code since last question?
I implemented
histogram
template function in this post.Why a new review is being asked for?
Please review the implementation of
histogram
template function and its tests.
rgb2hsv
call another function of the same name that is not in the post.\$\endgroup\$