Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में इमेज स्मूथर (Image Smoother)


मान लीजिए हमारे पास एक 2D मैट्रिक्स M है जो एक छवि के ग्रे स्केल को दर्शाता है, हमें एक स्मूथर डिजाइन करना है ताकि प्रत्येक पिक्सेल का ग्रे स्केल उसके 8 आसपास के पिक्सेल और स्वयं का औसत ग्रे स्केल (नीचे राउंडिंग) बन जाए। यदि एक सेल में 8 से कम आसपास के सेल हैं, तो सभी संभावित पिक्सेल को परिवर्तित करें।

इसलिए, यदि इनपुट जैसा है:

111
101
111

तो आउटपुट होगा:

000
000
000

इसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे:

  • R := M की पंक्ति संख्या
  • C := M की कॉलम संख्या
  • d = { -1, 0, 1 } सरणी परिभाषित करें
  • आकार (R x C) का एक 2D सरणी res परिभाषित करें
  • i := 0 से R-1 तक लूप चलाएं:
    • j := 0 से C-1 तक लूप चलाएं:
      • sum := 0, count := 0
      • k := 0 से 2 तक लूप चलाएं:
        • 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
  • res वापस करें

उदाहरण

बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:

#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; 
    } 
}; 
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, ],]
  1. OpenCV में C++ का उपयोग करके इमेज में टेक्स्ट कैसे डालें? OpenCV में C++ का उपयोग करके इमेज में टेक्स्ट कैसे डालें?

    OpenCV में, हम putText() फ़ंक्शन का उपयोग करके इमेज में कुछ टेक्स्ट डाल सकते हैं। यह फ़ंक्शन <imgproc.hpp> हेडर में परिभाषित है। इमेज में टेक्स्ट डालने के लिए, हमें पहले मैट्रिक्स घोषित करना होगा जो इमेज को लोड करेगा। हमारे प्रोग्राम में इमेज लोड करने के बजाय, हमने मैट्रिक्स को सफेद रंग से भरा

  1. OpenCV में C++ का उपयोग करके बाइनरी इमेज को कैसे उल्टा करें? OpenCV में C++ का उपयोग करके बाइनरी इमेज को कैसे उल्टा करें?

    बाइनरी इमेज को उल्टा करने का मतलब पिक्सेल मानों को उल्टा करना है। दृश्य दृष्टिकोण से, जब हम बाइनरी इमेज को उल्टा करते हैं, तो सफेद पिक्सेल काले में बदल जाएंगे, और काले पिक्सेल सफेद में बदल जाएंगे। इस फ़ंक्शन का मूल रूप है - cvtColor(original_image, grayscale_image, COLOR_BGR2GRAY); अगली लाइन ग्रेस्क

  1. OpenCV में C++ का उपयोग करके बाइनरी इमेज कैसे बनाएं? OpenCV में C++ का उपयोग करके बाइनरी इमेज कैसे बनाएं?

    बाइनरी इमेज केवल एक डिजिटल इमेज है जो दो रंगों, काले और सफेद को दर्शाती है। इमेज प्रोसेसिंग के दृष्टिकोण से, बाइनरी इमेज में दो संभावित मानों वाले पिक्सेल होते हैं - शून्य और एक। जब पिक्सेल का मान 0 होता है, तो यह शुद्ध काले रंग को दर्शाता है। जब पिक्सेल का मान 1 होता है, तो इसका मतलब शुद्ध सफेद रंग