回答編集履歴

2

Update

2021/12/08 15:37

投稿

melian
melian

スコア19825

test CHANGED
@@ -88,7 +88,7 @@
88
88
 
89
89
 
90
90
 
91
- つまり、画像の depth が 8-bit の場合は `short` 型変数に合わせて正規化?しています。
91
+ つまり、画像の depth が 8-bit の場合は `unsigned short` 型変数(16-bit幅)に合わせて正規化?しています。
92
92
 
93
93
 
94
94
 
@@ -96,13 +96,13 @@
96
96
 
97
97
  ```python
98
98
 
99
- $ python3 -c 'import cv2;print("明るい" if cv2.imread("bright.png").mean()/255.0*65535.0 > 25000 else "くらい")'
99
+ $ python3 -c 'import cv2;print("明るい" if cv2.imread("bright.png").mean()*257.0 > 25000 else "くらい")'
100
100
 
101
101
  明るい
102
102
 
103
103
 
104
104
 
105
- $ python3 -c 'import cv2;print("明るい" if cv2.imread("dark.png").mean()/255.0*65535.0 > 25000 else "くらい")'
105
+ $ python3 -c 'import cv2;print("明るい" if cv2.imread("dark.png").mean()*257.0 > 25000 else "くらい")'
106
106
 
107
107
  くらい
108
108
 

1

Update

2021/12/08 15:37

投稿

melian
melian

スコア19825

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