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

回答編集履歴

3

補足を記述

2020/12/11 01:58

投稿

fana
fana

スコア12203

answer CHANGED
@@ -40,4 +40,26 @@
40
40
  }
41
41
  return Result;
42
42
  }
43
+ ```
44
+
45
+ ---
46
+
47
+ [補足]
48
+ [この処理のPython化の話をしている質問](https://teratail.com/questions/309376)にて,上記テストコードの処理内容に関する指摘があったのでその点を補足しておく.
49
+
50
+ **問題点**:
51
+ `double b = std::max<unsigned char>( 1, *pB ) / 255.0;`
52
+ の行が,*pBが0の場合についてはガードを入れているが,255の場合へのガードが抜けている.
53
+ そのため,*pBが255であるとき,`double g = log(0.5) / log(b);` の分母が0になってしまう.
54
+
55
+ **対策について**:
56
+ 0側と同様に,255側へのガードも入れれば良いであろうと思う.
57
+ すなわち,*pB の値を適当な有効範囲内に抑え込んでやればよかろう.
58
+
59
+ ```
60
+ //2つの閾値 T_min, T_max の値はてきとーに決めるとして.
61
+ const unsigned char T_min = 1; //1以上の値
62
+ const unsigned char T_max = 250; //254以下の値
63
+ ...
64
+ double b = std::max( T_min, std::min(T_max,*pB) ) / 255.0;
43
65
  ```

2

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

2020/12/11 01:58

投稿

fana
fana

スコア12203

answer CHANGED
@@ -17,7 +17,7 @@
17
17
 
18
18
  テストに用いた明るさ補正コードです.(C++ですが)
19
19
  ```C++
20
- v::Mat Correction( const cv::Mat &Src, int KernelSizeFactor=6 )
20
+ cv::Mat Correction( const cv::Mat &Src, int KernelSizeFactor=6 )
21
21
  {
22
22
  cv::Mat Blurred;
23
23
  {

1

コード追記

2020/12/04 09:25

投稿

fana
fana

スコア12203

answer CHANGED
@@ -13,4 +13,31 @@
13
13
  です.
14
14
  この程度の急峻でない明暗変化具合であれば,まぁ,てきとーに前処理で明るさを補正してやる方向でも良いのではないか?と思います.
15
15
 
16
- ![テスト処理結果](c2a5ad18fecc2ce89b5d6ad750f5e9cb.png)
16
+ ![テスト処理結果](c2a5ad18fecc2ce89b5d6ad750f5e9cb.png)
17
+
18
+ テストに用いた明るさ補正コードです.(C++ですが)
19
+ ```C++
20
+ v::Mat Correction( const cv::Mat &Src, int KernelSizeFactor=6 )
21
+ {
22
+ cv::Mat Blurred;
23
+ {
24
+ int s = ( std::min( Src.rows, Src.cols ) / KernelSizeFactor ) | 0x01;
25
+ cv::GaussianBlur( Src, Blurred, cv::Size(s,s), 0 );
26
+ }
27
+
28
+ cv::Mat Result = cv::Mat( Src.rows, Src.cols, CV_8UC1 );
29
+ for( int y=0; y<Src.rows; ++y )
30
+ {
31
+ const unsigned char *pS = Src.ptr<unsigned char>(y);
32
+ const unsigned char *pB = Blurred.ptr<unsigned char>(y);
33
+ unsigned char *pR = Result.ptr<unsigned char>(y);
34
+ for( int x=0; x<Src.cols; ++x, ++pS,++pB,++pR )
35
+ {
36
+ double b = std::max<unsigned char>( 1, *pB ) / 255.0;
37
+ double g = log(0.5) / log(b);
38
+ *pR = cvRound( 255.0 * pow(*pS / 255.0, g) );
39
+ }
40
+ }
41
+ return Result;
42
+ }
43
+ ```