File size: 3,717 Bytes
d5d20be
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
有一些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