質問編集履歴

3 更新

north_redwings

north_redwings score 30

2018/06/05 09:06  投稿

openCV 画素の書き換え
微分フィルタを画像にかけるプログラムを書いています。
流れは以下の通りです。
1.Vec3b型の2次元配列BGRに画素を代入する
(ただし,1回り大きく配列を取り, 周辺の画素を全て0に設定する)
2.縦方向の微分フィルタと横方向の微分フィルタとで分けて別々にかける
3.Vec3b型の2次元配列BGR_h, BGR_vに画素を代入する
4.BGR_h, BGR_vの値をImg_h, Img_vの画素に代入し, 書き換える
しかし、何度試しても画像が変わりません。
色々デバッグして画素は変わっている気がするのですが...
```C++
// 画像処理工学 レポート  
 
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
   Mat Img = imread("lena.jpeg");
   double h_filter[3][3] = { {-0.125, -0, -0.125}, {-0.25, 0, 0.25}, {-0.125, 0, 0.125} };
   double v_filter[3][3] = { {0.125, 0.25, 0.125}, {0, 0, 0}, {-0.125, -0.25, -0.125} };
   int width = Img.cols;
   int height = Img.rows;
   Vec3b BGR[width+2][height+2], BGR_h[width][height], BGR_v[width][height];
   int row, col;
   for (row=0; row<height; row++){
       for (col=0; col<width; col++){
           BGR[row+1][col+1] = Img.at<Vec3b>(row, col);
           BGR[0][col] = Vec3b(0, 0, 0);
           BGR[height][col] = Vec3b(0, 0, 0);
           BGR[row][0] = Vec3b(0, 0, 0);
           BGR[row][width] = Vec3b(0, 0, 0);
       }
   }
   int i, j;
   for (row=0; row<height; row++) {
       for (col=0; col<width; col++) {
           for (i=0; i<3; i++) {
               for (j=0; j<3; j++) {
                   BGR_h[row][col] += BGR[row+1-i+1][col-1+j+1] * h_filter[i][j];
                   BGR_v[row][col] += BGR[row+1-i+1][col-1+j+1] * v_filter[i][j];
               }
           }
       }
   }
   Mat Img_h = Img, Img_v = Img;
   for (row=0; row<height; row++){
       for (col=0; col<width; col++){
           // Img.at<Vec3b>(row, col) = Vec3b(0,0,0);
           cout << "Img_h.at<Vec3b>(" << row <<"," << col << ")="<< Img_h.at<Vec3b>(row, col) << endl;
           // Img_h.at<Vec3b>(row, col) = BGR_h[row][col];
           Img_h.at<Vec3b>(row, col) = Vec3b(0, 0, 0);
           // cout << "BGR_h[row][col] = " << BGR_h[row][col] << endl;
           cout << "代入後Img_h.at<Vec3b>(" << row <<"," << col << ")=" << Img_h.at<Vec3b>(row, col) << endl;;
           cout <<"\n";
           Img_v.at<Vec3b>(row, col) = BGR_v[row][col];
       }
   }
   // int bgr = BGR_h[4][4][0];
   // cout << BGR_h[4][4]*3 << endl;
   // cout << bgr << endl;
   imshow("test", Img);
   imshow("test_h", Img_h);
   imshow("test_v", Img_v);
   int key = waitKey(1000000);
   return 0;
}
```
とりあえず全てBGR_hはVec3b(0,0,0)で変更する様にしてでバックしてます。
ターミナルでの表示は,
```
Img_h.at<Vec3b>(0,0)=[12, 16, 35]
代入後Img_h.at<Vec3b>(0,0)=[0, 0, 0]
Img_h.at<Vec3b>(0,1)=[15, 19, 38]
代入後Img_h.at<Vec3b>(0,1)=[0, 0, 0]
Img_h.at<Vec3b>(0,2)=[10, 14, 32]
代入後Img_h.at<Vec3b>(0,2)=[0, 0, 0]
Img_h.at<Vec3b>(0,3)=[12, 15, 36]
代入後Img_h.at<Vec3b>(0,3)=[0, 0, 0]
Img_h.at<Vec3b>(0,4)=[9, 15, 34]
代入後Img_h.at<Vec3b>(0,4)=[0, 0, 0]
Img_h.at<Vec3b>(0,5)=[13, 16, 37]
代入後Img_h.at<Vec3b>(0,5)=[0, 0, 0]
Img_h.at<Vec3b>(0,6)=[9, 16, 33]
代入後Img_h.at<Vec3b>(0,6)=[0, 0, 0]
Img_h.at<Vec3b>(0,7)=[9, 16, 33]
代入後Img_h.at<Vec3b>(0,7)=[0, 0, 0]
Img_h.at<Vec3b>(0,8)=[11, 15, 33]
代入後Img_h.at<Vec3b>(0,8)=[0, 0, 0]
Img_h.at<Vec3b>(0,9)=[11, 15, 34]
代入後Img_h.at<Vec3b>(0,9)=[0, 0, 0]
Img_h.at<Vec3b>(0,10)=[9, 13, 31]
代入後Img_h.at<Vec3b>(0,10)=[0, 0, 0]
~~~
以下同様
```
![イメージ説明](6d61bc9c585deabb2ad894031d8c696a.png)
結果はこの様な形でそもそも元の画像も微妙に変わってしまっています...
  • C++

    5020 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenCV

    1770 questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

2 内容の更新

north_redwings

north_redwings score 30

2018/06/05 09:05  投稿

openCV 画素の書き換え
微分フィルタを画像にかけるプログラムを書いています。
流れは以下の通りです。
1.Vec3b型の2次元配列BGRに画素を代入する
(ただし,1回り大きく配列を取り, 周辺の画素を全て0に設定する)
2.縦方向の微分フィルタと横方向の微分フィルタとで分けて別々にかける
3.Vec3b型の2次元配列BGR_h, BGR_vに画素を代入する
4.BGR_h, BGR_vの値をImg_h, Img_vの画素に代入し, 書き換える
しかし、何度試しても画像が変わりません。
色々デバッグして画素は変わっている気がするのですが...
```C++
// 画像処理工学 レポート  
 
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
   Mat Img = imread("lena.jpg");
   Mat Img = imread("lena.jpeg");
   double h_filter[3][3] = { {-0.125, -0, -0.125}, {-0.25, 0, 0.25}, {-0.125, 0, 0.125} };
   double v_filter[3][3] = { {0.125, 0.25, 0.125}, {0, 0, 0}, {-0.125, -0.25, -0.125} };
   int width = Img.cols;
   int height = Img.rows;
   Vec3b BGR[width+2][height+2], BGR_h[width][height], BGR_v[width][height];
   int row, col;
   for (row=0; row<height; row++){
       for (col=0; col<width; col++){
           BGR[row+1][col+1] = Img.at<Vec3b>(row, col);
           BGR[0][col] = Vec3b(0, 0, 0);
           BGR[height][col] = Vec3b(0, 0, 0);
           BGR[row][0] = Vec3b(0, 0, 0);
           BGR[row][width] = Vec3b(0, 0, 0);
       }
   }
   int i, j;
   for (row=0; row<height; row++) {
       for (col=0; col<width; col++) {
           for (i=0; i<3; i++) {
               for (j=0; j<3; j++) {
                   BGR_h[row][col] += BGR[row+1-i+1][col-1+j+1] * h_filter[i][j];
                   BGR_v[row][col] += BGR[row+1-i+1][col-1+j+1] * v_filter[i][j];
               }
           }
       }
   }
   Mat Img_h = Img, Img_v = Img;
   for (row=0; row<height; row++){
       for (col=0; col<width; col++){
           // Img.at<Vec3b>(row, col) = Vec3b(0,0,0);
           cout << "Img_h.at<Vec3b>(row, col) = " << Img_h.at<Vec3b>(row, col) << endl;
           cout << "Img_h.at<Vec3b>(" << row <<"," << col << ")="<< Img_h.at<Vec3b>(row, col) << endl;
           // Img_h.at<Vec3b>(row, col) = BGR_h[row][col];
           Img_h.at<Vec3b>(row, col) = Vec3b(0, 0, 0);
           // cout << "BGR_h[row][col] = " << BGR_h[row][col] << endl;
           cout << "代入後Img_h.at<Vec3b>(row, col) = " << Img_h.at<Vec3b>(row, col) << endl;;
           cout << "代入後Img_h.at<Vec3b>(" << row <<"," << col << ")=" << Img_h.at<Vec3b>(row, col) << endl;;
           cout <<"\n";
           Img_v.at<Vec3b>(row, col) = BGR_v[row][col];
       }
   }
   // int bgr = BGR_h[4][4][0];
   // cout << BGR_h[4][4]*3 << endl;
   // cout << bgr << endl;
   imshow("test", Img);
   imshow("test_h", Img_h);
   imshow("test_v", Img_v);
   int key = waitKey(1000000);
   return 0;
}
 
```
とりあえず全てBGR_hはVec3b(0,0,0)で変更する様にしてでバックしてます。
ターミナルでの表示は,
```
Img_h.at<Vec3b>(row, col) = [213, 204, 201]
BGR_h[row][col]
代入後Img_h.at<Vec3b>(row, col) = [53, 51, 50]
Img_h.at<Vec3b>(row, col) = [213, 204, 201]
BGR_h[row][col]
代入後Img_h.at<Vec3b>(row, col) = [53, 51, 50]
Img_h.at<Vec3b>(row, col) = [213, 204, 201]
BGR_h[row][col]
代入後Img_h.at<Vec3b>(row, col) = [53, 51, 50]
Img_h.at<Vec3b>(row, col) = [213, 204, 201]
BGR_h[row][col]
代入後Img_h.at<Vec3b>(row, col) = [53, 51, 50]
Img_h.at<Vec3b>(row, col) = [213, 204, 201]
BGR_h[row][col]
代入後Img_h.at<Vec3b>(row, col) = [53, 51, 50]
Img_h.at<Vec3b>(0,0)=[12, 16, 35]
代入後Img_h.at<Vec3b>(0,0)=[0, 0, 0]
Img_h.at<Vec3b>(0,1)=[15, 19, 38]
代入後Img_h.at<Vec3b>(0,1)=[0, 0, 0]
Img_h.at<Vec3b>(0,2)=[10, 14, 32]
代入後Img_h.at<Vec3b>(0,2)=[0, 0, 0]
Img_h.at<Vec3b>(0,3)=[12, 15, 36]
代入後Img_h.at<Vec3b>(0,3)=[0, 0, 0]
Img_h.at<Vec3b>(0,4)=[9, 15, 34]
代入後Img_h.at<Vec3b>(0,4)=[0, 0, 0]
Img_h.at<Vec3b>(0,5)=[13, 16, 37]
代入後Img_h.at<Vec3b>(0,5)=[0, 0, 0]
Img_h.at<Vec3b>(0,6)=[9, 16, 33]
代入後Img_h.at<Vec3b>(0,6)=[0, 0, 0]
Img_h.at<Vec3b>(0,7)=[9, 16, 33]
代入後Img_h.at<Vec3b>(0,7)=[0, 0, 0]
Img_h.at<Vec3b>(0,8)=[11, 15, 33]
代入後Img_h.at<Vec3b>(0,8)=[0, 0, 0]
Img_h.at<Vec3b>(0,9)=[11, 15, 34]
代入後Img_h.at<Vec3b>(0,9)=[0, 0, 0]
Img_h.at<Vec3b>(0,10)=[9, 13, 31]
代入後Img_h.at<Vec3b>(0,10)=[0, 0, 0]
~~~
Img_h.at<Vec3b>(row, col) = [169, 177, 217]
BGR_h[row][col] = [63, 66, 81]
代入後Img_h.at<Vec3b>(row, col) = [63, 66, 81]
Img_h.at<Vec3b>(row, col) = [166, 174, 214]
BGR_h[row][col] = [60, 63, 79]
代入後Img_h.at<Vec3b>(row, col) = [60, 63, 79]
Img_h.at<Vec3b>(row, col) = [161, 168, 211]
BGR_h[row][col] = [57, 61, 78]
代入後Img_h.at<Vec3b>(row, col) = [57, 61, 78]
~~~
Img_h.at<Vec3b>(row, col) = [179, 168, 170]
代入後Img_h.at<Vec3b>(row, col) = [0, 0, 0]
Img_h.at<Vec3b>(row, col) = [189, 181, 182]
代入後Img_h.at<Vec3b>(row, col) = [0, 0, 0]
Img_h.at<Vec3b>(row, col) = [138, 131, 136]
代入後Img_h.at<Vec3b>(row, col) = [0, 0, 0]
以下同様
```
![イメージ説明](6d61bc9c585deabb2ad894031d8c696a.png)
結果はこの様な形でそもそも元の画像も微妙に変わってしまっています...
  • C++

    5020 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenCV

    1770 questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

1 内容の更新

north_redwings

north_redwings score 30

2018/06/05 09:00  投稿

openCV 画素の書き換え
微分フィルタを画像にかけるプログラムを書いています。
流れは以下の通りです。
1.Vec3b型の2次元配列BGRに画素を代入する
(ただし,1回り大きく配列を取り, 周辺の画素を全て0に設定する)
2.縦方向の微分フィルタと横方向の微分フィルタとで分けて別々にかける
3.Vec3b型の2次元配列BGR_h, BGR_vに画素を代入する
4.BGR_h, BGR_vの値をImg_h, Img_vの画素に代入し, 書き換える
しかし、何度試しても画像が変わりません。
色々デバッグして画素は変わっている気がするのですが...
```C++
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
   Mat Img = imread("lena.jpg");
   double h_filter[3][3] = { {-0.125, -0, -0.125}, {-0.25, 0, 0.25}, {-0.125, 0, 0.125} };
   double v_filter[3][3] = { {0.125, 0.25, 0.125}, {0, 0, 0}, {-0.125, -0.25, -0.125} };
   int width = Img.cols;
   int height = Img.rows;
   Vec3b BGR[width+2][height+2], BGR_h[width][height], BGR_v[width][height];
   int row, col;
   for (row=0; row<height; row++){
       for (col=0; col<width; col++){
           BGR[row+1][col+1] = Img.at<Vec3b>(row, col);
           BGR[0][col] = Vec3b(0, 0, 0);
           BGR[height][col] = Vec3b(0, 0, 0);
           BGR[row][0] = Vec3b(0, 0, 0);
           BGR[row][width] = Vec3b(0, 0, 0);
       }
   }
   int i, j;
   for (row=0; row<height; row++) {
       for (col=0; col<width; col++) {
           for (i=0; i<3; i++) {
               for (j=0; j<3; j++) {
                   BGR_h[row][col] += BGR[row+1-i+1][col-1+j+1] * h_filter[i][j];
                   BGR_v[row][col] += BGR[row+1-i+1][col-1+j+1] * v_filter[i][j];
               }
           }
       }
   }
   Mat Img_h = Img, Img_v = Img;
   for (row=0; row<height; row++){
       for (col=0; col<width; col++){
           // Img.at<Vec3b>(row, col) = Vec3b(0,0,0);
           cout << "Img_h.at<Vec3b>(row, col) = " << Img_h.at<Vec3b>(row, col) << endl;
           // Img_h.at<Vec3b>(row, col) = BGR_h[row][col];
           Img_h.at<Vec3b>(row, col) = Vec3b(0, 0, 0);
           // cout << "BGR_h[row][col] = " << BGR_h[row][col] << endl;
           cout << "代入後Img_h.at<Vec3b>(row, col) = " << Img_h.at<Vec3b>(row, col) << endl;;
           cout <<"\n";
           Img_v.at<Vec3b>(row, col) = BGR_v[row][col];
       }
   }
   // int bgr = BGR_h[4][4][0];
   // cout << BGR_h[4][4]*3 << endl;
   // cout << bgr << endl;
   imshow("test", Img);
   imshow("test_h", Img_h);
   imshow("test_v", Img_v);
   int key = waitKey(1000000);
   return 0;
}
```
とりあえず全てBGR_hはVec3b(0,0,0)で変更する様にしてでバックしてます。
ターミナルでの表示は,
```
Img_h.at<Vec3b>(row, col) = [213, 204, 201]
BGR_h[row][col]
代入後Img_h.at<Vec3b>(row, col) = [53, 51, 50]
Img_h.at<Vec3b>(row, col) = [213, 204, 201]
BGR_h[row][col]
代入後Img_h.at<Vec3b>(row, col) = [53, 51, 50]
Img_h.at<Vec3b>(row, col) = [213, 204, 201]
BGR_h[row][col]
代入後Img_h.at<Vec3b>(row, col) = [53, 51, 50]
Img_h.at<Vec3b>(row, col) = [213, 204, 201]
BGR_h[row][col]
代入後Img_h.at<Vec3b>(row, col) = [53, 51, 50]
Img_h.at<Vec3b>(row, col) = [213, 204, 201]
BGR_h[row][col]
代入後Img_h.at<Vec3b>(row, col) = [53, 51, 50]
(以下同様)
~~~
Img_h.at<Vec3b>(row, col) = [169, 177, 217]
BGR_h[row][col] = [63, 66, 81]
代入後Img_h.at<Vec3b>(row, col) = [63, 66, 81]
Img_h.at<Vec3b>(row, col) = [166, 174, 214]
BGR_h[row][col] = [60, 63, 79]
代入後Img_h.at<Vec3b>(row, col) = [60, 63, 79]
Img_h.at<Vec3b>(row, col) = [161, 168, 211]
BGR_h[row][col] = [57, 61, 78]
代入後Img_h.at<Vec3b>(row, col) = [57, 61, 78]
~~~
Img_h.at<Vec3b>(row, col) = [179, 168, 170]
代入後Img_h.at<Vec3b>(row, col) = [0, 0, 0]
Img_h.at<Vec3b>(row, col) = [189, 181, 182]
代入後Img_h.at<Vec3b>(row, col) = [0, 0, 0]
Img_h.at<Vec3b>(row, col) = [138, 131, 136]
代入後Img_h.at<Vec3b>(row, col) = [0, 0, 0]
```
![イメージ説明](6d61bc9c585deabb2ad894031d8c696a.png)
結果はこの様な形でそもそも元の画像も微妙に変わってしまっています...
  • C++

    5020 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenCV

    1770 questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る