C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++の画像スムーザー


画像のグレースケールを表す2DマトリックスMがあるとすると、各ピクセルのグレースケールが周囲の8つのピクセルすべてとそれ自体の平均グレースケール(切り捨て)になるように、より滑らかに設計する必要があります。セルの周囲のセルが8つ未満の場合は、可能なすべてのピクセルを変換します。

したがって、入力が次のような場合

1 1 1
1 0 1
1 1 1

その場合、出力は次のようになります

0 0 0
0 0 0
0 0 0

これを解決するには、次の手順に従います-

  • R:=Mの行数

  • C:=の列数

  • 配列を定義するd={-1、0、1}

  • サイズ(R x C)の2D配列解像度を1つ定義します

  • 初期化i:=0の場合、i

    • 初期化j:=0の場合、j

      • 合計:=0、カウント:=0

      • 初期化k:=0の場合、k <3の場合、更新(kを1増やします)、実行-

        • 初期化l:=0の場合、l − 3の場合、更新(lを1増やします)、実行-

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

          • m> =0かつm=0かつn

            • カウントを1増やし、合計=合計+ M [m、n]

      • res [i、j]:=合計/カウント

  • 解像度を返す

理解を深めるために、次の実装を見てみましょう-

#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));
}

入力

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

出力

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

  1. C ++を使用してOpenCVでバイナリイメージを反転する方法は?

    バイナリイメージを反転するとは、ピクセル値を反転することを意味します。視覚的な観点から、バイナリイメージを反転すると、白のピクセルは黒に変換され、黒のピクセルは白に変換されます。 この関数の基本的な形式は-です。 cvtColor(original_image, grayscale_image, COLOR_BGR2GRAY); 次の行は、グレースケール画像をバイナリ画像に変換し、変換された画像を「binary_image」行列に保存しています。 threshold(grayscale_image, binary_image, 100, 255, THRESH_BINARY); ここで、

  2. C ++を使用してOpenCVでバイナリイメージを作成するにはどうすればよいですか?

    バイナリイメージは、白黒の2色を表す単なるデジタルイメージです。画像処理の観点から、バイナリ画像には、0と1の2つの可能な値を持つピクセルが含まれています。ピクセルの値が0の場合、それは純粋な黒色を表します。ピクセルの値が1の場合、それは純粋な白色を意味します。 グレースケール画像では、それぞれに256の異なる可能な値があります。しかし、バイナリイメージでは、可能な値は2つだけです。バイナリイメージには、さまざまなタイプのアプリケーションがあります。たとえば、形態学的変換には2値画像が必要であり、背景からのオブジェクト形状の抽出には2値画像が必要です。OpenCVを使用すると、画像を2値画像