Skip to content

Instantly share code, notes, and snippets.

@RigoLigoRLC
Created August 2, 2025 15:31
Show Gist options
  • Save RigoLigoRLC/3562280b4db8a74894d89c9b12547eb2 to your computer and use it in GitHub Desktop.
Save RigoLigoRLC/3562280b4db8a74894d89c9b12547eb2 to your computer and use it in GitHub Desktop.
光棱坦克OpenCV提取法
// SPDX-License-Identifier: MIT
#include <algorithm>
#include <opencv2/opencv.hpp>
int main(int argc, char **argv) {
cv::Mat img = cv::imread(argv[1]);
cv::Mat img_out(img.rows, img.cols, img.type());
const auto maxrow = img.rows, maxcol = img.cols;
// Extract pixels
for (int r = 0; r < maxrow; r++) {
for (int c = (r % 2 ? 1 : 0); c < maxcol; c += 2) {
const auto offset = 3 * (r * maxcol + c);
memcpy(img_out.data + offset, img.data + offset, 3);
}
}
// Median filtering
int r_max = 0, g_max = 0, b_max = 0;
for (int r = 0; r < maxrow; r++) {
for (int c = (r % 2 ? 0 : 1); c < img.cols; c += 2) {
// Pixel color getter with bound check
auto getSafe = [&](int row, int col, int offset) {
if (col > maxcol) {
col = maxcol - 1;
row--;
} else if (col < 0) {
col = 0;
row++;
}
if (row > maxrow) {
row = maxrow - 1;
col--;
} else if (row < 0) {
row = 0;
col++;
}
return img_out.data[(row * maxcol + col) * 3 + offset];
};
const auto offset = 3 * (r * maxcol + c);
img_out.data[offset] = (getSafe(r, c - 1, 0) + getSafe(r, c + 1, 0) +
getSafe(r - 1, c, 0) + getSafe(r + 1, c, 0)) / 4;
img_out.data[offset + 1] = (getSafe(r, c - 1, 1) + getSafe(r, c + 1, 1) +
getSafe(r - 1, c, 1) + getSafe(r + 1, c, 1)) / 4;
img_out.data[offset + 2] = (getSafe(r, c - 1, 2) + getSafe(r, c + 1, 2) +
getSafe(r - 1, c, 2) + getSafe(r + 1, c, 2)) / 4;
b_max = std::max(b_max, int(img_out.data[offset]));
g_max = std::max(g_max, int(img_out.data[offset + 1]));
r_max = std::max(r_max, int(img_out.data[offset + 2]));
}
}
// Auto exposure
float r_coeff = 255.0f / r_max, g_coeff = 255.0f / g_max, b_coeff = 255.0f / b_max;
for (int r = 0; r < maxrow; r++) {
for (int c = 0; c < maxcol; c++) {
const auto offset = 3 * (r * maxcol + c);
img_out.data[offset] *= b_coeff;
img_out.data[offset + 1] *= g_coeff;
img_out.data[offset + 2] *= r_coeff;
}
}
cv::imwrite(cv::String(argv[1]) + "out.png", img_out);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment