Move Image.combine() and friends to module level, add support for more than 2 images.
This commit is contained in:
parent
6d824a46d6
commit
f79d6da2c7
2 changed files with 40 additions and 32 deletions
|
|
@ -14,6 +14,7 @@
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
import itertools
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
@ -23,6 +24,42 @@ from skimage.color import rgb2gray
|
||||||
from .utils import cached_property, pairwise
|
from .utils import cached_property, pairwise
|
||||||
|
|
||||||
|
|
||||||
|
def bbox(*images):
|
||||||
|
return (
|
||||||
|
min(image.left for image in images),
|
||||||
|
min(image.top for image in images),
|
||||||
|
max(image.right for image in images),
|
||||||
|
max(image.bottom for image in images),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def overlap(*images):
|
||||||
|
for image1, image2 in itertools.combinations(images, 2):
|
||||||
|
xoverlap = (image1.right > image2.left and image2.right > image1.left)
|
||||||
|
yoverlap = (image1.bottom > image2.top and image2.bottom > image1.top)
|
||||||
|
if xoverlap and yoverlap:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def combine(*images):
|
||||||
|
if overlap(*images):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
left, top, right, bottom = bbox(*images)
|
||||||
|
width = right - left
|
||||||
|
height = bottom - top
|
||||||
|
|
||||||
|
data = np.zeros((height, width, images[0].data.shape[2]), images[0].data.dtype)
|
||||||
|
data.fill(255)
|
||||||
|
|
||||||
|
for image in images:
|
||||||
|
xoffset = image.left - left
|
||||||
|
yoffset = image.top - top
|
||||||
|
data[yoffset:yoffset + image.height, xoffset:xoffset + image.width] = image.data
|
||||||
|
return Image(data, left, top)
|
||||||
|
|
||||||
|
|
||||||
def _is_nonblank(bitmap):
|
def _is_nonblank(bitmap):
|
||||||
"""Return True if bitmap contains at least one black (=1) pixel."""
|
"""Return True if bitmap contains at least one black (=1) pixel."""
|
||||||
return bitmap.any()
|
return bitmap.any()
|
||||||
|
|
@ -167,34 +204,6 @@ class Image(object):
|
||||||
data = np.ma.masked_array(self.data, mask3, fill_value=255).filled()
|
data = np.ma.masked_array(self.data, mask3, fill_value=255).filled()
|
||||||
return Image(data, self.x, self.y)
|
return Image(data, self.x, self.y)
|
||||||
|
|
||||||
def bbox(self, other):
|
|
||||||
return (
|
|
||||||
min(self.left, other.left),
|
|
||||||
min(self.top, other.top),
|
|
||||||
max(self.right, other.right),
|
|
||||||
max(self.bottom, other.bottom),
|
|
||||||
)
|
|
||||||
|
|
||||||
def overlaps(self, other):
|
|
||||||
return not (self.right < other.left or other.left < self.right)
|
|
||||||
|
|
||||||
def combine(self, other):
|
|
||||||
if self.overlaps(other):
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
left, top, right, bottom = self.bbox(other)
|
|
||||||
width = right - left
|
|
||||||
height = bottom - top
|
|
||||||
selftop = self.top - top
|
|
||||||
othertop = other.top - top
|
|
||||||
selfleft = self.left - left
|
|
||||||
otherleft = other.left - left
|
|
||||||
data = np.zeros((height, width, self.shape[2]), self.data.dtype)
|
|
||||||
data.fill(255)
|
|
||||||
data[selftop:selftop + self.height, selfleft:selfleft + self.width] = self.data
|
|
||||||
data[othertop:othertop + other.height, otherleft:otherleft + other.width] = other.data
|
|
||||||
return Image(data, left, top)
|
|
||||||
|
|
||||||
def _iter_lines(self, min_space):
|
def _iter_lines(self, min_space):
|
||||||
def iter_lines():
|
def iter_lines():
|
||||||
line_start = None
|
line_start = None
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ from scipy import ndimage
|
||||||
from scipy.ndimage import filters
|
from scipy.ndimage import filters
|
||||||
|
|
||||||
from .utils import cached_property, collect_iterable, pairwise
|
from .utils import cached_property, collect_iterable, pairwise
|
||||||
from .image import Image
|
from .image import Image, combine
|
||||||
|
|
||||||
|
|
||||||
CONNECTIVITY8 = ndimage.generate_binary_structure(2, 2)
|
CONNECTIVITY8 = ndimage.generate_binary_structure(2, 2)
|
||||||
|
|
@ -196,9 +196,8 @@ class Glyph(PageObject):
|
||||||
def add_diacritics(self, *diacritics):
|
def add_diacritics(self, *diacritics):
|
||||||
if not diacritics:
|
if not diacritics:
|
||||||
return self
|
return self
|
||||||
if len(diacritics) > 1:
|
diacritic_images = (diacritic.image for diacritic in diacritics)
|
||||||
raise NotImplementedError
|
return Glyph(combine(self.image, *diacritic_images), self.elevation)
|
||||||
return Glyph(self.image.combine(diacritics[0].image), self.elevation)
|
|
||||||
|
|
||||||
|
|
||||||
class Space(Glyph):
|
class Space(Glyph):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue