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

回答編集履歴

3

修正

2021/10/14 05:48

投稿

fana
fana

スコア12229

answer CHANGED
@@ -31,7 +31,7 @@
31
31
  てきとーな例を追加(コードはC++ですが)
32
32
 
33
33
  結果画像:上から{入力,Cannyの結果,Sobelから求めた強度に基づくてきとーな明暗描画結果}
34
- ![イメージ説明](c5a3c2e5ad9c593c5e97c43e360ccf43.png)
34
+ ![イメージ説明](033223df8b6a2abd7ea608a88ab7183e.png)
35
35
 
36
36
  ```C++
37
37
  int main()
@@ -42,7 +42,7 @@
42
42
  cv::Mat SX( Src.size(), CV_16S );
43
43
  cv::Mat SY( Src.size(), CV_16S );
44
44
  cv::Sobel( Src, SX, CV_16S, 1, 0 );
45
- cv::Sobel( Src, SY, CV_16S, 1, 0 );
45
+ cv::Sobel( Src, SY, CV_16S, 0, 1 );
46
46
  //Canny
47
47
  cv::Mat Mask;
48
48
  cv::Canny( Src, Mask, 100, 50 );

2

例を追加

2021/10/14 05:48

投稿

fana
fana

スコア12229

answer CHANGED
@@ -24,4 +24,50 @@
24
24
  `輝度勾配の強度 = sqrt( SX*SX + SY*SY )`
25
25
  とか何とかして見積ればよいでしょう.
26
26
 
27
- あとはてきとーにその値の大小に応じた結果画像を描画するだけですね.
27
+ あとはてきとーにその値の大小に応じた結果画像を描画するだけですね.
28
+
29
+ ---
30
+
31
+ てきとーな例を追加(コードはC++ですが)
32
+
33
+ 結果画像:上から{入力,Cannyの結果,Sobelから求めた強度に基づくてきとーな明暗描画結果}
34
+ ![イメージ説明](c5a3c2e5ad9c593c5e97c43e360ccf43.png)
35
+
36
+ ```C++
37
+ int main()
38
+ {
39
+ cv::Mat Src = cv::imread( "Kuro.png", cv::IMREAD_GRAYSCALE );
40
+ if( Src.empty() )return 0;
41
+ //Sobel
42
+ cv::Mat SX( Src.size(), CV_16S );
43
+ cv::Mat SY( Src.size(), CV_16S );
44
+ cv::Sobel( Src, SX, CV_16S, 1, 0 );
45
+ cv::Sobel( Src, SY, CV_16S, 1, 0 );
46
+ //Canny
47
+ cv::Mat Mask;
48
+ cv::Canny( Src, Mask, 100, 50 );
49
+ //ShowImgは単なる表示用
50
+ cv::Mat ShowImg;
51
+ cv::vconcat( Src, Mask, ShowImg );
52
+
53
+ //Maskの内容をSobelの結果を用いて明暗がついた感じに更新
54
+ for( int y=0; y<Src.rows; ++y )
55
+ {
56
+ unsigned char *pMask = Mask.ptr<unsigned char>(y);
57
+ const short *pSX = SX.ptr<short>(y);
58
+ const short *pSY = SY.ptr<short>(y);
59
+ for( int x=0; x<Src.cols; ++x, ++pMask, ++pSX, ++pSY )
60
+ {
61
+ if( !*pMask )continue;
62
+ auto Mag = sqrt( (*pSX * *pSX) + (*pSY * *pSY) );
63
+ *pMask = (unsigned char)( std::min(Mag, 255.0) );
64
+ }
65
+ }
66
+
67
+ //結果表示
68
+ cv::vconcat( ShowImg, Mask, ShowImg );
69
+ cv::imshow( "Result", ShowImg );
70
+ if( cv::waitKey() == 's' ){ cv::imwrite( "Result.png", ShowImg ); }
71
+ return 0;
72
+ }
73
+ ```

1

追記

2021/10/14 05:45

投稿

fana
fana

スコア12229

answer CHANGED
@@ -1,1 +1,27 @@
1
- 元の画像の輝度勾配に応じて,適当に結果画像の輝度を決定すればよいのではないでしょうか.
1
+ 元の画像の輝度勾配に応じて,適当に結果画像の輝度を決定すればよいのではないでしょうか.
2
+
3
+ ---
4
+
5
+ Sobelフィルタのようなエッジ検出フィルタの結果値から,輝度勾配の強度を見積もることができるでしょう.
6
+
7
+ 例えば,良く見る 3x3 の Sobelフィルタ:
8
+
9
+ ```
10
+ -1 0 1
11
+ -2 0 2
12
+ -1 0 1
13
+ ```
14
+
15
+
16
+
17
+ ```
18
+ -1 -2 -1
19
+ 0 0 0
20
+ 1 2 1
21
+ ```
22
+
23
+ から求まる2つの結果値{SX,SY}から,
24
+ `輝度勾配の強度 = sqrt( SX*SX + SY*SY )`
25
+ とか何とかして見積ればよいでしょう.
26
+
27
+ あとはてきとーにその値の大小に応じた結果画像を描画するだけですね.