質問編集履歴

1

画像が表示されていなかったので表示されるように編集しました

2017/12/14 03:24

投稿

fu-semo
fu-semo

スコア7

test CHANGED
File without changes
test CHANGED
@@ -12,216 +12,218 @@
12
12
 
13
13
 
14
14
 
15
+
16
+
17
+ 原画像
18
+
19
+ ![イメージ説明](51069e38e1b5f5b2178b17b9d46c2282.png)
20
+
21
+
22
+
23
+ 出力画像
24
+
25
+ ![イメージ説明](31c43f21fe0add252fdc8401ca1460ed.png)
26
+
27
+
28
+
29
+
30
+
31
+ ###該当のソースコード
32
+
33
+ ```C++
34
+
35
+ void convolution(Mat& src, Mat& mask){
36
+
37
+ // src:原画像 mask:畳み込むフィルター
38
+
39
+ int srcW = src.rows;
40
+
41
+ int srcH = src.cols;
42
+
43
+ int maskW = mask.rows;
44
+
45
+ int maskH = mask.cols;
46
+
47
+
48
+
49
+ // フィルターの半径
50
+
51
+ int rx=(maskW-1)/2;
52
+
53
+ int ry=(maskH-1)/2;
54
+
55
+
56
+
57
+ // 出力画像を初期化
58
+
59
+ dst=Mat::zeros(srcW, srcH, CV_8U);
60
+
61
+
62
+
63
+ for(int x=0; x<srcW; x++){
64
+
65
+ for(int y=0; y<srcH; y++){
66
+
67
+ double sum=0;
68
+
69
+
70
+
71
+ for(int i=0; i<maskW; i++){
72
+
73
+ int pointx = x-rx+i;
74
+
75
+ for(int j=0; j<maskH; j++){
76
+
77
+ int pointy = y-ry+j;
78
+
79
+ // pointが原画像の中である(原画像の外を参照する場合は何もしない)
80
+
81
+ if((pointx>=0 && pointx<srcW) && (pointy>=0 && pointy<srcH)){
82
+
83
+ // フィルターと原画像の積を総和する
84
+
85
+ sum+=kernel.at<unsigned char>(i,j)*src.at<unsigned char>(pointx,pointy);
86
+
87
+ }
88
+
89
+ }
90
+
91
+ }
92
+
93
+ // 結果を出力画像に入れる
94
+
95
+ dst.at<unsigned char>(x,y)=sum;
96
+
97
+ }
98
+
99
+ }
100
+
101
+ /* 画素値を0−255にスケーリングする事を試みましたが、結果が変わりませんでした
102
+
103
+ float fmin=FLT_MAX;
104
+
105
+ float fmax=-(FLT_MAX);
106
+
107
+ for(int k=0; k<dst.rows; k++){
108
+
109
+ for(int l=0; l<dst.cols; l++){
110
+
111
+ float pixel=dst.at<unsigned char>(k,l);
112
+
113
+ if (pixel > fmax)
114
+
115
+ fmax=pixel;
116
+
117
+ if (pixel < fmin)
118
+
119
+ fmin=pixel;
120
+
121
+ }
122
+
123
+ }
124
+
125
+
126
+
127
+ for(int m=0; m<dst.rows; m++){
128
+
129
+ for(int n=0; n<dst.cols; n++){
130
+
131
+ dst.at<unsigned char>(m,n)=(dst.at<unsigned char>(m,n)-fmin)*255.0/(fmax-fmin);
132
+
133
+ }
134
+
135
+ }
136
+
137
+ */
138
+
139
+ }
140
+
15
141
  ```
16
142
 
143
+
144
+
17
- 原画像
145
+ ###試したこと
18
-
146
+
19
- ![イメジ説明](51069e38e1b5f5b2178b17b9d46c2282.png)
147
+ 原画像の外のピクセルを参照していることへの対処やスケリングなどを加えてみましたが、出力画像はめちゃくちゃのままでした
20
-
21
- 出力画像
148
+
22
-
149
+
150
+
23
- ![イメージ説明](31c43f21fe0add252fdc8401ca1460ed.png)
151
+ ###補足情報(言語/FW/ツル等のバーョンなど)
152
+
153
+ コンパイルにはMakefileを使用しています
154
+
155
+ ソースコードはこちら(問題のファイル名はkadaiC.cpp)
24
156
 
25
157
  ```
26
158
 
27
-
28
-
29
- ###該当のソースコード
30
-
31
- ```C++
32
-
33
- void convolution(Mat& src, Mat& mask){
34
-
35
- // src:原画像 mask:畳み込むフィルター
36
-
37
- int srcW = src.rows;
38
-
39
- int srcH = src.cols;
40
-
41
- int maskW = mask.rows;
42
-
43
- int maskH = mask.cols;
44
-
45
-
46
-
47
- // フィルターの半径
48
-
49
- int rx=(maskW-1)/2;
50
-
51
- int ry=(maskH-1)/2;
52
-
53
-
54
-
55
- // 出力画像を初期化
56
-
57
- dst=Mat::zeros(srcW, srcH, CV_8U);
58
-
59
-
60
-
61
- for(int x=0; x<srcW; x++){
62
-
63
- for(int y=0; y<srcH; y++){
64
-
65
- double sum=0;
66
-
67
-
68
-
69
- for(int i=0; i<maskW; i++){
70
-
71
- int pointx = x-rx+i;
72
-
73
- for(int j=0; j<maskH; j++){
74
-
75
- int pointy = y-ry+j;
76
-
77
- // pointが原画像の中である(原画像の外を参照する場合は何もしない)
78
-
79
- if((pointx>=0 && pointx<srcW) && (pointy>=0 && pointy<srcH)){
80
-
81
- // フィルターと原画像の積を総和する
82
-
83
- sum+=kernel.at<unsigned char>(i,j)*src.at<unsigned char>(pointx,pointy);
84
-
85
- }
86
-
87
- }
88
-
89
- }
90
-
91
- // 結果を出力画像に入れる
92
-
93
- dst.at<unsigned char>(x,y)=sum;
94
-
95
- }
96
-
97
- }
98
-
99
- /* 画素値を0−255にスケーリングする事を試みましたが、結果が変わりませんでした
100
-
101
- float fmin=FLT_MAX;
102
-
103
- float fmax=-(FLT_MAX);
104
-
105
- for(int k=0; k<dst.rows; k++){
106
-
107
- for(int l=0; l<dst.cols; l++){
108
-
109
- float pixel=dst.at<unsigned char>(k,l);
110
-
111
- if (pixel > fmax)
112
-
113
- fmax=pixel;
114
-
115
- if (pixel < fmin)
116
-
117
- fmin=pixel;
118
-
119
- }
120
-
121
- }
122
-
123
-
124
-
125
- for(int m=0; m<dst.rows; m++){
126
-
127
- for(int n=0; n<dst.cols; n++){
128
-
129
- dst.at<unsigned char>(m,n)=(dst.at<unsigned char>(m,n)-fmin)*255.0/(fmax-fmin);
130
-
131
- }
132
-
133
- }
134
-
135
- */
136
-
137
- }
159
+ # Makefile template for building OpenCV programs in C
160
+
161
+ # Usage: Change the TARGET to foo when compiling foo.c or foo.cpp
162
+
163
+
164
+
165
+ # Target program
166
+
167
+ TARGET=kadaiC
168
+
169
+
170
+
171
+ # Compiler
172
+
173
+ #CC=gcc
174
+
175
+ CC=g++
176
+
177
+
178
+
179
+ # Compiler options
180
+
181
+ CFLAGS=`pkg-config --cflags opencv` -O3
182
+
183
+ LDFLAGS=`pkg-config --libs opencv`
184
+
185
+
186
+
187
+ OBJS= $(TARGET).o
188
+
189
+ #OBJS= $(TARGET).o src1.o src2.o
190
+
191
+
192
+
193
+ # Default target
194
+
195
+ all: $(TARGET)
196
+
197
+
198
+
199
+ # Linking objects
200
+
201
+ $(TARGET): $(OBJS)
202
+
203
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $(TARGET) $(OBJS)
204
+
205
+
206
+
207
+ # Compile C source to objects
208
+
209
+ .c.o:
210
+
211
+ $(CC) $(CFLAGS) -c $<
212
+
213
+
214
+
215
+ # Compile C++ source to objects
216
+
217
+ .cpp.o:
218
+
219
+ $(CC) $(CFLAGS) -c $<
220
+
221
+
222
+
223
+ # Clean up for re-building
224
+
225
+ clean:
226
+
227
+ rm *.o
138
228
 
139
229
  ```
140
-
141
-
142
-
143
- ###試したこと
144
-
145
- 原画像の外のピクセルを参照していることへの対処やスケーリングなどを加えてみましたが、出力画像はめちゃくちゃのままでした
146
-
147
-
148
-
149
- ###補足情報(言語/FW/ツール等のバージョンなど)
150
-
151
- コンパイルにはMakefileを使用しています
152
-
153
- ソースコードはこちら(問題のファイル名はkadaiC.cpp)
154
-
155
- ```
156
-
157
- # Makefile template for building OpenCV programs in C
158
-
159
- # Usage: Change the TARGET to foo when compiling foo.c or foo.cpp
160
-
161
-
162
-
163
- # Target program
164
-
165
- TARGET=kadaiC
166
-
167
-
168
-
169
- # Compiler
170
-
171
- #CC=gcc
172
-
173
- CC=g++
174
-
175
-
176
-
177
- # Compiler options
178
-
179
- CFLAGS=`pkg-config --cflags opencv` -O3
180
-
181
- LDFLAGS=`pkg-config --libs opencv`
182
-
183
-
184
-
185
- OBJS= $(TARGET).o
186
-
187
- #OBJS= $(TARGET).o src1.o src2.o
188
-
189
-
190
-
191
- # Default target
192
-
193
- all: $(TARGET)
194
-
195
-
196
-
197
- # Linking objects
198
-
199
- $(TARGET): $(OBJS)
200
-
201
- $(CC) $(CFLAGS) $(LDFLAGS) -o $(TARGET) $(OBJS)
202
-
203
-
204
-
205
- # Compile C source to objects
206
-
207
- .c.o:
208
-
209
- $(CC) $(CFLAGS) -c $<
210
-
211
-
212
-
213
- # Compile C++ source to objects
214
-
215
- .cpp.o:
216
-
217
- $(CC) $(CFLAGS) -c $<
218
-
219
-
220
-
221
- # Clean up for re-building
222
-
223
- clean:
224
-
225
- rm *.o
226
-
227
- ```