質問編集履歴
1
直接に閾値を代入すると
title
CHANGED
File without changes
|
body
CHANGED
@@ -106,4 +106,108 @@
|
|
106
106
|
|
107
107
|
###補足情報(言語/FW/ツール等のバージョンなど)
|
108
108
|
より詳細な情報
|
109
|
-
](11356c7de1bedb37efd5440c264c081d.png)
|
109
|
+
](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
|
+

|