Jimmyzheng-10's picture
Add app.py and the screencoder repo
a383d0e
raw
history blame
4.46 kB
import cv2
import numpy as np
import shutil
import os
from os.path import join as pjoin
def segment_img(org, segment_size, output_path, overlap=100):
if not os.path.exists(output_path):
os.mkdir(output_path)
height, width = np.shape(org)[0], np.shape(org)[1]
top = 0
bottom = segment_size
segment_no = 0
while top < height and bottom < height:
segment = org[top:bottom]
cv2.imwrite(os.path.join(output_path, str(segment_no) + '.png'), segment)
segment_no += 1
top += segment_size - overlap
bottom = bottom + segment_size - overlap if bottom + segment_size - overlap <= height else height
def clipping(img, components, pad=0, show=False):
"""
:param adjust: shrink(negative) or expand(positive) the bounding box
:param img: original image
:param corners: ((column_min, row_min),(column_max, row_max))
:return: list of clipping images
"""
clips = []
for component in components:
clip = component.compo_clipping(img, pad=pad)
clips.append(clip)
if show:
cv2.imshow('clipping', clip)
cv2.waitKey()
return clips
def dissemble_clip_img_hollow(clip_root, org, compos):
if os.path.exists(clip_root):
shutil.rmtree(clip_root)
os.mkdir(clip_root)
cls_dirs = []
bkg = org.copy()
hollow_out = np.ones(bkg.shape[:2], dtype=np.uint8) * 255
for compo in compos:
cls = compo.category
c_root = pjoin(clip_root, cls)
c_path = pjoin(c_root, str(compo.id) + '.jpg')
if cls not in cls_dirs:
os.mkdir(c_root)
cls_dirs.append(cls)
clip = compo.compo_clipping(org)
cv2.imwrite(c_path, clip)
col_min, row_min, col_max, row_max = compo.put_bbox()
hollow_out[row_min: row_max, col_min: col_max] = 0
bkg = cv2.merge((bkg, hollow_out))
cv2.imwrite(os.path.join(clip_root, 'bkg.png'), bkg)
def dissemble_clip_img_fill(clip_root, org, compos, flag='most'):
def average_pix_around(pad=6, offset=3):
up = row_min - pad if row_min - pad >= 0 else 0
left = col_min - pad if col_min - pad >= 0 else 0
bottom = row_max + pad if row_max + pad < org.shape[0] - 1 else org.shape[0] - 1
right = col_max + pad if col_max + pad < org.shape[1] - 1 else org.shape[1] - 1
average = []
for i in range(3):
avg_up = np.average(org[up:row_min - offset, left:right, i])
avg_bot = np.average(org[row_max + offset:bottom, left:right, i])
avg_left = np.average(org[up:bottom, left:col_min - offset, i])
avg_right = np.average(org[up:bottom, col_max + offset:right, i])
average.append(int((avg_up + avg_bot + avg_left + avg_right)/4))
return average
def most_pix_around(pad=6, offset=2):
up = row_min - pad if row_min - pad >= 0 else 0
left = col_min - pad if col_min - pad >= 0 else 0
bottom = row_max + pad if row_max + pad < org.shape[0] - 1 else org.shape[0] - 1
right = col_max + pad if col_max + pad < org.shape[1] - 1 else org.shape[1] - 1
most = []
for i in range(3):
val = np.concatenate((org[up:row_min - offset, left:right, i].flatten(),
org[row_max + offset:bottom, left:right, i].flatten(),
org[up:bottom, left:col_min - offset, i].flatten(),
org[up:bottom, col_max + offset:right, i].flatten()))
# print(val)
# print(np.argmax(np.bincount(val)))
most.append(int(np.argmax(np.bincount(val))))
return most
if os.path.exists(clip_root):
shutil.rmtree(clip_root)
os.mkdir(clip_root)
cls_dirs = []
bkg = org.copy()
for compo in compos:
cls = compo.category
c_root = pjoin(clip_root, cls)
c_path = pjoin(c_root, str(compo.id) + '.jpg')
if cls not in cls_dirs:
os.mkdir(c_root)
cls_dirs.append(cls)
clip = compo.compo_clipping(org)
cv2.imwrite(c_path, clip)
col_min, row_min, col_max, row_max = compo.put_bbox()
if flag == 'average':
color = average_pix_around()
elif flag == 'most':
color = most_pix_around()
cv2.rectangle(bkg, (col_min, row_min), (col_max, row_max), color, -1)
cv2.imwrite(os.path.join(clip_root, 'bkg.png'), bkg)