teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

9

変更!

2018/07/25 05:05

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  b, あとはグレースケール変換部分を`cv2.cvtColor`を使ったこのような形にでも。
34
34
  ```Python
35
- part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
35
+ gray = cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY)
36
36
  ```
37
37
 
38
38
  ---

8

np.einsumからnp.stackに変更

2018/07/25 05:05

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -13,7 +13,8 @@
13
13
  endPioint = number + length if number + length < len(img) else len(img) - 1
14
14
  part_height = img[ number : endPioint-1 ]
15
15
  gray = np.ceil(np.dot(part_height[..., :3], [0.3, 0.59, 0.11]))
16
+ # 1ch => 3ch
16
- part_height = np.einsum('ij,k->ijk', gray, [1, 1, 1])
17
+ part_height = np.stack((gray,) * 3, -1)
17
18
  # 戻り値に実行時間を追加
18
19
  return number, part_height, perf_counter() - st_time
19
20
  ```

7

追記

2018/07/24 23:57

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -29,8 +29,7 @@
29
29
 
30
30
  **※numpyマニアな方なツッコミ待ちです。**
31
31
 
32
- b, あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
32
+ b, あとはグレースケール変換部分を`cv2.cvtColor`を使ったこのような形にでも。
33
- ※このコードの場合は質問文と同じグレースケール値ではないです。
34
33
  ```Python
35
34
  part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
36
35
  ```

6

np.ceilを追加

2018/07/24 22:01

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -12,7 +12,7 @@
12
12
  st_time = perf_counter()
13
13
  endPioint = number + length if number + length < len(img) else len(img) - 1
14
14
  part_height = img[ number : endPioint-1 ]
15
- gray = np.dot(part_height[..., :3], [0.3, 0.59, 0.11])
15
+ gray = np.ceil(np.dot(part_height[..., :3], [0.3, 0.59, 0.11]))
16
16
  part_height = np.einsum('ij,k->ijk', gray, [1, 1, 1])
17
17
  # 戻り値に実行時間を追加
18
18
  return number, part_height, perf_counter() - st_time

5

追記

2018/07/24 21:54

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -3,7 +3,7 @@
3
3
  a,`numpy`はループでピクセル単位に処理を行うと**ものすごーく時間**がかかるので。
4
4
  あまりテストできてませんが。
5
5
 
6
- [行列によるグレースケール化編 ~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)を参考に。
6
+ [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)を参考に。
7
7
 
8
8
  ```Python
9
9
  from time import perf_counter
@@ -12,8 +12,8 @@
12
12
  st_time = perf_counter()
13
13
  endPioint = number + length if number + length < len(img) else len(img) - 1
14
14
  part_height = img[ number : endPioint-1 ]
15
- R, G, B = part_height[..., 0], part_height[..., 1], part_height[..., 2]
15
+ gray = np.dot(part_height[..., :3], [0.3, 0.59, 0.11])
16
- part_height = np.einsum('ij,k->ijk', (0.3 * R + 0.59 * G + 0.11 * B), [1, 1, 1])
16
+ part_height = np.einsum('ij,k->ijk', gray, [1, 1, 1])
17
17
  # 戻り値に実行時間を追加
18
18
  return number, part_height, perf_counter() - st_time
19
19
  ```
@@ -30,6 +30,7 @@
30
30
  **※numpyマニアな方なツッコミ待ちです。**
31
31
 
32
32
  b, あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
33
+ ※このコードの場合は質問文と同じグレースケール値ではないです。
33
34
  ```Python
34
35
  part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
35
36
  ```
@@ -38,4 +39,17 @@
38
39
 
39
40
  あと思いつく点としては、`changeToGray`の処理で戻り値として3次元(`RGB`)データを返していますが。
40
41
  グレースケールデータは1次元で十分なので`as_completed`呼び出し側で一部の処理を行えば返す必要も無い気がします。
41
- これに関しては受け渡しする`pickle`のデータ量と`as_completed`呼び出し側の`CPU`時間のトレードオフになるのではないかと、プロファイリングを複数回採ってみた方がよいと思います。
42
+ これに関しては受け渡しする`pickle`のデータ量と`as_completed`呼び出し側の`CPU`時間のトレードオフになるのではないかと、プロファイリングを複数回採ってみた方がよいと思います。
43
+
44
+ ---
45
+ テスト中に気づいたのですが、質問文の元コードだと白色のグレースケール値が`254`になります。
46
+
47
+ こんな感じのハッシュ関数を作ってテストコードに入れておくのをお勧め致します。
48
+ ```Python
49
+ def image_hash(img):
50
+ from hashlib import sha384
51
+ x = np.ascontiguousarray(img, dtype=np.uint8)
52
+ print(sha384(x).hexdigest())
53
+ ```
54
+ ◇参考情報
55
+ [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

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  > 何処がボトルネックになっているか
2
2
 
3
- `numpy`はループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
3
+ a,`numpy`はループでピクセル単位に処理を行うと**ものすごーく時間**がかかるので。
4
4
  あまりテストできてませんが。
5
5
 
6
6
  [行列によるグレースケール化編 ~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)を参考に。
@@ -29,8 +29,13 @@
29
29
 
30
30
  **※numpyマニアな方なツッコミ待ちです。**
31
31
 
32
- ---
33
- あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
32
+ b, あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
34
33
  ```Python
35
34
  part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
36
- ```
35
+ ```
36
+
37
+ ---
38
+
39
+ あと思いつく点としては、`changeToGray`の処理で戻り値として3次元(`RGB`)データを返していますが。
40
+ グレースケールデータは1次元で十分なので`as_completed`呼び出し側で一部の処理を行えば返す必要も無い気がします。
41
+ これに関しては受け渡しする`pickle`のデータ量と`as_completed`呼び出し側の`CPU`時間のトレードオフになるのではないかと、プロファイリングを複数回採ってみた方がよいと思います。

3

追記

2018/07/24 20:17

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -1,5 +1,7 @@
1
+ > 何処がボトルネックになっているか
2
+
3
+ `numpy`はループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
1
4
  あまりテストできてませんが。
2
- `numpy`はループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
3
5
 
4
6
  [行列によるグレースケール化編 ~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)を参考に。
5
7
 

2

変更!

2018/07/24 19:21

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -1,5 +1,5 @@
1
1
  あまりテストできてませんが。
2
- numpyはループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
2
+ `numpy`はループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
3
3
 
4
4
  [行列によるグレースケール化編 ~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)を参考に。
5
5
 
@@ -25,4 +25,10 @@
25
25
  + print(exe_time)
26
26
  ```
27
27
 
28
- ※numpyマニアな方なツッコミ待ちです。
28
+ **※numpyマニアな方なツッコミ待ちです。**
29
+
30
+ ---
31
+ あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
32
+ ```Python
33
+ part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
34
+ ```

1

ndarrayをそのまま渡すように

2018/07/24 19:20

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -11,8 +11,7 @@
11
11
  endPioint = number + length if number + length < len(img) else len(img) - 1
12
12
  part_height = img[ number : endPioint-1 ]
13
13
  R, G, B = part_height[..., 0], part_height[..., 1], part_height[..., 2]
14
- part_height = (0.3 * R + 0.59 * G + 0.11 * B)
15
- part_height = np.einsum('ij,k->ijk', part_height, [1, 1, 1])
14
+ part_height = np.einsum('ij,k->ijk', (0.3 * R + 0.59 * G + 0.11 * B), [1, 1, 1])
16
15
  # 戻り値に実行時間を追加
17
16
  return number, part_height, perf_counter() - st_time
18
17
  ```
@@ -24,4 +23,6 @@
24
23
  +for future in concurrent.futures.as_completed(fs):
25
24
  + line_number, part_height, exe_time = future.result()
26
25
  + print(exe_time)
27
- ```
26
+ ```
27
+
28
+ ※numpyマニアな方なツッコミ待ちです。