mosaic.py 5.1 KB
Newer Older
HypoX64's avatar
preview  
HypoX64 已提交
1 2 3 4
import cv2
import numpy as np
import os
import random
HypoX64's avatar
HypoX64 已提交
5
from .image_processing import resize,ch_one2three,mask_area
HypoX64's avatar
preview  
HypoX64 已提交
6

H
hypox64 已提交
7 8 9 10 11 12 13 14
def addmosaic(img,mask,opt):
    if opt.mosaic_mod == 'random':
        img = addmosaic_random(img,mask)
    elif opt.mosaic_size == 0:
        img = addmosaic_autosize(img, mask, opt.mosaic_mod)
    else:
        img = addmosaic_normal(img,mask,opt.mosaic_size,opt.output_size,model = opt.mosaic_mod)
    return img
HypoX64's avatar
preview  
HypoX64 已提交
15

H
hypox64 已提交
16
def addmosaic_normal(img,mask,n,out_size = 0,model = 'squa_avg',rect_rat = 1.6):
H
hypox64 已提交
17
    n = int(n)
HypoX64's avatar
preview  
HypoX64 已提交
18 19 20 21 22 23 24 25 26 27 28 29
    if out_size:
        img = resize(img,out_size)      
    h, w = img.shape[:2]
    mask = cv2.resize(mask,(w,h))
    img_mosaic=img.copy()

    if model=='squa_avg':
        for i in range(int(h/n)):
            for j in range(int(w/n)):
                if mask[int(i*n+n/2),int(j*n+n/2)] == 255:
                    img_mosaic[i*n:(i+1)*n,j*n:(j+1)*n,:]=img[i*n:(i+1)*n,j*n:(j+1)*n,:].mean(0).mean(0)

H
hypox64 已提交
30 31 32 33 34 35
    elif model=='squa_mid':
        for i in range(int(h/n)):
            for j in range(int(w/n)):
                if mask[int(i*n+n/2),int(j*n+n/2)] == 255:
                    img_mosaic[i*n:(i+1)*n,j*n:(j+1)*n,:]=img[i*n+int(n/2),j*n+int(n/2),:]

HypoX64's avatar
preview  
HypoX64 已提交
36 37 38 39 40 41 42 43 44 45
    elif model == 'squa_random':
        for i in range(int(h/n)):
            for j in range(int(w/n)):
                if mask[int(i*n+n/2),int(j*n+n/2)] == 255:
                    img_mosaic[i*n:(i+1)*n,j*n:(j+1)*n,:]=img[int(i*n-n/2+n*random.random()),int(j*n-n/2+n*random.random()),:]

    elif model == 'squa_avg_circle_edge':
        for i in range(int(h/n)):
            for j in range(int(w/n)):
                img_mosaic[i*n:(i+1)*n,j*n:(j+1)*n,:]=img[i*n:(i+1)*n,j*n:(j+1)*n,:].mean(0).mean(0)
HypoX64's avatar
HypoX64 已提交
46 47
        mask = cv2.threshold(mask,127,255,cv2.THRESH_BINARY)[1]
        mask = ch_one2three(mask)
HypoX64's avatar
preview  
HypoX64 已提交
48 49 50 51 52 53 54
        mask_inv = cv2.bitwise_not(mask)
        imgroi1 = cv2.bitwise_and(mask,img_mosaic)
        imgroi2 = cv2.bitwise_and(mask_inv,img)
        img_mosaic = cv2.add(imgroi1,imgroi2)

    elif model =='rect_avg':
        n_h=n
H
hypox64 已提交
55
        n_w=int(n*rect_rat)
HypoX64's avatar
preview  
HypoX64 已提交
56 57 58 59 60 61 62
        for i in range(int(h/n_h)):
            for j in range(int(w/n_w)):
                if mask[int(i*n_h+n_h/2),int(j*n_w+n_w/2)] == 255:
                    img_mosaic[i*n_h:(i+1)*n_h,j*n_w:(j+1)*n_w,:]=img[i*n_h:(i+1)*n_h,j*n_w:(j+1)*n_w,:].mean(0).mean(0)
    
    return img_mosaic

H
hypox64 已提交
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
def get_autosize(img,mask,area_type = 'normal'):
    h,w = img.shape[:2]
    mask = cv2.resize(mask,(w,h))
    alpha = np.min((w,h))/512
    try:
        if area_type == 'normal':
            area = mask_area(mask)
        elif area_type == 'bounding':
            w,h = cv2.boundingRect(mask)[2:]
            area = w*h
    except:
        area = 0
    area = area/(alpha*alpha)
    if area>50000:
        size = alpha*((area-50000)/50000+12)
    elif 20000<area<=50000:
        size = alpha*((area-20000)/30000+8)
    elif 5000<area<=20000:
        size = alpha*((area-5000)/20000+7)
    elif 0<=area<=5000:
        size = alpha*((area-0)/5000+6)
    else:
        pass
    return size

H
hypox64 已提交
88
def addmosaic_autosize(img,mask,model,area_type = 'normal'):
H
hypox64 已提交
89 90 91 92
    h,w = img.shape[:2]
    mask = cv2.resize(mask,(w,h))
    alpha = np.min((w,h))/512
    try:
H
hypox64 已提交
93 94 95 96 97
        if area_type == 'normal':
            area = mask_area(mask)
        elif area_type == 'bounding':
            w,h = cv2.boundingRect(mask)[2:]
            area = w*h
H
hypox64 已提交
98 99 100 101
    except:
        area = 0
    area = area/(alpha*alpha)
    if area>50000:
H
hypox64 已提交
102
        img_mosaic = addmosaic_normal(img,mask,alpha*((area-50000)/50000+12),model = model)
H
hypox64 已提交
103
    elif 20000<area<=50000:
H
hypox64 已提交
104
        img_mosaic = addmosaic_normal(img,mask,alpha*((area-20000)/30000+8),model = model)
H
hypox64 已提交
105
    elif 5000<area<=20000:
H
hypox64 已提交
106
        img_mosaic = addmosaic_normal(img,mask,alpha*((area-5000)/20000+7),model = model)
H
hypox64 已提交
107
    elif 0<=area<=5000:
H
hypox64 已提交
108
        img_mosaic = addmosaic_normal(img,mask,alpha*((area-0)/5000+6),model = model)
HypoX64's avatar
preview  
HypoX64 已提交
109
    else:
H
hypox64 已提交
110 111
        pass
    return img_mosaic
HypoX64's avatar
preview  
HypoX64 已提交
112

H
hypox64 已提交
113
def addmosaic_random(img,mask,area_type = 'normal'):
H
hypox64 已提交
114
    # img = resize(img,512)
HypoX64's avatar
preview  
HypoX64 已提交
115 116
    h,w = img.shape[:2]
    mask = cv2.resize(mask,(w,h))
H
hypox64 已提交
117
    alpha = np.min((w,h))/512
HypoX64's avatar
preview  
HypoX64 已提交
118 119
    #area_avg=5925*4
    try:
H
hypox64 已提交
120 121 122 123 124
        if area_type == 'normal':
            area = mask_area(mask)
        elif area_type == 'bounding':
            w,h = cv2.boundingRect(mask)[2:]
            area = w*h
HypoX64's avatar
preview  
HypoX64 已提交
125 126
    except:
        area = 0
H
hypox64 已提交
127
    area = area/(alpha*alpha)
HypoX64's avatar
preview  
HypoX64 已提交
128
    if area>50000:
H
hypox64 已提交
129
        img_mosaic = random_mod(img,mask,alpha*random.uniform(16,30))
HypoX64's avatar
preview  
HypoX64 已提交
130
    elif 20000<area<=50000:
H
hypox64 已提交
131
        img_mosaic = random_mod(img,mask,alpha*random.uniform(12,20))
HypoX64's avatar
preview  
HypoX64 已提交
132
    elif 5000<area<=20000:
H
hypox64 已提交
133
        img_mosaic = random_mod(img,mask,alpha*random.uniform(8,15))
HypoX64's avatar
preview  
HypoX64 已提交
134
    elif 0<=area<=5000:
H
hypox64 已提交
135
        img_mosaic = random_mod(img,mask,alpha*random.uniform(4,10))
HypoX64's avatar
preview  
HypoX64 已提交
136 137 138
    else:
        pass
    return img_mosaic
H
hypox64 已提交
139 140 141

def random_mod(img,mask,n):
    ran=random.random()
H
hypox64 已提交
142 143 144
    if ran < 0.2:
        img = addmosaic_normal(img,mask,n,model = 'squa_mid')
    if 0.2 <= ran < 0.4:
H
hypox64 已提交
145
        img = addmosaic_normal(img,mask,n,model = 'squa_avg')
H
hypox64 已提交
146
    elif 0.4 <= ran <0.6:
H
hypox64 已提交
147 148 149 150
        img = addmosaic_normal(img,mask,n,model = 'squa_avg_circle_edge')
    else:
        img = addmosaic_normal(img,mask,n,model = 'rect_avg')
    return img