回答編集履歴

5

ちょっとなおした。

2018/09/30 14:43

投稿

退会済みユーザー
test CHANGED
@@ -12,7 +12,9 @@
12
12
 
13
13
 
14
14
 
15
- ヒストグラムの場合、Matは行1, 列複数, (おそらく)チャネル1の三次元配列みたくなります。
15
+ ヒストグラムの場合、Matは行1, 列複数, チャネル1の三次元配列みたくなります。
16
+
17
+ このときのチャンネルは色ではなく頻度です。
16
18
 
17
19
 
18
20
 
@@ -20,7 +22,7 @@
20
22
 
21
23
  ```C#
22
24
 
23
- Hist.GetArray(x,y)[c]
25
+ hist.GetArray(x,y)[c]
24
26
 
25
27
  ```
26
28
 

4

サンプルコードを追記しました。

2018/09/30 14:43

投稿

退会済みユーザー
test CHANGED
@@ -49,3 +49,155 @@
49
49
  Debug.WriteLine(hist.GetArray(i, 0)[0]);
50
50
 
51
51
  ```
52
+
53
+
54
+
55
+ ### 追記
56
+
57
+
58
+
59
+ サンプルコードとしてはこんな感じです。
60
+
61
+
62
+
63
+ ```C#
64
+
65
+
66
+
67
+ public void OutputHists()
68
+
69
+ {
70
+
71
+ var histB = new Mat();
72
+
73
+ var histG = new Mat();
74
+
75
+ var histR = new Mat();
76
+
77
+
78
+
79
+ using (var imgBGR = Cv2.ImRead(@"C:\Users\ppn\Desktop\Lenna.png"))
80
+
81
+ {
82
+
83
+ // 青に関するヒストグラムを作成します
84
+
85
+ Cv2.CalcHist(
86
+
87
+ images: new Mat[] { imgBGR },
88
+
89
+ channels: new int[] { 0 }, // 0: B
90
+
91
+ mask: new Mat(), // マスクは利用しません
92
+
93
+ hist: histB,
94
+
95
+ dims: 1,
96
+
97
+ histSize: new int[] { 256 },
98
+
99
+ ranges: new float[][] { new float[] { 0, 256 } },
100
+
101
+ uniform: true, // ヒストグラムは一様です
102
+
103
+ accumulate: false
104
+
105
+ );
106
+
107
+ // 緑に関するヒストグラムを作成します
108
+
109
+ Cv2.CalcHist(
110
+
111
+ images: new Mat[] { imgBGR },
112
+
113
+ channels: new int[] { 1 }, // 1: G
114
+
115
+ mask: new Mat(), // マスクは利用しません
116
+
117
+ hist: histG,
118
+
119
+ dims: 1,
120
+
121
+ histSize: new int[] { 256 },
122
+
123
+ ranges: new float[][] { new float[] { 0, 256 } },
124
+
125
+ uniform: true, // ヒストグラムは一様です
126
+
127
+ accumulate: false
128
+
129
+ );
130
+
131
+ // 赤に関するヒストグラムを作成します
132
+
133
+ Cv2.CalcHist(
134
+
135
+ images: new Mat[] { imgBGR },
136
+
137
+ channels: new int[] { 2 }, // 2: R
138
+
139
+ mask: new Mat(), // マスクは利用しません
140
+
141
+ hist: histR,
142
+
143
+ dims: 1,
144
+
145
+ histSize: new int[] { 256 },
146
+
147
+ ranges: new float[][] { new float[] { 0, 256 } },
148
+
149
+ uniform: true, // ヒストグラムは一様です
150
+
151
+ accumulate: false
152
+
153
+ );
154
+
155
+
156
+
157
+ // 青に関するヒストグラム
158
+
159
+ for (var i = 0; i < histB.Rows; i++)
160
+
161
+ {
162
+
163
+ var v = histB.GetArray(i, 0)[0];
164
+
165
+ Debug.Write(v + ", ");
166
+
167
+ }
168
+
169
+ Debug.WriteLine("");
170
+
171
+ // 緑に関するヒストグラム
172
+
173
+ for (var i = 0; i < histG.Rows; i++)
174
+
175
+ {
176
+
177
+ var v = histG.GetArray(i, 0)[0];
178
+
179
+ Debug.Write(v + ", ");
180
+
181
+ }
182
+
183
+ Debug.WriteLine("");
184
+
185
+ // 赤に関するヒストグラム
186
+
187
+ for (var i = 0; i < histR.Rows; i++)
188
+
189
+ {
190
+
191
+ var v = histR.GetArray(i, 0)[0];
192
+
193
+ Debug.Write(v + ", ");
194
+
195
+ }
196
+
197
+ Debug.WriteLine("");
198
+
199
+ }
200
+
201
+ }
202
+
203
+ ```

3

怪しかった点についてはっきりとわからなかったので濁してます(^^;

2018/09/30 14:27

投稿

退会済みユーザー
test CHANGED
@@ -12,9 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- ~~ヒストグラムの場合、Matは行1, 列複数, チャネル複数の三次元配列みたくなります。~~
15
+ ヒストグラムの場合、Matは行1, 列複数, (おそらく)チャネル1の三次元配列みたくなります。
16
-
17
- => すみません、ここ怪しいので確認します。
18
16
 
19
17
 
20
18
 
@@ -40,7 +38,9 @@
40
38
 
41
39
 
42
40
 
43
- グレイスケール(チャンネルが1つ)の場合、次のコードのようにヒストグラムの値取得できます。
41
+ ヒストグラムの値は次のように取得できます。
42
+
43
+ CalcHistの仕様が理解しきれなかったのですが、もしかすると使い方によってはチャンネルが複数になることがあるかもしれません。
44
44
 
45
45
  ```C#
46
46
 
@@ -49,19 +49,3 @@
49
49
  Debug.WriteLine(hist.GetArray(i, 0)[0]);
50
50
 
51
51
  ```
52
-
53
-
54
-
55
- ~~RGB、HSVなど(チャンネルが複数)の場合、次のコードのようにヒストグラムの値を取得できます。~~
56
-
57
- => すみません、ここ怪しいので確認します。
58
-
59
- ```C#
60
-
61
- for (var i = 0; i < hist.Rows; i++)
62
-
63
- for (var c = 0; c < hist.GetArray(0, 0).Length; c++)
64
-
65
- Debug.WriteLine(hist.GetArray(i, 0)[c]);
66
-
67
- ```

2

回答に怪しい箇所がありました

2018/09/30 12:27

投稿

退会済みユーザー
test CHANGED
@@ -12,7 +12,9 @@
12
12
 
13
13
 
14
14
 
15
- ヒストグラムの場合、Matは行1, 列複数, チャネル複数の三次元配列みたくなります。
15
+ ~~ヒストグラムの場合、Matは行1, 列複数, チャネル複数の三次元配列みたくなります。~~
16
+
17
+ => すみません、ここ怪しいので確認します。
16
18
 
17
19
 
18
20
 
@@ -50,7 +52,9 @@
50
52
 
51
53
 
52
54
 
53
- RGB、HSVなど(チャンネルが複数)の場合、次のコードのようにヒストグラムの値を取得できます。
55
+ ~~RGB、HSVなど(チャンネルが複数)の場合、次のコードのようにヒストグラムの値を取得できます。~~
56
+
57
+ => すみません、ここ怪しいので確認します。
54
58
 
55
59
  ```C#
56
60
 

1

もう少しわかりやすくしました。

2018/09/30 12:05

投稿

退会済みユーザー
test CHANGED
@@ -1,8 +1,40 @@
1
- Matがどういったものかわかると解決します。
1
+ Matがどういったものかわかった上で、公開されていメソッド一覧を見ると解決します。
2
+
3
+ また、Matを理解するためには、チャンネルというものが何かを理解する必要があります。
2
4
 
3
5
 
4
6
 
7
+ チャンネルというのは、例えばRGBのことです。
8
+
9
+ Rチャンネル、Gチャンネル、Bチャンネルです。
10
+
11
+ このチャンネルがあるため、画像から得られるMatは縦、横、色の3次元配列みたくなります。
12
+
13
+
14
+
15
+ ヒストグラムの場合、Matは行1, 列複数, チャネル複数の三次元配列みたくなります。
16
+
17
+
18
+
19
+ 求める値を得るには次の関数を使います。
20
+
21
+ ```C#
22
+
23
+ Hist.GetArray(x,y)[c]
24
+
25
+ ```
26
+
27
+ まずチャンネルの配列を取得し、さらに指定したチャンネルの値を取得します。
28
+
29
+ - x: 行番号
30
+
31
+ - y: 列番号
32
+
33
+ - c: チャンネル番号
34
+
35
+
36
+
5
- [cv::Matの基本処理](http://opencv.jp/cookbook/opencv_mat.html)の、"マルチチャンネルと多次元配列"という項目を読んでみてください。図があるのでわかりやすいです。C++のドキュメントですが、基本は変わりません。
37
+ [cv::Matの基本処理](http://opencv.jp/cookbook/opencv_mat.html)の、"マルチチャンネルと多次元配列"という項目を読んでみてください。図があるので非常にわかりやすいです。C++のドキュメントですが、基本は変わりません。
6
38
 
7
39
 
8
40
 
@@ -29,13 +61,3 @@
29
61
  Debug.WriteLine(hist.GetArray(i, 0)[c]);
30
62
 
31
63
  ```
32
-
33
-
34
-
35
- GetArray(x,y)[c]という部分ですが、まずチャンネルの配列を取得し、さらに指定したチャンネルの値を取得しています。
36
-
37
- - x: 行番号
38
-
39
- - y: 列番号
40
-
41
- - c: チャンネル番号