回答編集履歴

3

補足を記述

2020/12/11 01:58

投稿

fana
fana

スコア11663

test CHANGED
@@ -83,3 +83,47 @@
83
83
  }
84
84
 
85
85
  ```
86
+
87
+
88
+
89
+ ---
90
+
91
+
92
+
93
+ [補足]
94
+
95
+ [この処理のPython化の話をしている質問](https://teratail.com/questions/309376)にて,上記テストコードの処理内容に関する指摘があったのでその点を補足しておく.
96
+
97
+
98
+
99
+ **問題点**:
100
+
101
+ `double b = std::max<unsigned char>( 1, *pB ) / 255.0;`
102
+
103
+ の行が,*pBが0の場合についてはガードを入れているが,255の場合へのガードが抜けている.
104
+
105
+ そのため,*pBが255であるとき,`double g = log(0.5) / log(b);` の分母が0になってしまう.
106
+
107
+
108
+
109
+ **対策について**:
110
+
111
+ 0側と同様に,255側へのガードも入れれば良いであろうと思う.
112
+
113
+ すなわち,*pB の値を適当な有効範囲内に抑え込んでやればよかろう.
114
+
115
+
116
+
117
+ ```
118
+
119
+ //2つの閾値 T_min, T_max の値はてきとーに決めるとして.
120
+
121
+ const unsigned char T_min = 1; //1以上の値
122
+
123
+ const unsigned char T_max = 250; //254以下の値
124
+
125
+ ...
126
+
127
+ double b = std::max( T_min, std::min(T_max,*pB) ) / 255.0;
128
+
129
+ ```

2

コードの先頭文字が欠けてたので修正

2020/12/11 01:58

投稿

fana
fana

スコア11663

test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
  ```C++
38
38
 
39
- v::Mat Correction( const cv::Mat &Src, int KernelSizeFactor=6 )
39
+ cv::Mat Correction( const cv::Mat &Src, int KernelSizeFactor=6 )
40
40
 
41
41
  {
42
42
 

1

コード追記

2020/12/04 09:25

投稿

fana
fana

スコア11663

test CHANGED
@@ -29,3 +29,57 @@
29
29
 
30
30
 
31
31
  ![テスト処理結果](c2a5ad18fecc2ce89b5d6ad750f5e9cb.png)
32
+
33
+
34
+
35
+ テストに用いた明るさ補正コードです.(C++ですが)
36
+
37
+ ```C++
38
+
39
+ v::Mat Correction( const cv::Mat &Src, int KernelSizeFactor=6 )
40
+
41
+ {
42
+
43
+ cv::Mat Blurred;
44
+
45
+ {
46
+
47
+ int s = ( std::min( Src.rows, Src.cols ) / KernelSizeFactor ) | 0x01;
48
+
49
+ cv::GaussianBlur( Src, Blurred, cv::Size(s,s), 0 );
50
+
51
+ }
52
+
53
+
54
+
55
+ cv::Mat Result = cv::Mat( Src.rows, Src.cols, CV_8UC1 );
56
+
57
+ for( int y=0; y<Src.rows; ++y )
58
+
59
+ {
60
+
61
+ const unsigned char *pS = Src.ptr<unsigned char>(y);
62
+
63
+ const unsigned char *pB = Blurred.ptr<unsigned char>(y);
64
+
65
+ unsigned char *pR = Result.ptr<unsigned char>(y);
66
+
67
+ for( int x=0; x<Src.cols; ++x, ++pS,++pB,++pR )
68
+
69
+ {
70
+
71
+ double b = std::max<unsigned char>( 1, *pB ) / 255.0;
72
+
73
+ double g = log(0.5) / log(b);
74
+
75
+ *pR = cvRound( 255.0 * pow(*pS / 255.0, g) );
76
+
77
+ }
78
+
79
+ }
80
+
81
+ return Result;
82
+
83
+ }
84
+
85
+ ```