Spaces:
Running
Running
""" | |
有一些png图像下部也会有一些透明的区域,使得图像无法对其底部边框 | |
本程序实现移动图像,使其下部与png图像实际大小相对齐 | |
""" | |
import os | |
import cv2 | |
import numpy as np | |
from ..utils import get_box_pro | |
path_pre = os.path.join(os.getcwd(), 'pre') | |
path_final = os.path.join(os.getcwd(), 'final') | |
def merge(boxes): | |
""" | |
生成的边框可能不止只有一个,需要将边框合并 | |
""" | |
x, y, h, w = boxes[0] | |
# x和y应该是整个boxes里面最小的值 | |
if len(boxes) > 1: | |
for tmp in boxes: | |
x_tmp, y_tmp, h_tmp, w_tmp = tmp | |
if x > x_tmp: | |
x_max = x_tmp + w_tmp if x_tmp + w_tmp > x + w else x + w | |
x = x_tmp | |
w = x_max - x | |
if y > y_tmp: | |
y_max = y_tmp + h_tmp if y_tmp + h_tmp > y + h else y + h | |
y = y_tmp | |
h = y_max - y | |
return tuple((x, y, h, w)) | |
def get_box(png_img): | |
""" | |
获取矩形边框最终返回一个元组(x,y,h,w),分别对应矩形左上角的坐标和矩形的高和宽 | |
""" | |
r, g, b , a = cv2.split(png_img) | |
gray_img = a | |
th, binary = cv2.threshold(gray_img, 127 , 255, cv2.THRESH_BINARY) # 二值化 | |
# cv2.imshow("name", binary) | |
# cv2.waitKey(0) | |
contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 得到轮廓列表contours | |
bounding_boxes = merge([cv2.boundingRect(cnt) for cnt in contours]) # 轮廓合并 | |
# print(bounding_boxes) | |
return bounding_boxes | |
def get_box_2(png_img): | |
""" | |
不用opencv内置算法生成矩形了,改用自己的算法(for循环) | |
""" | |
_, _, _, a = cv2.split(png_img) | |
_, a = cv2.threshold(a, 127, 255, cv2.THRESH_BINARY) | |
# 将r,g,b通道丢弃,只留下透明度通道 | |
# cv2.imshow("name", a) | |
# cv2.waitKey(0) | |
# 在透明度矩阵中,0代表完全透明 | |
height,width=a.shape # 高和宽 | |
f=0 | |
tmp1 = 0 | |
""" | |
获取上下 | |
""" | |
for tmp1 in range(0,height): | |
tmp_a_high= a[tmp1:tmp1+1,:][0] | |
for tmp2 in range(width): | |
# a = tmp_a_low[tmp2] | |
if tmp_a_high[tmp2]!=0: | |
f=1 | |
if f == 1: | |
break | |
delta_y_high = tmp1 + 1 | |
f = 0 | |
for tmp1 in range(height,-1, -1): | |
tmp_a_low= a[tmp1-1:tmp1+1,:][0] | |
for tmp2 in range(width): | |
# a = tmp_a_low[tmp2] | |
if tmp_a_low[tmp2]!=0: | |
f=1 | |
if f == 1: | |
break | |
delta_y_bottom = height - tmp1 + 3 | |
""" | |
获取左右 | |
""" | |
f = 0 | |
for tmp1 in range(width): | |
tmp_a_left = a[:, tmp1:tmp1+1] | |
for tmp2 in range(height): | |
if tmp_a_left[tmp2] != 0: | |
f = 1 | |
if f==1: | |
break | |
delta_x_left = tmp1 + 1 | |
f = 0 | |
for tmp1 in range(width, -1, -1): | |
tmp_a_left = a[:, tmp1-1:tmp1] | |
for tmp2 in range(height): | |
if tmp_a_left[tmp2] != 0: | |
f = 1 | |
if f==1: | |
break | |
delta_x_right = width - tmp1 + 1 | |
return delta_y_high, delta_y_bottom, delta_x_left, delta_x_right | |
def move(input_image): | |
""" | |
裁剪主函数,输入一张png图像,该图像周围是透明的 | |
""" | |
png_img = input_image # 获取图像 | |
height, width, channels = png_img.shape # 高y、宽x | |
y_low,y_high, _, _ = get_box_pro(png_img, model=2) # for循环 | |
base = np.zeros((y_high, width, channels),dtype=np.uint8) # for循环 | |
png_img = png_img[0:height - y_high, :, :] # for循环 | |
png_img = np.concatenate((base, png_img), axis=0) | |
return png_img | |
if __name__ == "__main__": | |
pass | |