-
Notifications
You must be signed in to change notification settings - Fork 0
/
phase_scramble.py
49 lines (40 loc) · 1.81 KB
/
phase_scramble.py
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
import os
from PIL import Image
import numpy as np
from skimage.util import img_as_ubyte
import numpy as np
from scipy.fft import fft2, ifft2
def phaseScrambleImage(inputImage):
inFourier = fft2(inputImage)
inAmp = np.abs(inFourier)
outPhase = np.angle(fft2(np.random.randn(*inputImage.shape)))
scrambledImage = np.real(ifft2(inAmp * np.exp(1j * outPhase)))
rescaled_scrambledImage = (scrambledImage - scrambledImage.min()) / (scrambledImage.max() - scrambledImage.min())
return rescaled_scrambledImage
def make_phase_masks(image_folder):
folder_name = image_folder.strip('/').split('/')[-1]
outfold = f"{folder_name}_phase_scramble"
cats = os.listdir(image_folder)
for i in range(len(cats)):
catname = cats[i]
imgs = os.listdir(os.path.join(image_folder, catname))
os.makedirs(os.path.join(outfold, catname), exist_ok=True)
for j in range(len(imgs)):
imname = imgs[j]
im = np.array(Image.open(os.path.join(image_folder, catname, imname)).convert('RGB')) / 255
if im.shape[2] == 3:
imR = im[:,:,0]
imG = im[:,:,1]
imB = im[:,:,2]
maskR = phaseScrambleImage(imR)
maskG = phaseScrambleImage(imG)
maskB = phaseScrambleImage(imB)
mask = np.dstack((maskR, maskG, maskB))
else:
mask = phaseScrambleImage(im)
# mask = img_as_ubyte(mask)
imname_without_extension = os.path.splitext(imname)[0]
extension = os.path.splitext(imname)[-1]
output_name = imname_without_extension + "_phase_scramble" + extension
output_path = os.path.join(outfold, catname, output_name)
Image.fromarray((mask * 255).astype(np.uint8)).save(output_path)