回答編集履歴

9

変更!

2018/07/25 05:05

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -66,7 +66,7 @@
66
66
 
67
67
  ```Python
68
68
 
69
- part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
69
+ gray = cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY)
70
70
 
71
71
  ```
72
72
 

8

np.einsumからnp.stackに変更

2018/07/25 05:05

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -28,7 +28,9 @@
28
28
 
29
29
  gray = np.ceil(np.dot(part_height[..., :3], [0.3, 0.59, 0.11]))
30
30
 
31
+ # 1ch => 3ch
32
+
31
- part_height = np.einsum('ij,k->ijk', gray, [1, 1, 1])
33
+ part_height = np.stack((gray,) * 3, -1)
32
34
 
33
35
  # 戻り値に実行時間を追加
34
36
 

7

追記

2018/07/24 23:57

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -60,9 +60,7 @@
60
60
 
61
61
 
62
62
 
63
- b, あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
63
+ b, あとはグレースケール変換部分を`cv2.cvtColor`を使ったこのような形にでも。
64
-
65
- ※このコードの場合は質問文と同じグレースケール値ではないです。
66
64
 
67
65
  ```Python
68
66
 

6

np.ceilを追加

2018/07/24 22:01

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  part_height = img[ number : endPioint-1 ]
28
28
 
29
- gray = np.dot(part_height[..., :3], [0.3, 0.59, 0.11])
29
+ gray = np.ceil(np.dot(part_height[..., :3], [0.3, 0.59, 0.11]))
30
30
 
31
31
  part_height = np.einsum('ij,k->ijk', gray, [1, 1, 1])
32
32
 

5

追記

2018/07/24 21:54

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
 
10
10
 
11
- [行列によるグレースケール化編 ~Python画像処理の再発明家~](https://qiita.com/secang0/items/6fba02d7cc3ef34c0c31#ntsc-%E4%BF%82%E6%95%B0%E3%81%AB%E3%82%88%E3%82%8B%E5%8A%A0%E9%87%8D%E5%B9%B3%E5%9D%87%E6%B3%95)を参考に。
11
+ [How can I convert an RGB image into grayscale in Python?](https://stackoverflow.com/questions/12201577/how-can-i-convert-an-rgb-image-into-grayscale-in-python)を参考に。
12
12
 
13
13
 
14
14
 
@@ -26,9 +26,9 @@
26
26
 
27
27
  part_height = img[ number : endPioint-1 ]
28
28
 
29
- R, G, B = part_height[..., 0], part_height[..., 1], part_height[..., 2]
29
+ gray = np.dot(part_height[..., :3], [0.3, 0.59, 0.11])
30
30
 
31
- part_height = np.einsum('ij,k->ijk', (0.3 * R + 0.59 * G + 0.11 * B), [1, 1, 1])
31
+ part_height = np.einsum('ij,k->ijk', gray, [1, 1, 1])
32
32
 
33
33
  # 戻り値に実行時間を追加
34
34
 
@@ -62,6 +62,8 @@
62
62
 
63
63
  b, あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
64
64
 
65
+ ※このコードの場合は質問文と同じグレースケール値ではないです。
66
+
65
67
  ```Python
66
68
 
67
69
  part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
@@ -79,3 +81,29 @@
79
81
  グレースケールデータは1次元で十分なので`as_completed`呼び出し側で一部の処理を行えば返す必要も無い気がします。
80
82
 
81
83
  これに関しては受け渡しする`pickle`のデータ量と`as_completed`呼び出し側の`CPU`時間のトレードオフになるのではないかと、プロファイリングを複数回採ってみた方がよいと思います。
84
+
85
+
86
+
87
+ ---
88
+
89
+ テスト中に気づいたのですが、質問文の元コードだと白色のグレースケール値が`254`になります。
90
+
91
+
92
+
93
+ こんな感じのハッシュ関数を作ってテストコードに入れておくのをお勧め致します。
94
+
95
+ ```Python
96
+
97
+ def image_hash(img):
98
+
99
+ from hashlib import sha384
100
+
101
+ x = np.ascontiguousarray(img, dtype=np.uint8)
102
+
103
+ print(sha384(x).hexdigest())
104
+
105
+ ```
106
+
107
+ ◇参考情報
108
+
109
+ [Fast way to Hash Numpy objects for Caching](https://stackoverflow.com/questions/5386694/fast-way-to-hash-numpy-objects-for-caching/)

4

pickleで受け渡しするデータに関して追記

2018/07/24 21:42

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- `numpy`はループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
5
+ a,`numpy`はループでピクセル単位に処理を行うと**ものすごーく時間**がかかるので。
6
6
 
7
7
  あまりテストできてませんが。
8
8
 
@@ -60,12 +60,22 @@
60
60
 
61
61
 
62
62
 
63
- ---
64
-
65
- あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
63
+ b, あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
66
64
 
67
65
  ```Python
68
66
 
69
67
  part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
70
68
 
71
69
  ```
70
+
71
+
72
+
73
+ ---
74
+
75
+
76
+
77
+ あと思いつく点としては、`changeToGray`の処理で戻り値として3次元(`RGB`)データを返していますが。
78
+
79
+ グレースケールデータは1次元で十分なので`as_completed`呼び出し側で一部の処理を行えば返す必要も無い気がします。
80
+
81
+ これに関しては受け渡しする`pickle`のデータ量と`as_completed`呼び出し側の`CPU`時間のトレードオフになるのではないかと、プロファイリングを複数回採ってみた方がよいと思います。

3

追記

2018/07/24 20:17

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -1,6 +1,10 @@
1
- あまりテスできませんが。
1
+ > 何処がボルネックになっいるか
2
+
3
+
2
4
 
3
5
  `numpy`はループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
6
+
7
+ あまりテストできてませんが。
4
8
 
5
9
 
6
10
 

2

変更!

2018/07/24 19:21

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -1,6 +1,6 @@
1
1
  あまりテストできてませんが。
2
2
 
3
- numpyはループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
3
+ `numpy`はループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
4
4
 
5
5
 
6
6
 
@@ -52,4 +52,16 @@
52
52
 
53
53
 
54
54
 
55
- ※numpyマニアな方なツッコミ待ちです。
55
+ **※numpyマニアな方なツッコミ待ちです。**
56
+
57
+
58
+
59
+ ---
60
+
61
+ あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
62
+
63
+ ```Python
64
+
65
+ part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
66
+
67
+ ```

1

ndarrayをそのまま渡すように

2018/07/24 19:20

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -24,9 +24,7 @@
24
24
 
25
25
  R, G, B = part_height[..., 0], part_height[..., 1], part_height[..., 2]
26
26
 
27
- part_height = (0.3 * R + 0.59 * G + 0.11 * B)
28
-
29
- part_height = np.einsum('ij,k->ijk', part_height, [1, 1, 1])
27
+ part_height = np.einsum('ij,k->ijk', (0.3 * R + 0.59 * G + 0.11 * B), [1, 1, 1])
30
28
 
31
29
  # 戻り値に実行時間を追加
32
30
 
@@ -51,3 +49,7 @@
51
49
  + print(exe_time)
52
50
 
53
51
  ```
52
+
53
+
54
+
55
+ ※numpyマニアな方なツッコミ待ちです。