-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathcal.py
executable file
·125 lines (104 loc) · 3.88 KB
/
cal.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
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
#!/usr/bin/env python3
"""
Looking over:
https://stackoverflow.com/questions/18951500/automatically-remove-hot-dead-pixels-from-an-image-in-python
Suggests take the median of the surrounding pixels
Lets just create an image map with the known bad pixels
Arbitrarily going to set to black to good pixel, white for bad pixel
"""
from gxs700.util import hexdump, add_bool_arg, default_date_dir, mkdir_p
from gxs700 import xray
from gxs700 import util
from gxs700 import im_util
import binascii
import glob
from PIL import Image
import numpy as np
import os
import sys
import time
import usb1
"""
def bad_pixs_ff1(fff, ffi):
ffmed = np.median(fff)
print("min: %0.1f, med: %0.1f, max: %0.1f" % (np.amin(fff), ffmed, np.amax(fff)))
#cold_pixs = fff[fff <= ffmed/2.0]
cold_pixs = np.nonzero(fff <= ffmed/2.0)
print(cold_pixs)
print("Cold pixels: %u / %u" % (len(cold_pixs), width * height))
#x = i % width
#y = i // width
"""
def bad_pixs_ff(fff, ffi, thresh_scalar=0.25):
ffmed = np.median(fff)
print("min: %0.1f, med: %0.1f, max: %0.1f" % (np.amin(fff), ffmed,
np.amax(fff)))
ret = []
width, height = ffi.size
thresh = ffmed * thresh_scalar
for y in range(height):
for x in range(width):
val = ffi.getpixel((x, y))
if 0 and y == 0 and x < 16:
print(x, y, val)
if val <= thresh:
ret.append((x, y))
print("Cold pixels: %u / %u" % (len(ret), width * height))
return ret
def bad_pixs_df(fff, ffi, thresh_scalar=0.25):
ffmed = np.median(fff)
print("min: %0.1f, med: %0.1f, max: %0.1f" % (np.amin(fff), ffmed,
np.amax(fff)))
ret = []
width, height = ffi.size
# FIXME
PIX_MAX = 0xFFFF
thresh = PIX_MAX * thresh_scalar
for y in range(height):
for x in range(width):
val = ffi.getpixel((x, y))
if 0 and y == 0 and x < 16:
print(x, y, val)
if val >= thresh:
ret.append((x, y))
print("Hot pixels: %u / %u" % (len(ret), width * height))
return ret
def main():
import argparse
parser = argparse.ArgumentParser(description='Generate calibreation files from specially captured frames')
parser.add_argument(
'--images',
type=int,
default=0,
help='Only take first n images, for debugging')
parser.add_argument('--ff-thresh', default=0.25, type=float, help='')
parser.add_argument('--df-thresh', default=0.25, type=float, help='')
parser.add_argument('ff_dir', help='Flat field images')
parser.add_argument('df_dir', help='Dark field images')
parser.add_argument('cal_dir', nargs='?', default=None, help='Output calibration files dir')
args = parser.parse_args()
cal_dir = args.cal_dir
if not cal_dir:
cal_dir_ff = im_util.default_cal_dir(im_dir=args.ff_dir)
cal_dir_df = im_util.default_cal_dir(im_dir=args.df_dir)
assert cal_dir_ff == cal_dir_df, "Files are from different sensors"
cal_dir = cal_dir_ff
mkdir_p(cal_dir)
fff, ffi = im_util.average_dir(args.ff_dir, images=args.images)
width, height = ffi.size
badimg = Image.new("1", (width, height), "Black")
ffi.save(cal_dir + '/ff.png')
im_util.histeq_im(ffi).save(cal_dir + '/ffe.png')
for x, y in bad_pixs_ff(fff, ffi, thresh_scalar=args.ff_thresh):
badimg.putpixel((x, y), 1)
dff, dfi = im_util.average_dir(args.df_dir, images=args.images)
dfi.save(cal_dir + '/df.png')
im_util.histeq_im(dfi).save(cal_dir + '/dfe.png')
for x, y in bad_pixs_df(dff, dfi, thresh_scalar=args.df_thresh):
badimg.putpixel((x, y), 1)
badimg.save(cal_dir + '/bad.png')
print("done")
if __name__ == "__main__":
#im = Image.fromarray(np.asarray([[1, 2, 3], [4, 5, 6]]), mode="I")
#im.show()
main()