Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การทำให้ภาพเรียบใน C++

ปัญหา

สมมติว่าเรามีเมทริกซ์ 2D M ที่แทนระดับสีเทาของภาพ เราต้องออกแบบตัวทำให้เรียบเพื่อให้ระดับสีเทาของแต่ละพิกเซลกลายเป็นค่าเฉลี่ยระดับสีเทา (ปัดลง) ของพิกเซลรอบข้าง 8 ตัวและตัวมันเอง หากเซลล์มีเซลล์รอบข้างน้อยกว่า 8 ตัว ให้แปลงพิกเซลที่เป็นไปได้ทั้งหมด

เช่น ถ้าผนวกเข้าเป็น

111
101
111
ผลลัพธ์จะเป็น
000
000
000

วิธีแก้ปัญหา

  1. R := จำนวนแถวของ M
  2. C := จำนวนคอลัมน์ของ M
  3. กำหนดอาร์เรย์ d = { -1, 0, 1 }
  4. กำหนดอาร์เรย์ 2D res ขนาด (R x C)
  5. for i := 0 ถึง R-1 ทำ:
    • for j := 0 ถึง C-1 ทำ:
      • sum := 0, count := 0
      • for k := 0 ถึง 2 ทำ:
        • for l := 0 ถึง 2 ทำ:
          • m := i + d[k], n := j + d[l]
          • ถ้า m >= 0 และ m < R และ n >= 0 และ n < C:
            • เพิ่ม count ขึ้น 1 และ sum = sum + M[m][n]
      • res[i][j] := sum / count
  6. คืนค่า res

ตัวอย่างโค้ด C++

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

void print_vector(vector<vector<auto> > v){ 
    cout << "["; 
    for(int i = 0; i= 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)); 
}

อินพุต

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

เอาต์พุต

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