Skip to content

Commit 605bc05

Browse files
authored
green filter (#497)
1 parent 9c21821 commit 605bc05

File tree

8 files changed

+144
-2
lines changed

8 files changed

+144
-2
lines changed

SerialPrograms/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -688,6 +688,8 @@ file(GLOB MAIN_SOURCES
688688
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_AVX2.cpp
689689
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_AVX512.cpp
690690
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_SSE42.cpp
691+
Source/Kernels/ImageFilters/Kernels_ImageFilter_Green_Default.cpp
692+
Source/Kernels/ImageFilters/Kernels_ImageFilter_Green_Default.h
691693
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness.cpp
692694
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness.h
693695
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness_Default.cpp

SerialPrograms/SerialPrograms.pro

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,7 @@ SOURCES += \
350350
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_AVX2.cpp \
351351
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_AVX512.cpp \
352352
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_SSE42.cpp \
353+
Source/Kernels/ImageFilters/Kernels_ImageFilter_Green_Default.cpp \
353354
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness.cpp \
354355
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness_Default.cpp \
355356
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness_arm64_NEON.cpp \
@@ -1437,6 +1438,7 @@ HEADERS += \
14371438
Source/Kernels/BinaryMatrix/Kernels_SparseBinaryMatrixCore.h \
14381439
Source/Kernels/BinaryMatrix/Kernels_SparseBinaryMatrixCore.tpp \
14391440
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic.h \
1441+
Source/Kernels/ImageFilters/Kernels_ImageFilter_Green_Default.h \
14401442
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness.h \
14411443
Source/Kernels/ImageStats/Kernels_ImagePixelSumSqr.h \
14421444
Source/Kernels/ImageStats/Kernels_ImagePixelSumSqrDev.h \

SerialPrograms/Source/CommonFramework/ImageTools/ImageFilter.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,18 @@ std::vector<std::pair<ImageRGB32, size_t>> to_blackwhite_rgb32_range(
143143
return ret;
144144
}
145145

146+
ImageRGB32 filter_green(
147+
const ImageViewRGB32& image,
148+
Color replace_with,
149+
uint8_t rgb_gap
150+
){
151+
ImageRGB32 ret(image.width(), image.height());
152+
Kernels::filter_green(
153+
image.data(), image.bytes_per_row(), image.width(), image.height(),
154+
ret.data(), ret.bytes_per_row(), (uint32_t)replace_with, rgb_gap
155+
);
156+
return ret;
157+
}
146158

147159

148160

SerialPrograms/Source/CommonFramework/ImageTools/ImageFilter.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,14 @@ std::vector<std::pair<ImageRGB32, size_t>> to_blackwhite_rgb32_range(
119119
);
120120

121121

122+
// keep all pixels where green is the dominant RGB value. otherwise, replace the pixel with `replace_with`
123+
// `rgb_gap` is the amount that green has to exceed the red or blue value, in order to keep the pixel.
124+
ImageRGB32 filter_green(
125+
const ImageViewRGB32& image,
126+
Color replace_with,
127+
uint8_t rgb_gap = 0
128+
);
129+
122130

123131

124132
}

SerialPrograms/Source/CommonFramework/ImageTools/SolidColorTest.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ bool is_grey(
3030
double max_stddev_sum = 10
3131
);
3232

33-
// expected_color_ratio: ratio of color channels to match, e.g. if a color is (127, 127, 254), it's color ratio is (0.25, 0.25, 0.5)
33+
// expected_color_ratio: ratio of color channels to match,
34+
// for a color {r, g, b}: the color ratio is {r/(r+g+b), g/(r+g+b), b/(r+g+b)}
35+
// the sum of the ratios should add up to 1.0.
36+
// e.g. if a color is (127, 127, 254), it's color ratio is (0.25, 0.25, 0.5)
3437
bool is_solid(
3538
const ImageStats& stats,
3639
const FloatPixel& expected_color_ratio,

SerialPrograms/Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,27 @@ void to_blackwhite_rgb32_range(
365365
return to_blackwhite_rgb32_range_Default(image, bytes_per_row, width, height, filter, filter_count);
366366
}
367367

368+
size_t filter_green_Default(
369+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
370+
uint32_t* out, size_t out_bytes_per_row,
371+
uint32_t replacement, uint8_t rgb_gap
372+
);
373+
374+
375+
size_t filter_green(
376+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
377+
uint32_t* out, size_t out_bytes_per_row,
378+
uint32_t replacement, uint8_t rgb_gap
379+
){
380+
if (width * height > 0xffffffff){
381+
throw InternalProgramError(nullptr, PA_CURRENT_FUNCTION, "Image is too large. more than 2^32 pixels.");
382+
}
383+
return filter_green_Default(
384+
in, in_bytes_per_row, width, height,
385+
out, out_bytes_per_row, replacement, rgb_gap
386+
);
387+
}
388+
368389

369390

370391
}

SerialPrograms/Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,11 @@ void to_blackwhite_rgb32_range(
109109

110110

111111

112-
112+
size_t filter_green(
113+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
114+
uint32_t* out, size_t out_bytes_per_row,
115+
uint32_t replacement, uint8_t rgb_gap
116+
);
113117

114118

115119

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/* Image Filters Basic (Default)
2+
*
3+
* From: https://github.com/PokemonAutomation/Arduino-Source
4+
*
5+
*/
6+
7+
#include <stdint.h>
8+
#include <cstddef>
9+
#include "Kernels_ImageFilter_Basic_Routines.h"
10+
11+
namespace PokemonAutomation{
12+
namespace Kernels{
13+
14+
15+
class ImageFilter_Green_Default{
16+
public:
17+
static const size_t VECTOR_SIZE = 1;
18+
19+
public:
20+
ImageFilter_Green_Default(uint32_t replacement_color, uint8_t rgb_gap)
21+
: m_replacement_color(replacement_color)
22+
, m_rgb_gap(rgb_gap)
23+
, m_count(0)
24+
{}
25+
26+
PA_FORCE_INLINE size_t count() const{
27+
return m_count;
28+
}
29+
30+
PA_FORCE_INLINE void process_full(uint32_t* out, const uint32_t* in){
31+
uint32_t pixel = in[0];
32+
uint64_t ret = 1;
33+
34+
uint16_t red = ((pixel >> 16) & 0xff);
35+
uint16_t green = ((pixel >> 8) & 0xff);
36+
uint16_t blue = ((pixel) & 0xff);
37+
38+
ret &= (green >= red + m_rgb_gap) && (green >= blue + m_rgb_gap);
39+
40+
41+
m_count += ret;
42+
out[0] = ret ? pixel : m_replacement_color;
43+
}
44+
PA_FORCE_INLINE void process_partial(uint32_t* out, const uint32_t* in, size_t left){
45+
process_full(out, in);
46+
}
47+
48+
private:
49+
const uint32_t m_replacement_color;
50+
const uint16_t m_rgb_gap;
51+
size_t m_count;
52+
};
53+
54+
55+
size_t filter_green_Default(
56+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
57+
uint32_t* out, size_t out_bytes_per_row,
58+
uint32_t replacement_color, uint8_t rgb_gap
59+
){
60+
ImageFilter_Green_Default filter(replacement_color, rgb_gap);
61+
filter_per_pixel(in, in_bytes_per_row, width, height, filter, out, out_bytes_per_row);
62+
return filter.count();
63+
}
64+
65+
66+
67+
68+
69+
70+
71+
72+
73+
74+
75+
76+
77+
78+
79+
80+
81+
82+
83+
84+
85+
86+
87+
88+
89+
}
90+
}

0 commit comments

Comments
 (0)