Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Làm mượt ảnh (Image Smoother) trong C++


Mô tả bài toán

Cho ma trận 2D M biểu diễn mức xám ảnh. Làm mượt: mỗi pixel mới = trung bình (làm tròn xuống) của 8 hàng xóm và chính nó. Nếu ít hơn 8 hàng xóm (ở rìa), lấy trung bình các ô có sẵn.

Ví dụ: Ma trận 3×3 toàn 1 trừ giữa là 0 → Kết quả toàn 0.

Giải pháp (Duyệt 3×3)

  • Với mỗi ô (i,j), duyệt dx, dy ∈ {-1,0,1}.
  • Tính tổng và đếm ô hợp lệ (0 ≤ m < R, 0 ≤ n < C).
  • res[i][j] = sum / count.

Ví dụ minh họa

#include <bits/stdc++.h>
using namespace std;

void print_vector(vector<vector<int>> v) {
    cout << "[";
    for (int i = 0; i < v.size(); i++) {
        cout << "[";
        for (int j = 0; j < v[i].size(); j++) cout << v[i][j] << ", ";
        cout << "],";
    }
    cout << "]" << endl;
}

class Solution {
public:
    vector<vector<int>> imageSmoother(vector<vector<int>>& M) {
        int R = M.size(), C = M[0].size();
        vector<int> d = {-1, 0, 1};
        vector<vector<int>> res(R, vector<int>(C, 0));
        for (int i = 0; i < R; ++i)
            for (int j = 0; j < C; ++j) {
                int sum = 0, count = 0;
                for (int dx : d)
                    for (int dy : d) {
                        int m = i + dx, n = j + dy;
                        if (m >= 0 && m < R && n >= 0 && n < C) {
                            ++count; sum += M[m][n];
                        }
                    }
                res[i][j] = sum / count;
            }
        return res;
    }
};

int main() {
    Solution ob;
    vector<vector<int>> v = {{1,1,1},{1,0,1},{1,1,1}};
    print_vector(ob.imageSmoother(v));
    return 0;
}

Đầu vào

{{1,1,1},{1,0,1},{1,1,1}}

Đầu ra

[[0, 0, 0, ],[0, 0, 0, ],[0, 0, 0, ],]