Skip to content

Commit 0625aa7

Browse files
committed
Improve Tera Type reader using the new brightness filter.
1 parent 31f4500 commit 0625aa7

File tree

5 files changed

+103
-12
lines changed

5 files changed

+103
-12
lines changed

SerialPrograms/Source/CommonTools/Images/ImageFilter.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,6 @@ std::vector<std::pair<ImageRGB32, size_t>> to_blackwhite_rgb32_range(
161161

162162

163163

164-
#if 0
165164
ImageRGB32 to_blackwhite_rgb32_brightness(
166165
const ImageViewRGB32& image,
167166
bool in_range_black,
@@ -170,11 +169,12 @@ ImageRGB32 to_blackwhite_rgb32_brightness(
170169
ImageRGB32 ret(image.width(), image.height());
171170
Kernels::to_blackwhite_rgb32_brightness(
172171
image.data(), image.bytes_per_row(), image.width(), image.height(),
173-
ret.data(), ret.bytes_per_row(), mins, maxs, in_range_black
172+
ret.data(), ret.bytes_per_row(),
173+
in_range_black,
174+
in_range_black, max_brightness
174175
);
175176
return ret;
176177
}
177-
#endif
178178

179179

180180

SerialPrograms/Source/Kernels/ImageFilters/RGB32_Brightness/Kernels_ImageFilter_RGB32_Brightness.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,32 @@ size_t filter_rgb32_brightness(
3939

4040

4141

42+
size_t to_blackwhite_rgb32_brightness_Default(
43+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
44+
uint32_t* out, size_t out_bytes_per_row,
45+
bool in_range_black,
46+
uint32_t min_brightness, uint32_t max_brightness
47+
);
48+
size_t to_blackwhite_rgb32_brightness(
49+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
50+
uint32_t* out, size_t out_bytes_per_row,
51+
bool in_range_black,
52+
uint32_t min_brightness, uint32_t max_brightness
53+
){
54+
if (width * height > 0xffffffff){
55+
throw InternalProgramError(nullptr, PA_CURRENT_FUNCTION, "Image is too large. more than 2^32 pixels.");
56+
}
57+
58+
return to_blackwhite_rgb32_brightness_Default(
59+
in, in_bytes_per_row, width, height,
60+
out, out_bytes_per_row,
61+
in_range_black,
62+
min_brightness, max_brightness
63+
);
64+
}
65+
66+
67+
68+
4269
}
4370
}

SerialPrograms/Source/Kernels/ImageFilters/RGB32_Brightness/Kernels_ImageFilter_RGB32_Brightness.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ size_t filter_rgb32_brightness(
2525
);
2626

2727

28+
size_t to_blackwhite_rgb32_brightness(
29+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
30+
uint32_t* out, size_t out_bytes_per_row,
31+
bool in_range_black,
32+
uint32_t min_brightness, uint32_t max_brightness
33+
);
34+
35+
2836

2937

3038
}

SerialPrograms/Source/Kernels/ImageFilters/RGB32_Brightness/Kernels_ImageFilter_RGB32_Brightness_Default.cpp

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ class ImageFilter_RgbBrightness_Default{
1818

1919
public:
2020
ImageFilter_RgbBrightness_Default(
21-
uint32_t min_brightness, uint32_t max_brightness,
22-
uint32_t replacement_color, bool replace_color_within_range
21+
uint32_t replacement_color, bool replace_color_within_range,
22+
uint32_t min_brightness, uint32_t max_brightness
2323
)
2424
: m_replacement_color(replacement_color)
2525
, m_replace_color_within_range(replace_color_within_range ? 1 : 0)
@@ -59,7 +59,10 @@ size_t filter_rgb32_brightness_Default(
5959
uint32_t replacement, bool replace_color_within_range,
6060
uint32_t min_brightness, uint32_t max_brightness
6161
){
62-
ImageFilter_RgbBrightness_Default filter(replacement, replace_color_within_range, min_brightness, max_brightness);
62+
ImageFilter_RgbBrightness_Default filter(
63+
replacement, replace_color_within_range,
64+
min_brightness, max_brightness
65+
);
6366
filter_per_pixel(in, in_bytes_per_row, width, height, filter, out, out_bytes_per_row);
6467
return filter.count();
6568
}
@@ -68,5 +71,61 @@ size_t filter_rgb32_brightness_Default(
6871

6972

7073

74+
75+
class ToBlackWhite_RgbBrightness_Default{
76+
public:
77+
static const size_t VECTOR_SIZE = 1;
78+
using Mask = size_t;
79+
80+
public:
81+
ToBlackWhite_RgbBrightness_Default(
82+
bool in_range_black,
83+
uint32_t min_brightness, uint32_t max_brightness
84+
)
85+
: m_in_range_black(in_range_black ? 1 : 0)
86+
, m_min_brightness(min_brightness)
87+
, m_max_brightness(max_brightness)
88+
, m_count(0)
89+
{}
90+
91+
PA_FORCE_INLINE size_t count() const{
92+
return m_count;
93+
}
94+
95+
PA_FORCE_INLINE void process_full(uint32_t* out, const uint32_t* in){
96+
uint32_t pixel = in[0];
97+
uint32_t brightness = 0;
98+
brightness += ((pixel >> 0) & 0x000000ff);
99+
brightness += ((pixel >> 8) & 0x000000ff);
100+
brightness += ((pixel >> 16) & 0x000000ff);
101+
uint32_t ret = m_min_brightness <= brightness && brightness <= m_max_brightness;
102+
m_count += ret;
103+
ret ^= m_in_range_black;
104+
out[0] = ret ? 0xffffffff : 0xff000000;
105+
}
106+
PA_FORCE_INLINE void process_partial(uint32_t* out, const uint32_t* in, size_t left){
107+
process_full(out, in);
108+
}
109+
110+
private:
111+
const uint32_t m_in_range_black;
112+
uint32_t m_min_brightness;
113+
uint32_t m_max_brightness;
114+
size_t m_count;
115+
};
116+
size_t to_blackwhite_rgb32_brightness_Default(
117+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
118+
uint32_t* out, size_t out_bytes_per_row,
119+
bool in_range_black,
120+
uint32_t min_brightness, uint32_t max_brightness
121+
){
122+
ToBlackWhite_RgbBrightness_Default filter(in_range_black, min_brightness, max_brightness);
123+
filter_per_pixel(in, in_bytes_per_row, width, height, filter, out, out_bytes_per_row);
124+
return filter.count();
125+
}
126+
127+
128+
129+
71130
}
72131
}

SerialPrograms/Source/PokemonSV/Inference/Tera/PokemonSV_TeraTypeReader.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ ImageMatch::ImageMatchResult TeraTypeReader::read(const ImageViewRGB32& screen)
6666
cropped_image,
6767
// The filter is a lambda function that returns true on black tera type pixels.
6868
[=](Color pixel){
69-
return (uint32_t)pixel.red() + pixel.green() + pixel.blue() < threshold;
69+
return (uint32_t)pixel.red() + pixel.green() + pixel.blue() <= threshold;
7070
}
7171
);
7272

@@ -77,14 +77,11 @@ ImageMatch::ImageMatchResult TeraTypeReader::read(const ImageViewRGB32& screen)
7777
ImageRGB32 processed_image = extract_box_reference(cropped_image, tight_box).copy();
7878
// processed_image.save("processed_image-" + std::to_string(threshold) + ".png");
7979

80-
uint32_t upper_filter = threshold / 3 * 0x00010101;
81-
upper_filter |= 0xff000000;
82-
83-
ImageRGB32 filtered_image = to_blackwhite_rgb32_range(processed_image, 0xff000000, upper_filter, true);
80+
ImageRGB32 filtered_image = to_blackwhite_rgb32_brightness(processed_image, true, 0, threshold);
8481
// filtered_image.save("filtered_image-" + std::to_string(threshold) + ".png");
8582

8683
ImageMatch::ImageMatchResult types = m_matcher.match(filtered_image, ALPHA_SPREAD);
87-
// types.log(global_logger_tagged(), MAX_ALPHA); // REMOVE
84+
// types.log(global_logger_tagged(), MAX_ALPHA);
8885
types.clear_beyond_alpha(MAX_ALPHA);
8986

9087
if (types.results.size() == 1){

0 commit comments

Comments
 (0)