回答編集履歴
2
Update
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()
|
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()
|
53
|
+
$ python3 -c 'import cv2;print("明るい" if cv2.imread("dark.png").mean()*257.0 > 25000 else "くらい")'
|
54
54
|
くらい
|
55
55
|
```
|
56
56
|
|
1
Update
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
|