回答編集履歴

2

ついでに

2018/11/10 17:16

投稿

can110
can110

スコア38262

test CHANGED
@@ -22,6 +22,16 @@
22
22
 
23
23
 
24
24
 
25
+ #### ついでに
26
+
27
+ forループからnumpyで一括操作する手法に修正してみました。
28
+
29
+ ディープコピーなどを心配せずにかつ高速で処理できます。
30
+
31
+ 参考:[python,OpenCV,numpyによる色抽出・変換](https://teratail.com/questions/100301)
32
+
33
+
34
+
25
35
  > また、クリックした地点から数ピクセル離れたところの色情報が取得される。
26
36
 
27
37
 
@@ -35,6 +45,8 @@
35
45
 
36
46
 
37
47
  ```Python
48
+
49
+
38
50
 
39
51
  from PIL import Image
40
52
 
@@ -60,7 +72,9 @@
60
72
 
61
73
  def onclick(self,event):
62
74
 
75
+
76
+
63
- #plist = self.image[int(event.ydata)][int(event.xdata)]
77
+ """ forループする手法
64
78
 
65
79
  plist = np.copy(self.image[int(event.ydata)][int(event.xdata)]) # 自身のピクセル値がかわらないようにディープコピーする!
66
80
 
@@ -75,6 +89,20 @@
75
89
  if (self.image[i][j] == plist).all():
76
90
 
77
91
  self.image[i][j] = [255, 255, 255]
92
+
93
+ """
94
+
95
+
96
+
97
+ # numpy一括操作する手法
98
+
99
+ # python,OpenCV,numpyによる色抽出・変換
100
+
101
+ # https://teratail.com/questions/100301
102
+
103
+ plist = self.image[int(event.ydata)][int(event.xdata)]
104
+
105
+ self.image[np.logical_and.reduce(self.image == plist, axis=2)] = [255,255,255]
78
106
 
79
107
 
80
108
 

1

原因を追記

2018/11/10 17:16

投稿

can110
can110

スコア38262

test CHANGED
@@ -9,6 +9,16 @@
9
9
  中途半端というのがよく分からないのですが、クリックのたびに新しいウインドウが表示されました。
10
10
 
11
11
  これは意図した動作ではないと思われるので、最後に示すように、ウインドウ内の画像更新するようにコード修正しました。
12
+
13
+
14
+
15
+ #### 原因を追記
16
+
17
+ 現象再現できました。`plist`は実際には画像のクリックされたセル値を**指している**だけです。
18
+
19
+ よってforループ中にクリックされたピクセル値の値を更新すると**plist**の値も更新され、それ以降の判定がおかしくなってしまっています。
20
+
21
+ 回避するには**plist**に対して実値を(深い)コピー代入する必要があります。
12
22
 
13
23
 
14
24
 
@@ -50,7 +60,9 @@
50
60
 
51
61
  def onclick(self,event):
52
62
 
53
- plist=self.image[int(event.ydata)][int(event.xdata)]
63
+ #plist = self.image[int(event.ydata)][int(event.xdata)]
64
+
65
+ plist = np.copy(self.image[int(event.ydata)][int(event.xdata)]) # 自身のピクセル値がかわらないようにディープコピーする!
54
66
 
55
67
  print(plist)
56
68
 
@@ -84,9 +96,19 @@
84
96
 
85
97
  # 画像を読み込む
86
98
 
87
- img = Image.open( "./lena.png") # レナ姐さん
99
+ img = Image.open( "./test.png") #
88
100
 
89
101
  img=np.array(img)
102
+
103
+
104
+
105
+ # pngのアルファチャンネルを除去する
106
+
107
+ if img.shape[2] == 4:
108
+
109
+ img = img[:,:,0:3]
110
+
111
+
90
112
 
91
113
  fig=plt.figure()
92
114
 
@@ -104,4 +126,4 @@
104
126
 
105
127
  ```
106
128
 
107
- ![イメージ説明](cc8be5b8f3ab40353f56187d0d709efa.png)
129
+ ![イメージ説明](842858f76ff96275ef758f8af63475e4.png)