質問編集履歴

4

修正

2020/02/19 11:38

投稿

miurakana
miurakana

スコア5

test CHANGED
File without changes
test CHANGED
@@ -218,6 +218,4 @@
218
218
 
219
219
  ### 補足情報(FW/ツールのバージョンなど)
220
220
 
221
- OpenCV 4.1.1
221
+ OpenCV 3.4.0
222
-
223
- Anaconda3

3

修正

2020/02/19 11:38

投稿

miurakana
miurakana

スコア5

test CHANGED
File without changes
test CHANGED
@@ -216,8 +216,6 @@
216
216
 
217
217
  一番面積が大きい輪郭を保存した
218
218
 
219
- ##![イメージ説明](b0b321d232079429c5dd50429a831f78.jpeg)
220
-
221
219
  ### 補足情報(FW/ツールのバージョンなど)
222
220
 
223
221
  OpenCV 4.1.1

2

修正

2020/02/19 10:52

投稿

miurakana
miurakana

スコア5

test CHANGED
File without changes
test CHANGED
@@ -4,220 +4,220 @@
4
4
 
5
5
  一番中心に近い輪郭を切り取るプログラムを作りたいと思っています。
6
6
 
7
+
8
+
9
+ ### 発生している問題・エラーメッセージ
10
+
11
+
12
+
13
+ 特になし
14
+
15
+ ### 該当のソースコード
16
+
17
+
18
+
19
+ ```Python
20
+
21
+ import cv2
22
+
23
+ import os
24
+
25
+ import matplotlib.pyplot as plt
26
+
27
+ from matplotlib.patches import Polygon
28
+
29
+ from matplotlib.patches import Rectangle
30
+
31
+ import numpy as np
32
+
33
+ from PIL import Image
34
+
35
+ from PIL import ImageDraw
36
+
37
+ from PIL import ImageFont
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+ img = cv2.imread("img234.jpg")#images12.jpg")
46
+
47
+
48
+
49
+ # グレースケールに変換する。
50
+
51
+ grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
52
+
53
+
54
+
55
+ """
56
+
57
+ ret, binaryImg = cv2.threshold(grayImg,90,255,cv2.THRESH_BINARY)
58
+
59
+ #print(binaryImg)
60
+
61
+
62
+
63
+ neiborhood8 = np.array([[1, 1, 1],[1, 1, 1],[1, 1, 1]],np.uint8)
64
+
65
+ erodeImg = cv2.erode(binaryImg,neiborhood8,iterations =10)
66
+
67
+ dilateImg = cv2.dilate(erodeImg,neiborhood8,iterations = 10)
68
+
69
+ """
70
+
71
+ #2値化
72
+
73
+ #ret,thresh = cv2.threshold(grayImg,60,255,0)
74
+
75
+
76
+
77
+ #反転
78
+
79
+ #thresh= cv2.bitwise_not(thresh)
80
+
81
+
82
+
83
+ retval, im_bw = cv2.threshold(grayImg, 120, 255, cv2.THRESH_BINARY_INV )#+ cv2.THRESH_OTSU)
84
+
85
+
86
+
87
+ # 輪郭の検出
88
+
89
+ contours, hierarchy = cv2.findContours(im_bw, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
90
+
91
+
92
+
93
+
94
+
95
+ def draw_contours(ax, img, contours):
96
+
97
+ # 抽出した輪郭を描画する。
98
+
99
+ ax.imshow(img, cmap='gray')
100
+
101
+ ax.axis('off')
102
+
103
+ for i, cnt in enumerate(contours):
104
+
105
+ cnt = np.squeeze(cnt, axis=1) # (NumPoints, 1, 2) -> (NumPoints, 2)
106
+
107
+ # 輪郭の点同士を結ぶ線を描画する。
108
+
109
+ ax.add_patch(Polygon(cnt, color='b', fill=None, lw=2))
110
+
111
+ # 輪郭の点を描画する。
112
+
113
+ #ax.plot(cnt[:, 0], cnt[:, 1], 'ro', mew=0, ms=3)
114
+
115
+ # 輪郭の番号を描画する。
116
+
117
+ #ax.text(cnt[0][0], cnt[0][1], i, color='orange', size='20')
118
+
119
+ fig,ax = plt.subplots(figsize=(6, 6))
120
+
121
+ ax.set_title("cv2.RETR_CCOMP")
122
+
123
+ #print(con,tours)
124
+
125
+ #print(cnt)
126
+
127
+ draw_contours(ax, img, contours)
128
+
129
+
130
+
131
+ # 元画像の幅と高さを取得
132
+
133
+ srcHeight, srcWidth, srcColor = img.shape
134
+
135
+ print("width: %d, height: %d" % (srcHeight, srcWidth))
136
+
137
+ # 面積を取得
138
+
139
+ srcArea = srcWidth * srcHeight
140
+
141
+ print("area: %d" % srcArea)
142
+
143
+ # 全面積の0.1倍(10%)以上の輪郭だけ保存する
144
+
145
+ thresholdArea = srcArea * 0.05
146
+
147
+
148
+
149
+ number = 1
150
+
151
+ maxArea = 0
152
+
153
+ maxImage = None
154
+
155
+ for cnt in contours:
156
+
157
+ # 輪郭に外接する長方形を取得する。
158
+
159
+ x, y, width, height = cv2.boundingRect(cnt)
160
+
161
+ # 長方形を描画する。
162
+
163
+ ax.add_patch(
164
+
165
+ Rectangle(xy=(x, y), width=width, height=height, color="g", fill=None, lw=2)
166
+
167
+ )
168
+
169
+ print(" sub-area: %d" % (width * height))
170
+
171
+ if (width * height >= thresholdArea):
172
+
173
+ img0 = img[y:(y+height), x:(x+width)]
174
+
175
+ cv2.imwrite("output_%d.jpg" % number, img0)
176
+
177
+ number += 1
178
+
179
+ if (width * height > maxArea):
180
+
181
+ maxArea = width * height
182
+
183
+ maxImage = img0
184
+
185
+
186
+
187
+ cv2.imwrite("max.jpg", maxImage)
188
+
189
+
190
+
191
+ #size = tuple([img.shape[0], img.shape[1]])
192
+
193
+ #print(size)
194
+
195
+ #img1 = img[y:(y+height), x:(x+width)]
196
+
197
+
198
+
199
+ #cv2.imwrite("out_sample126.jpg", img)
200
+
201
+ #cv2.imshow('thresh', im_bw)
202
+
203
+ #cv2.waitKey(0)
204
+
205
+ #cv2.destroyAllWindows()
206
+
207
+ plt.imshow(img)
208
+
209
+ plt.show()
210
+
211
+ ```
212
+
213
+
214
+
215
+ ### 試したこと
216
+
217
+ 一番面積が大きい輪郭を保存した
218
+
7
219
  ##![イメージ説明](b0b321d232079429c5dd50429a831f78.jpeg)
8
220
 
9
- ### 発生している問題・エラーメッセージ
10
-
11
-
12
-
13
- 特になし
14
-
15
- ### 該当のソースコード
16
-
17
-
18
-
19
- ```Python
20
-
21
- import cv2
22
-
23
- import os
24
-
25
- import matplotlib.pyplot as plt
26
-
27
- from matplotlib.patches import Polygon
28
-
29
- from matplotlib.patches import Rectangle
30
-
31
- import numpy as np
32
-
33
- from PIL import Image
34
-
35
- from PIL import ImageDraw
36
-
37
- from PIL import ImageFont
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
- img = cv2.imread("img234.jpg")#images12.jpg")
46
-
47
-
48
-
49
- # グレースケールに変換する。
50
-
51
- grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
52
-
53
-
54
-
55
- """
56
-
57
- ret, binaryImg = cv2.threshold(grayImg,90,255,cv2.THRESH_BINARY)
58
-
59
- #print(binaryImg)
60
-
61
-
62
-
63
- neiborhood8 = np.array([[1, 1, 1],[1, 1, 1],[1, 1, 1]],np.uint8)
64
-
65
- erodeImg = cv2.erode(binaryImg,neiborhood8,iterations =10)
66
-
67
- dilateImg = cv2.dilate(erodeImg,neiborhood8,iterations = 10)
68
-
69
- """
70
-
71
- #2値化
72
-
73
- #ret,thresh = cv2.threshold(grayImg,60,255,0)
74
-
75
-
76
-
77
- #反転
78
-
79
- #thresh= cv2.bitwise_not(thresh)
80
-
81
-
82
-
83
- retval, im_bw = cv2.threshold(grayImg, 120, 255, cv2.THRESH_BINARY_INV )#+ cv2.THRESH_OTSU)
84
-
85
-
86
-
87
- # 輪郭の検出
88
-
89
- contours, hierarchy = cv2.findContours(im_bw, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
90
-
91
-
92
-
93
-
94
-
95
- def draw_contours(ax, img, contours):
96
-
97
- # 抽出した輪郭を描画する。
98
-
99
- ax.imshow(img, cmap='gray')
100
-
101
- ax.axis('off')
102
-
103
- for i, cnt in enumerate(contours):
104
-
105
- cnt = np.squeeze(cnt, axis=1) # (NumPoints, 1, 2) -> (NumPoints, 2)
106
-
107
- # 輪郭の点同士を結ぶ線を描画する。
108
-
109
- ax.add_patch(Polygon(cnt, color='b', fill=None, lw=2))
110
-
111
- # 輪郭の点を描画する。
112
-
113
- #ax.plot(cnt[:, 0], cnt[:, 1], 'ro', mew=0, ms=3)
114
-
115
- # 輪郭の番号を描画する。
116
-
117
- #ax.text(cnt[0][0], cnt[0][1], i, color='orange', size='20')
118
-
119
- fig,ax = plt.subplots(figsize=(6, 6))
120
-
121
- ax.set_title("cv2.RETR_CCOMP")
122
-
123
- #print(con,tours)
124
-
125
- #print(cnt)
126
-
127
- draw_contours(ax, img, contours)
128
-
129
-
130
-
131
- # 元画像の幅と高さを取得
132
-
133
- srcHeight, srcWidth, srcColor = img.shape
134
-
135
- print("width: %d, height: %d" % (srcHeight, srcWidth))
136
-
137
- # 面積を取得
138
-
139
- srcArea = srcWidth * srcHeight
140
-
141
- print("area: %d" % srcArea)
142
-
143
- # 全面積の0.1倍(10%)以上の輪郭だけ保存する
144
-
145
- thresholdArea = srcArea * 0.05
146
-
147
-
148
-
149
- number = 1
150
-
151
- maxArea = 0
152
-
153
- maxImage = None
154
-
155
- for cnt in contours:
156
-
157
- # 輪郭に外接する長方形を取得する。
158
-
159
- x, y, width, height = cv2.boundingRect(cnt)
160
-
161
- # 長方形を描画する。
162
-
163
- ax.add_patch(
164
-
165
- Rectangle(xy=(x, y), width=width, height=height, color="g", fill=None, lw=2)
166
-
167
- )
168
-
169
- print(" sub-area: %d" % (width * height))
170
-
171
- if (width * height >= thresholdArea):
172
-
173
- img0 = img[y:(y+height), x:(x+width)]
174
-
175
- cv2.imwrite("output_%d.jpg" % number, img0)
176
-
177
- number += 1
178
-
179
- if (width * height > maxArea):
180
-
181
- maxArea = width * height
182
-
183
- maxImage = img0
184
-
185
-
186
-
187
- cv2.imwrite("max.jpg", maxImage)
188
-
189
-
190
-
191
- #size = tuple([img.shape[0], img.shape[1]])
192
-
193
- #print(size)
194
-
195
- #img1 = img[y:(y+height), x:(x+width)]
196
-
197
-
198
-
199
- #cv2.imwrite("out_sample126.jpg", img)
200
-
201
- #cv2.imshow('thresh', im_bw)
202
-
203
- #cv2.waitKey(0)
204
-
205
- #cv2.destroyAllWindows()
206
-
207
- plt.imshow(img)
208
-
209
- plt.show()
210
-
211
- ```
212
-
213
-
214
-
215
- ### 試したこと
216
-
217
- 一番面積が大きい輪郭を保存した
218
-
219
-
220
-
221
221
  ### 補足情報(FW/ツールのバージョンなど)
222
222
 
223
223
  OpenCV 4.1.1

1

修正

2020/02/19 09:46

投稿

miurakana
miurakana

スコア5

test CHANGED
File without changes
test CHANGED
@@ -1,12 +1,10 @@
1
- ### 前提・実現したいこと
1
+ 実現したいこと
2
-
3
-
4
2
 
5
3
  困っています
6
4
 
7
5
  一番中心に近い輪郭を切り取るプログラムを作りたいと思っています。
8
6
 
9
-
7
+ ##![イメージ説明](b0b321d232079429c5dd50429a831f78.jpeg)
10
8
 
11
9
  ### 発生している問題・エラーメッセージ
12
10