-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgraphiceditor.py
More file actions
339 lines (301 loc) · 10.9 KB
/
Copy pathgraphiceditor.py
File metadata and controls
339 lines (301 loc) · 10.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
import numpy as np
import sys
from PIL import Image
def is_number(s):
"""
Kontroluje jestli je string číslo
:param s:
:return:
"""
try:
float(s)
return True
except ValueError:
return False
def inverze(img):
"""Tato funkce vytvoří inverzi obrazu. Vstup je pouze cesta k obrazu
:param img:
:return:
"""
# práce s obrázky inverzní obraz
imgarr = np.asarray(img)
imgarr = 255 - imgarr
imgarr = Image.fromarray(imgarr)
return imgarr
def levels(img_arr):
"""
SLouží ke zesvětlení/ztmavení obrázku. Vstup je image a poté se do proměnné level načte ze vstupu číslo, pokud je toto číslo menší jak 1 obrázek se ztmaví např. 0.5, případně 1.5 to zase obrázek zesvětlí.
:param img_arr:
:return:
"""
bez = 1
while bez:
level = input("Pro ztmavení zadejte desetinné číslo od 0-1.0 pro zesvětlení číslo >1.0\n")
if is_number(level):
if float(level) >= 0:
bez = 0
else:
print('\033[41m' + "Číslo nesmí být záporné!" + '\033[0m')
else:
print('\033[41m' + "Nezadali jste číslo" + '\033[0m')
imgarr = np.asarray(img_arr)
img2=np.copy(imgarr)
imgarr.setflags(write = 1) #nutno aby se dalo přepisovat hodnotu v poli, pole je jinak read only
for i in range(3):
#forcyklus přes jednotlivé barvy
if float(level) > 1:
for j in range(0, imgarr[:, :, i].shape[0] - 1):
for k in range(0, imgarr[:, :, i].shape[1] - 1):
subpixel=imgarr[:, :, i][j][k] * float(level)
if subpixel >= 255:
imgarr[:, :, i][j][k] = 255
else:
imgarr[:, :, i][j][k] = subpixel
# img2 = img_arr.point(lambda p: p * 1.9) rychlejší zesvětlení pomocí knihovny pillow
else:
imgarr[:, :, i]= imgarr[:, :, i] * float(level)
fin_img = Image.fromarray(imgarr)
return fin_img
def seda(img):
"""
Vstup je obrázek, funkce převede obrázek do odstínů šedi. Uživatel zadává jen cestu k obrázku
:param img:
:return:
"""
imgarr = np.asarray(img)
imgarr.setflags(write=1)
imgarr2= np.copy(imgarr)
for i in range(0, imgarr.shape[0] - 1):
for j in range(0, imgarr.shape[1] - 1):
imgarr2[i][j][0] = imgarr[i][j][0] * 0.299 + imgarr[i][j][2] * 0.114 + imgarr[i][j][1] * 0.587
imgarr2[i][j][1] = imgarr[i][j][0] * 0.299 + imgarr[i][j][2] * 0.114 + imgarr[i][j][1] * 0.587
imgarr2[i][j][2] = imgarr[i][j][0] * 0.299 + imgarr[i][j][2] * 0.114 + imgarr[i][j][1] * 0.587
fin_img = Image.fromarray(imgarr2)
return fin_img
def hrany_filter(data):
"""
Vektorizovaný filter pro vyhledání hran. Vstupem je část obrázku.
:param data:
:return:
"""
output = np.zeros(data.shape[:2])
output = (
-data[0:-2, 0:-2] - data[0:-2, 1:-1] - data[0:-2, 2:] -
data[1:-1, 0:-2] + 9 * data[1:-1, 1:-1] - data[1:-1, 2:] -
data[2:, 0:-2] - data[2:, 1:-1] - data[2:, 2:]
)
return output
def hrany(img):
"""
Vstupem je obrázek (cesta).
:param img:
:return:
"""
imgarr = np.asarray(img, dtype=np.float)
X, Y, Z = imgarr.shape
fin = np.zeros([X - 2, Y - 2, Z])
# aplikace filtru
for i in range(3):
fin[:, :, i] = hrany_filter(imgarr[:, :, i])
fin_img = np.clip(fin, 0, 255)
fin_img = np.asarray(fin_img, dtype=np.uint8)
img_out = Image.fromarray(fin_img)
return img_out
def rotate_coords(x, y, theta, ox, oy):
"""
Otočí pole x a y podle úhlu theta okolo bodu ox, oy(nastaveno na střed obrázku)
:param x:
:param y:
:param theta: úhel otočení
:param ox: souřadnice x středu (bodu otočení)
:param oy: souřadnice y středu (bodu otočení)
:return:
"""
s, c = np.sin(theta), np.cos(theta)
x, y = np.asarray(x) - ox, np.asarray(y) - oy
return x * c - y * s + ox, x * s + y * c + oy
def rotate_image(src, theta, ox, oy, fill=255):
"""
Otočí obrázek podle úhlu theta a podle souřadni ox, oy - v tomto případě střed obrázku
:param src: zdrojový obrázek
:param theta: úhel otočení
:param ox: střed obrázku
:param oy: střed obrázku
:param fill:
:return:
"""
#musím otočit úhel aby se rotovalo správně
theta = -theta
sh, sw = src.shape
cx, cy = rotate_coords([0, sw, sw, 0], [0, 0, sh, sh], theta, ox, oy)
dw, dh = (int(np.ceil(c.max() - c.min())) for c in (cx, cy))
dx, dy = np.meshgrid(np.arange(dw), np.arange(dh))
sx, sy = rotate_coords(dx + cx.min(), dy + cy.min(), -theta, ox, oy)
sx, sy = sx.round().astype(int), sy.round().astype(int)
mask = (0 <= sx) & (sx < sw) & (0 <= sy) & (sy < sh)
dest = np.empty(shape=(dh, dw), dtype=src.dtype)
dest[dy[mask], dx[mask]] = src[sy[mask], sx[mask]]
dest[dy[~mask], dx[~mask]] = fill
return dest
def rotate(img):
"""
Přijme obrázek, načte úhel(angle) a obrázek otočí podle zadaného úhlu.
:param img:
:return:
"""
imgarr = np.asarray(img)
r, g, b = np.rollaxis(imgarr, axis=-1)
bez=1
while bez:
angle = input("Zadejte úhel, o který chcete obrázek otočit: \n")
if is_number(angle):
bez=0
else:
print('\033[41m'+"Nezadali jste číslo"+ '\033[0m')
r2 = rotate_image(r, int(angle) * np.pi / 180, int(imgarr.shape[0] // 2), int(imgarr.shape[1] // 2))
g2 = rotate_image(g, int(angle) * np.pi / 180, int(imgarr.shape[0] // 2), int(imgarr.shape[1] // 2))
b2 = rotate_image(b, int(angle) * np.pi / 180, int(imgarr.shape[0] // 2), int(imgarr.shape[1] // 2))
img2 = np.dstack((r2, g2, b2))
fin_img = Image.fromarray(img2)
return fin_img
def zrcadleni(img):
"""
Převrátí obrázek zrcadlově, buďto vertikální po zadání 0, nebo horizontálně po zadání 1.
:param img: vstupní obrázek
:return:
"""
imgarr = np.asarray(img)
bez =1
while bez:
volba = input("Pro horizontální převrácení zadejte 1, pro vertikální 0: \n")
if is_number(volba):
if int(volba) == 1 or int(volba) == 0:
bez = 0
else:
print('\033[41m' + "Zadejte prosím 0 nebo 1." + '\033[0m')
else:
print('\033[41m' + "Nezadali jste číslo" + '\033[0m')
img2 = np.flip(imgarr,int(volba))
fin_img = Image.fromarray(img2)
return fin_img
def levels_color(img_arr):
"""
SLouží ke zesílení/zeslabení určitého rgb obrázku. Vstup je cesta k obrázku image a poté se do proměnné level načte ze vstupu číslo, pokud je toto číslo menší jak 1 obrázek se ztmaví např. 0.5, případně 1.5 to zase obrázek zesvětlí.
:param img_arr:
:return:
"""
bez = 1
while bez:
kanal = input("Zadejte RGB kanál, který chcete upravovat: \n 0 - červená\n 1 - zelená\n 2 - modrá\n")
if is_number(kanal):
if float(kanal) >= 0 and float(kanal)<=2:
bez = 0
else:
print('\033[41m' + "Zadejte 1,2 nebo 3." + '\033[0m')
else:
print('\033[41m' + "Nezadali jste číslo" + '\033[0m')
bez = 1
while bez:
level = input("Pro potlačení vybraného kanálu zadejte desetinné číslo od 0-1.0(0 odstraní barvu uplně). Pro zesílení barvy číslo >1.0\n")
if is_number(level):
if float(level) >= 0:
bez = 0
else:
print('\033[41m' + "Číslo nesmí být záporné!" + '\033[0m')
else:
print('\033[41m' + "Nezadali jste číslo" + '\033[0m')
imgarr = np.asarray(img_arr)
img2=np.copy(imgarr)
imgarr.setflags(write = 1) #nutno aby se dalo přepisovat hodnotu v poli, pole je jinak read only
i=int(kanal)
#forcyklus přes jednotlivé barvy
if float(level) > 1:
for j in range(0, imgarr[:, :, i].shape[0] - 1):
for k in range(0, imgarr[:, :, i].shape[1] - 1):
subpixel=imgarr[:, :, i][j][k] * float(level)
if subpixel >= 255:
imgarr[:, :, i][j][k] = 255
else:
imgarr[:, :, i][j][k] = subpixel
# img2 = img_arr.point(lambda p: p * 1.9) rychlejší zesvětlení pomocí knihovny pillow
else:
imgarr[:, :, i]= imgarr[:, :, i] * float(level)
fin_img = Image.fromarray(imgarr)
return fin_img
def helpme(uprava):
"""
Zobrazí nápovědu k určitému příkazu.
"""
if int(uprava) == 1:
help(inverze)
elif int(uprava) == 2:
help(levels)
elif int(uprava) == 3:
help(seda)
elif int(uprava) == 4:
help(hrany)
elif int(uprava) == 5:
help(rotate)
elif int(uprava) == 6:
help(zrcadleni(img))
elif int(uprava) == 7:
help(levels_color(img))
elif int(uprava) == 8:
help(helpme)
elif int(uprava) == 0:
print("Ukončí program.")
else:
print('\033[43m' + "Zadejte prosím jednu z voleb!" + '\033[0m')
#*********main**************
bez=1
while bez:
try:
image_name = input("Zadejte cestu k obrázku: \n")
img = Image.open(image_name)
bez=0
pass
except IOError as ioe:
print('\033[41m'+"Tento obrázek neexistuje!"+ '\033[0m')
pass
bez=1
while bez:
bez=0
bez2 = 1
while bez2:
uprava = input("1) Inverze\n2) Úrovně (zesvětlit, ztmavit)\n3) Převést obrázek do úrovní šedi \n4) Zvýraznění hran \n5) Rotace obrázku\n6) Zrcadlové převrácení\n7) Úrovně pro jeden kanál\n8) Nápověda k příkazům\n0) Konec\nZadejte číslo úpravy: \n")
if is_number(uprava):
bez2 = 0
else:
print('\033[41m' + "Zadejte prosím číslo!" + '\033[0m')
if int(uprava) == 1:
fin_img = inverze(img)
elif int(uprava) == 2:
fin_img = levels(img)
elif int(uprava) == 3:
fin_img = seda(img)
elif int(uprava) == 4:
fin_img = hrany(img)
elif int(uprava) == 5:
fin_img = rotate(img)
elif int(uprava) == 6:
fin_img = zrcadleni(img)
elif int(uprava) == 7:
fin_img = levels_color(img)
elif int(uprava) == 8:
bez3=1
while bez3:
napoveda=input("Zadejte číslo příkazu, pro který chcete nápovědu:")
if is_number(napoveda):
bez3 = 0
else:
print('\033[41m' + "Zadejte prosím číslo!" + '\033[0m')
helpme(napoveda)
bez=1
elif int(uprava) == 0:
sys.exit()
else:
print('\033[43m'+"Zadejte prosím jednu z voleb!"+ '\033[0m')
bez=1
image_out=input("Uložit obrázek jako: ")
fin_img.save(image_out)
print('\033[42m'+"Obrázek byl uložen jako: " + image_out + '\033[0m')