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

回答編集履歴

2

Update

2021/12/08 15:37

投稿

melian
melian

スコア21263

answer CHANGED
@@ -43,14 +43,14 @@
43
43
 
44
44
  [ImageMagick/statistic.c at main · ImageMagick/ImageMagick](https://github.com/ImageMagick/ImageMagick/blob/main/MagickCore/statistic.c#L3004)
45
45
 
46
- つまり、画像の depth が 8-bit の場合は `short` 型変数に合わせて正規化?しています。
46
+ つまり、画像の depth が 8-bit の場合は `unsigned short` 型変数(16-bit幅)に合わせて正規化?しています。
47
47
 
48
48
  その様な訳ですので以下になります。
49
49
  ```python
50
- $ python3 -c 'import cv2;print("明るい" if cv2.imread("bright.png").mean()/255.0*65535.0 > 25000 else "くらい")'
50
+ $ python3 -c 'import cv2;print("明るい" if cv2.imread("bright.png").mean()*257.0 > 25000 else "くらい")'
51
51
  明るい
52
52
 
53
- $ python3 -c 'import cv2;print("明るい" if cv2.imread("dark.png").mean()/255.0*65535.0 > 25000 else "くらい")'
53
+ $ python3 -c 'import cv2;print("明るい" if cv2.imread("dark.png").mean()*257.0 > 25000 else "くらい")'
54
54
  くらい
55
55
  ```
56
56
 

1

Update

2021/12/08 15:37

投稿

melian
melian

スコア21263

answer CHANGED
@@ -1,3 +1,60 @@
1
+ > もしくは、ImageMagickを使わないで、画像の明暗を数字を使って判断するプログラムを教えてください。
2
+
3
+ 以下の `bright.png` と `dark.png` は [なぜこの処理になるのかわかりません。](https://teratail.com/questions/372695) に載せられている[画像](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/4985b4f36596439fcd2c62a033be8e84.png)を左右で分割したものです(右:`bright.png`,左:`dark.png`)。
4
+
5
+ CV2 の `cv2.mean()` に相当するのは `%[mean]` ではなく `%[fx:mean]` になります。
6
+ ```sh
7
+ $ identify -version
8
+ Version: ImageMagick 6.9.11-60 Q16 x86_64 2021-01-25 https://imagemagick.org
9
+ Copyright: (C) 1999-2021 ImageMagick Studio LLC
10
+
11
+ $ identify -format '%[mean]' bright.png
12
+ 26652.4
13
+ $ identify -format '%[fx:mean]' bright.png
14
+ 0.406689
15
+ $ python3 -c 'import cv2;print(cv2.imread("bright.png").mean()/255.0)'
16
+ 0.4066887976982881
17
+
18
+ $ identify -format '%[mean]' dark.png
19
+ 20900.2
20
+ $ identify -format '%[fx:mean]' dark.png
21
+ 0.318916
22
+ $ python3 -c 'import cv2;print(cv2.imread("dark.png").mean()/255.0)'
23
+ 0.3189159146035574
24
+
25
+ # 1x1 pixel image
26
+ $ convert -size 1x1 xc:white w.png
27
+ $ identify -format '%[mean]' w.png
28
+ 65535
29
+ $ identify -format '%[fx:mean]' w.png
30
+ 1
31
+ ```
32
+
33
+ もはや察しが付くかと思いますが、
34
+ ```
35
+ (identify -format '%[mean]') == 257 * (255 * (identify -format '%[fx:mean]'))
36
+ // 257 * 255 == 65535
37
+ ```
38
+ となっています。そこで ImageMagick のソースコードを眺めて見ると、以下の様な処理が行われています。
39
+
40
+ [ImageMagick/quantum-private.h at main · ImageMagick/ImageMagick](https://github.com/ImageMagick/ImageMagick/blob/main/MagickCore/quantum-private.h#L418)
41
+
42
+ [ImageMagick/statistic.c at main · ImageMagick/ImageMagick](https://github.com/ImageMagick/ImageMagick/blob/main/MagickCore/statistic.c#L2829)
43
+
44
+ [ImageMagick/statistic.c at main · ImageMagick/ImageMagick](https://github.com/ImageMagick/ImageMagick/blob/main/MagickCore/statistic.c#L3004)
45
+
46
+ つまり、画像の depth が 8-bit の場合は `short` 型変数に合わせて正規化?しています。
47
+
48
+ その様な訳ですので以下になります。
49
+ ```python
50
+ $ python3 -c 'import cv2;print("明るい" if cv2.imread("bright.png").mean()/255.0*65535.0 > 25000 else "くらい")'
51
+ 明るい
52
+
53
+ $ python3 -c 'import cv2;print("明るい" if cv2.imread("dark.png").mean()/255.0*65535.0 > 25000 else "くらい")'
54
+ くらい
55
+ ```
56
+
57
+
1
58
  > ImageMagick の identify を用いる場合、「Python3 subprocess + ImageMagick identifyで画像のexif情報を取得する」というサイトを参考にしたのプログラムを作成しましたがダメでした。
2
59
 
3
60
  ```python