回答編集履歴

3

修正

2021/10/14 05:48

投稿

fana
fana

スコア11666

test CHANGED
@@ -64,7 +64,7 @@
64
64
 
65
65
  結果画像:上から{入力,Cannyの結果,Sobelから求めた強度に基づくてきとーな明暗描画結果}
66
66
 
67
- ![イメージ説明](c5a3c2e5ad9c593c5e97c43e360ccf43.png)
67
+ ![イメージ説明](033223df8b6a2abd7ea608a88ab7183e.png)
68
68
 
69
69
 
70
70
 
@@ -86,7 +86,7 @@
86
86
 
87
87
  cv::Sobel( Src, SX, CV_16S, 1, 0 );
88
88
 
89
- cv::Sobel( Src, SY, CV_16S, 1, 0 );
89
+ cv::Sobel( Src, SY, CV_16S, 0, 1 );
90
90
 
91
91
  //Canny
92
92
 

2

例を追加

2021/10/14 05:48

投稿

fana
fana

スコア11666

test CHANGED
@@ -51,3 +51,95 @@
51
51
 
52
52
 
53
53
  あとはてきとーにその値の大小に応じた結果画像を描画するだけですね.
54
+
55
+
56
+
57
+ ---
58
+
59
+
60
+
61
+ てきとーな例を追加(コードはC++ですが)
62
+
63
+
64
+
65
+ 結果画像:上から{入力,Cannyの結果,Sobelから求めた強度に基づくてきとーな明暗描画結果}
66
+
67
+ ![イメージ説明](c5a3c2e5ad9c593c5e97c43e360ccf43.png)
68
+
69
+
70
+
71
+ ```C++
72
+
73
+ int main()
74
+
75
+ {
76
+
77
+ cv::Mat Src = cv::imread( "Kuro.png", cv::IMREAD_GRAYSCALE );
78
+
79
+ if( Src.empty() )return 0;
80
+
81
+ //Sobel
82
+
83
+ cv::Mat SX( Src.size(), CV_16S );
84
+
85
+ cv::Mat SY( Src.size(), CV_16S );
86
+
87
+ cv::Sobel( Src, SX, CV_16S, 1, 0 );
88
+
89
+ cv::Sobel( Src, SY, CV_16S, 1, 0 );
90
+
91
+ //Canny
92
+
93
+ cv::Mat Mask;
94
+
95
+ cv::Canny( Src, Mask, 100, 50 );
96
+
97
+ //ShowImgは単なる表示用
98
+
99
+ cv::Mat ShowImg;
100
+
101
+ cv::vconcat( Src, Mask, ShowImg );
102
+
103
+
104
+
105
+ //Maskの内容をSobelの結果を用いて明暗がついた感じに更新
106
+
107
+ for( int y=0; y<Src.rows; ++y )
108
+
109
+ {
110
+
111
+ unsigned char *pMask = Mask.ptr<unsigned char>(y);
112
+
113
+ const short *pSX = SX.ptr<short>(y);
114
+
115
+ const short *pSY = SY.ptr<short>(y);
116
+
117
+ for( int x=0; x<Src.cols; ++x, ++pMask, ++pSX, ++pSY )
118
+
119
+ {
120
+
121
+ if( !*pMask )continue;
122
+
123
+ auto Mag = sqrt( (*pSX * *pSX) + (*pSY * *pSY) );
124
+
125
+ *pMask = (unsigned char)( std::min(Mag, 255.0) );
126
+
127
+ }
128
+
129
+ }
130
+
131
+
132
+
133
+ //結果表示
134
+
135
+ cv::vconcat( ShowImg, Mask, ShowImg );
136
+
137
+ cv::imshow( "Result", ShowImg );
138
+
139
+ if( cv::waitKey() == 's' ){ cv::imwrite( "Result.png", ShowImg ); }
140
+
141
+ return 0;
142
+
143
+ }
144
+
145
+ ```

1

追記

2021/10/14 05:45

投稿

fana
fana

スコア11666

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