Computer >> Máy Tính >  >> Lập trình >> C ++

Hình ảnh mịn hơn trong C ++

Giả sử chúng ta có một ma trận 2D M đại diện cho thang xám của một hình ảnh, chúng ta phải thiết kế mịn hơn để làm cho thang xám của mỗi pixel trở thành thang xám trung bình (làm tròn xuống) của tất cả 8 pixel xung quanh và chính nó. Nếu một ô có ít hơn 8 ô xung quanh, hãy chuyển đổi tất cả các pixel có thể có.

Vì vậy, nếu đầu vào giống như

1 1 1
1 0 1
1 1 1

thì đầu ra sẽ là

0 0 0
0 0 0
0 0 0

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • R:=số hàng của M

  • C:=số cột của

  • Xác định mảng d ={-1, 0, 1}

  • Xác định kích thước một mảng 2D (R x C)

  • để khởi tạo i:=0, khi i

    • để khởi tạo j:=0, khi j

      • sum:=0, count:=0

      • để khởi tạo k:=0, khi k <3, cập nhật (tăng k lên 1), thực hiện -

        • để khởi tạo l:=0, khi l - 3, cập nhật (tăng l lên 1), thực hiện -

          • m:=i + d [k], n:=j + d [l]

          • nếu m> =0 và m =0 và n

            • tăng số đếm lên 1 và sum =sum + M [m, n]

      • res [i, j]:=sum / count

  • trả lại res

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<auto> > 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();
      int 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 k = 0; k < 3; ++k) {
               for (int l = 0; l < 3; ++l) {
                  int m = i + d[k], n = j + d[l];
                     if (m >= 0 && m < R && n >= 0 && n < C) ++count, sum += M[m][n];
                  }
               }
               res[i][j] = sum / count;
            }
         }
         return res;
      }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{1,1,1},{1,0,1},{1,1,1}};
   print_vector(ob.imageSmoother(v));
}

Đầu vào

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

Đầu ra

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