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

質問編集履歴

1

直接に閾値を代入すると

2016/06/03 08:44

投稿

jiaxiaoyue
jiaxiaoyue

スコア12

title CHANGED
File without changes
body CHANGED
@@ -106,4 +106,108 @@
106
106
 
107
107
  ###補足情報(言語/FW/ツール等のバージョンなど)
108
108
  より詳細な情報
109
- ![![イメージ説明](3081a689bc3621412fd373ff96555004.png)](11356c7de1bedb37efd5440c264c081d.png)
109
+ ![![イメージ説明](3081a689bc3621412fd373ff96555004.png)](11356c7de1bedb37efd5440c264c081d.png)
110
+
111
+
112
+ /*---------------------------------------------------------------------------------------*/
113
+
114
+
115
+
116
+ // kadai6-2.2.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
117
+ //
118
+
119
+ #include "stdafx.h"
120
+ #ifdef _DEBUG
121
+ #define new DEBUG_NEW
122
+ #endif
123
+
124
+ IplImage *img;//, *img_out;,img
125
+ int width,height;
126
+ //int edge_thresh_sobel = 0; // 閾値の初期値
127
+
128
+ IplImage *gray_sobel, *edge_sobel, *edgeX, *edgeY;
129
+
130
+
131
+ int sobel(int t) {
132
+ int i, j, dx, dy, W, H;
133
+ double mag;
134
+ //t=edge_thresh_sobel;
135
+ W = img->width; H = img->height;
136
+ for(i=0;i<(W*H);i++) {
137
+ j = i * 2;
138
+ dx = (int)edgeX->imageData[j];
139
+ dy = (int)edgeY->imageData[j];
140
+ mag = (double)(dx*dx + dy*dy);
141
+ mag = sqrt(mag);
142
+
143
+ if(mag >= (double)t) edge_sobel->imageData[i] = (unsigned char)255;
144
+ else edge_sobel->imageData[i] = 0;
145
+ return t;
146
+
147
+ }
148
+
149
+ }
150
+
151
+ int _tmain(int argc, _TCHAR* argv[])
152
+ {
153
+ img = 0; // 画像ファイル読み込み
154
+ img = cvLoadImage( "airplane-gray.bmp");
155
+
156
+ // 画像表示窓の準備
157
+ cvNamedWindow("入力画像", 1);
158
+
159
+ // 画像表示
160
+ cvShowImage("入力画像", img);
161
+ printf("1");
162
+
163
+ //平滑化処理
164
+ cvSmooth(img,img,CV_GAUSSIAN,3);
165
+ // 画像表示窓の準備
166
+ cvNamedWindow("平滑化", 1);
167
+
168
+ // 画像表示
169
+ cvShowImage("平滑化", img);
170
+ printf("2");
171
+
172
+ // エッジ点画像用データを作成
173
+ edge_sobel = cvCreateImage( cvSize(img->width,img->height), IPL_DEPTH_8U, 1 );
174
+ // X方向,Y方向のエッジ強度を保存するバッファを確保する.
175
+ // バッファのDEPTHはsigned short(IPL_DEPTH_16S)を指定する.
176
+ // (画素値が[0,255]の濃淡画像から3x3のマスクでエッジを検出すると
177
+ // エッジ強度は[-4*255,4*255]の値をとるため)
178
+ printf("3");
179
+ edgeX = cvCreateImage( cvSize(img->width,img->height), IPL_DEPTH_16S, 1 );
180
+ edgeY = cvCreateImage( cvSize(img->width,img->height), IPL_DEPTH_16S, 1 );
181
+
182
+ printf("4");
183
+
184
+ sobel(200); //呼び出し
185
+ //画像表示窓の準備
186
+ cvNamedWindow("sobel", 1);
187
+ printf("7");
188
+ // 結果を表示
189
+ cvShowImage("sobel",edge_sobel);
190
+
191
+ printf("8");
192
+
193
+
194
+ // 終了処理
195
+ cvWaitKey(0);
196
+ cvReleaseImage(&gray_sobel);
197
+ cvReleaseImage(&edgeX);
198
+ cvReleaseImage(&edgeY);
199
+ cvReleaseImage(&edge_sobel);
200
+
201
+
202
+ cvDestroyWindow("入力画像");
203
+ cvDestroyWindow("平滑化");
204
+ cvDestroyWindow("sobel");
205
+
206
+ printf("9");
207
+ return 0;
208
+ }
209
+
210
+
211
+ /*-----------------------------------------------------------------------------------*/
212
+ またこういうように単純に閾値を代入すると、ソーベルオペレータが使えない。。。
213
+ ![イメージ説明](a8d7bf65748a1670c3d0b6220b2dd5db.png)