-
Notifications
You must be signed in to change notification settings - Fork 29
/
FocusMask.py
98 lines (84 loc) · 3.47 KB
/
FocusMask.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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'Will Brennan'
# built-in modules
import logging
# Standard modules
import cv2
import numpy
import skimage
import skimage.measure
import skimage.segmentation
# Custom modules
import main
import scripts
logger = logging.getLogger('main')
def get_masks(img, n_seg=250):
logger.debug('SLIC segmentation initialised')
segments = skimage.segmentation.slic(img, n_segments=n_seg, compactness=10, sigma=1)
logger.debug('SLIC segmentation complete')
logger.debug('contour extraction...')
masks = [[numpy.zeros((img.shape[0], img.shape[1]), dtype=numpy.uint8), None]]
for region in skimage.measure.regionprops(segments):
masks.append([masks[0][0].copy(), region.bbox])
x_min, y_min, x_max, y_max = region.bbox
masks[-1][0][x_min:x_max, y_min:y_max] = skimage.img_as_ubyte(region.convex_image)
logger.debug('contours extracted')
return masks[1:]
def blur_mask_old(img):
assert isinstance(img, numpy.ndarray), 'img_col must be a numpy array'
assert img.ndim == 3, 'img_col must be a color image ({0} dimensions currently)'.format(img.ndim)
blur_mask = numpy.zeros(img.shape[:2], dtype=numpy.uint8)
for mask, loc in get_masks(img):
logger.debug('Checking Mask: {0}'.format(numpy.unique(mask)))
logger.debug('SuperPixel Mask Percentage: {0}%'.format(int((100.0/255.0)*(numpy.sum(mask)/mask.size))))
img_fft, val, blurry = main.blur_detector(img[loc[0]:loc[2], loc[1]:loc[3]])
logger.debug('Blurry: {0}'.format(blurry))
if blurry:
blur_mask = cv2.add(blur_mask, mask)
result = numpy.sum(blur_mask)/(255.0*blur_mask.size)
logger.info('{0}% of input image is blurry'.format(int(100*result)))
return blur_mask, result
def morphology(msk):
assert isinstance(msk, numpy.ndarray), 'msk must be a numpy array'
assert msk.ndim == 2, 'msk must be a greyscale image'
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
msk = cv2.erode(msk, kernel, iterations=1)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
msk = cv2.morphologyEx(msk, cv2.MORPH_CLOSE, kernel)
msk[msk < 128] = 0
msk[msk > 127] = 255
return msk
def remove_border(msk, width=50):
assert isinstance(msk, numpy.ndarray), 'msk must be a numpy array'
assert msk.ndim == 2, 'msk must be a greyscale image'
dh, dw = map(lambda i: i//width, msk.shape)
h, w = msk.shape
msk[:dh, :] = 255
msk[h-dh:, :] = 255
msk[:, :dw] = 255
msk[:, w-dw:] = 255
return msk
def blur_mask(img):
assert isinstance(img, numpy.ndarray), 'img_col must be a numpy array'
assert img.ndim == 3, 'img_col must be a color image ({0} dimensions currently)'.format(img.ndim)
msk, val, blurry = main.blur_detector(img)
logger.debug('inverting img_fft')
msk = cv2.convertScaleAbs(255-(255*msk/numpy.max(msk)))
msk[msk < 50] = 0
msk[msk > 127] = 255
logger.debug('removing border')
msk = remove_border(msk)
logger.debug('applying erosion and dilation operators')
msk = morphology(msk)
logger.debug('evaluation complete')
result = numpy.sum(msk)/(255.0*msk.size)
logger.info('{0}% of input image is blurry'.format(int(100*result)))
return msk, result, blurry
if __name__ == '__main__':
img_path = raw_input("Please Enter Image Path: ")
img = cv2.imread(img_path)
msk, val = blur_mask(img)
scripts.display('img', img)
scripts.display('msk', msk)
cv2.waitKey(0)