5#include <unordered_map>
41 const std::array<int, 4>
di{{0, -1, -1, -1}};
42 const std::array<int, 4>
dj{{-1, -1, 0, 1}};
43 const std::array<int, 8>
di_{{0, 0, -1, 1, -1, 1, -1, 1}};
44 const std::array<int, 8>
dj_{{-1, 1, 0, 0, 1, -1, -1, 1}};
80 fmt::print(
"Connections:\n");
81 for (
auto it =
child.begin(); it !=
child.end(); ++it) {
82 fmt::print(
"{} -> {}\n", it->first, it->second);
94 auto it =
child.find(from);
95 if (it ==
child.end()) {
102 if (it->second > to) {
104 auto old = it->second;
116 std::vector<int> neighbour_labels;
118 for (
int k = 0; k < 4; ++k) {
119 const auto row = i + di[k];
120 const auto col = j + dj[k];
121 if (row >= 0 && col >= 0 && row < shape_[0] && col < shape_[1]) {
122 auto tmp = labeled_.value(i + di[k], j + dj[k]);
124 neighbour_labels.push_back(tmp);
128 if (neighbour_labels.size() == 0) {
133 std::sort(neighbour_labels.rbegin(), neighbour_labels.rend());
134 auto first = neighbour_labels.begin();
135 auto last = std::unique(first, neighbour_labels.end());
136 if (last - first == 1)
137 return *neighbour_labels.begin();
139 for (
auto current = first; current != last - 1; ++current) {
140 auto next = current + 1;
141 add_link(*current, *next);
143 return neighbour_labels.back();
150 peripheral_labeled_ = 0;
161 int clusterIndex = 0;
162 for (
int i = 0; i < shape_[0]; ++i) {
163 for (
int j = 0; j < shape_[1]; ++j) {
165 threshold_ = 5 * noiseMap(i, j);
166 if (original_(i, j) > threshold_) {
168 rec_FillHit(clusterIndex, i, j);
173 for (
const auto &h : h_size)
174 hits.push_back(h.second);
182 h_size[clusterIndex].rows[h_size[clusterIndex].size] = i;
183 h_size[clusterIndex].cols[h_size[clusterIndex].size] = j;
184 h_size[clusterIndex].enes[h_size[clusterIndex].size] = original_(i, j);
186 h_size[clusterIndex].size += 1;
187 h_size[clusterIndex].energy += original_(i, j);
188 if (h_size[clusterIndex].max < original_(i, j)) {
189 h_size[clusterIndex].row = i;
190 h_size[clusterIndex].col = j;
191 h_size[clusterIndex].max = original_(i, j);
195 for (
int k = 0; k < 8; ++k) {
196 const auto row = i + di_[k];
197 const auto col = j + dj_[k];
198 if (row >= 0 && col >= 0 && row < shape_[0] && col < shape_[1]) {
200 threshold_ = peripheralThresholdFactor_ * noiseMap(row, col);
201 if (original_(row, col) > threshold_) {
202 rec_FillHit(clusterIndex, row, col);
210 original_(row, col) = 0;
229 for (
int i = 0; i < original_.size(); ++i) {
231 threshold_ = 5 * noiseMap(i);
232 binary_(i) = (original_(i) > threshold_);
235 for (
int i = 0; i < shape_[0]; ++i) {
236 for (
int j = 0; j < shape_[1]; ++j) {
240 auto tmp = check_neighbours(i, j);
242 labeled_(i, j) = tmp;
244 labeled_(i, j) = ++current_label;
253 for (ssize_t i = 0; i != labeled_.size(); ++i) {
254 auto current_label = labeled_(i);
255 if (current_label != 0) {
256 auto it = child.find(current_label);
257 while (it != child.end()) {
258 current_label = it->second;
259 it = child.find(current_label);
263 labeled_(i) = current_label;
274 std::unordered_map<int, Hit> h_size;
275 for (
int i = 0; i < shape_[0]; ++i) {
276 for (
int j = 0; j < shape_[1]; ++j) {
277 if (labeled_(i, j) != 0 or
false
283 Hit &record = h_size[labeled_(i, j)];
287 record.
enes[record.
size] = original_(i, j);
292 record.
energy += original_(i, j);
294 if (record.
max < original_(i, j)) {
297 record.
max = original_(i, j);
303 for (
const auto &h : h_size)
304 hits.push_back(h.second);
const int MAX_CLUSTER_SIZE
Definition VariableSizeClusterFinder.hpp:10
Definition VariableSizeClusterFinder.hpp:13
void store_clusters()
Definition VariableSizeClusterFinder.hpp:268
NDArray< int, 2 > labeled_
Definition VariableSizeClusterFinder.hpp:33
void add_link(int from, int to)
Definition VariableSizeClusterFinder.hpp:91
T threshold_
Definition VariableSizeClusterFinder.hpp:36
size_t total_clusters() const
Definition VariableSizeClusterFinder.hpp:85
void set_peripheralThresholdFactor(int factor)
Definition VariableSizeClusterFinder.hpp:63
void clear_hits()
Definition VariableSizeClusterFinder.hpp:77
std::vector< Hit > steal_hits()
Definition VariableSizeClusterFinder.hpp:72
void rec_FillHit(int clusterIndex, int i, int j)
Definition VariableSizeClusterFinder.hpp:178
void second_pass()
Definition VariableSizeClusterFinder.hpp:251
const std::array< int, 4 > di
Definition VariableSizeClusterFinder.hpp:41
const std::array< int, 4 > dj
Definition VariableSizeClusterFinder.hpp:42
NDView< T, 2 > original_
Definition VariableSizeClusterFinder.hpp:32
void first_pass()
Definition VariableSizeClusterFinder.hpp:227
NDView< T, 2 > noiseMap
Definition VariableSizeClusterFinder.hpp:37
NDArray< int, 2 > peripheral_labeled_
Definition VariableSizeClusterFinder.hpp:34
const std::array< ssize_t, 2 > shape_
Definition VariableSizeClusterFinder.hpp:31
NDArray< int, 2 > labeled()
Definition VariableSizeClusterFinder.hpp:57
int current_label
Definition VariableSizeClusterFinder.hpp:40
ClusterFinder(image_shape shape, T threshold)
Definition VariableSizeClusterFinder.hpp:52
const std::array< int, 8 > dj_
Definition VariableSizeClusterFinder.hpp:44
void single_pass(NDView< T, 2 > img)
Definition VariableSizeClusterFinder.hpp:216
void find_clusters(NDView< T, 2 > img)
Definition VariableSizeClusterFinder.hpp:147
std::vector< Hit > hits
Definition VariableSizeClusterFinder.hpp:47
int check_neighbours(int i, int j)
Definition VariableSizeClusterFinder.hpp:115
NDArray< bool, 2 > binary_
Definition VariableSizeClusterFinder.hpp:35
void set_noiseMap(NDView< T, 2 > noise_map)
Definition VariableSizeClusterFinder.hpp:59
std::unordered_map< int, Hit > h_size
Definition VariableSizeClusterFinder.hpp:46
bool use_noise_map
Definition VariableSizeClusterFinder.hpp:38
void print_connections()
Definition VariableSizeClusterFinder.hpp:79
std::map< int, int > child
Definition VariableSizeClusterFinder.hpp:45
void find_clusters_X(NDView< T, 2 > img)
Definition VariableSizeClusterFinder.hpp:159
int peripheralThresholdFactor_
Definition VariableSizeClusterFinder.hpp:39
const std::array< int, 8 > di_
Definition VariableSizeClusterFinder.hpp:43
Definition NDArray.hpp:23
Frame class to represent a single frame of data model class should be able to work with streams comin...
Definition CircularFifo.hpp:11
Definition VariableSizeClusterFinder.hpp:15
int16_t rows[MAX_CLUSTER_SIZE]
Definition VariableSizeClusterFinder.hpp:25
uint16_t reserved
Definition VariableSizeClusterFinder.hpp:19
int16_t size
Definition VariableSizeClusterFinder.hpp:16
int16_t cols[MAX_CLUSTER_SIZE]
Definition VariableSizeClusterFinder.hpp:26
int16_t row
Definition VariableSizeClusterFinder.hpp:17
double enes[MAX_CLUSTER_SIZE]
Definition VariableSizeClusterFinder.hpp:27
T max
Definition VariableSizeClusterFinder.hpp:21
T energy
Definition VariableSizeClusterFinder.hpp:20
int16_t col
Definition VariableSizeClusterFinder.hpp:18