File size: 2,779 Bytes
eb4231e
 
be8ba6b
eb4231e
 
 
be8ba6b
 
eb4231e
 
be8ba6b
eb4231e
 
be8ba6b
eb4231e
 
 
 
 
 
be8ba6b
eb4231e
 
 
 
 
 
 
 
 
be8ba6b
eb4231e
 
 
be8ba6b
eb4231e
 
be8ba6b
eb4231e
 
be8ba6b
eb4231e
be8ba6b
eb4231e
 
 
 
 
 
 
 
 
 
 
 
 
be8ba6b
eb4231e
 
be8ba6b
eb4231e
 
be8ba6b
eb4231e
 
 
 
 
 
 
 
 
7c3493b
 
 
 
 
eb4231e
 
 
be8ba6b
eb4231e
 
 
 
 
 
 
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
from flask import Flask, request, jsonify, render_template
from flask_cors import CORS
import numpy as np
import cv2
import base64
from src.core import process_inpaint, s_image
import os

app = Flask(__name__)
CORS(app) 

# Add the API URL
API_URL = os.environ.get("API_URL", "https://walidadebayo-image-eraser-api.hf.space/") 

# endpoint for health checks
@app.route('/', methods=['GET'])
def health_check():
    # For browser requests, return HTML documentation
    if request.headers.get('Accept', '').find('text/html') != -1:
        return render_template('index.html', api_url=API_URL)
    
    # For API health checks, return JSON
    return jsonify({"status": "API is running"})

@app.route('/api/inpaint', methods=['POST'])
def inpaint():
    # Get data from request
    data = request.json
    image_data = data.get('image')
    mask_data = data.get('mask')
    
    # Convert base64 to numpy arrays
    image = base64_to_image(image_data)
    mask = base64_to_image(mask_data)
    
    # Process the image
    result = process_inpaint(image, mask)
    
    # Convert back to base64
    result_base64 = image_to_base64(result)
    
    return jsonify({'result': result_base64})

@app.route('/api/seam-carve', methods=['POST'])
def seam_carve():
    # Get data from request
    data = request.json
    image_data = data.get('image')
    mask_data = data.get('mask')
    vs = int(data.get('vs', 0))  # vertical seams
    hs = int(data.get('hs', 0))  # horizontal seams
    mode = data.get('mode', 'resize')  # resize or remove
    
    # Convert base64 to numpy arrays
    image = base64_to_image(image_data)
    mask = base64_to_image(mask_data)
    
    # Process the image
    result = s_image(image, mask, vs, hs, mode)
    
    # Convert back to base64
    result_base64 = image_to_base64(result)
    
    return jsonify({'result': result_base64})

def base64_to_image(base64_str):
    img_bytes = base64.b64decode(base64_str.split(',')[1])
    img_array = np.frombuffer(img_bytes, np.uint8)
    img = cv2.imdecode(img_array, cv2.IMREAD_UNCHANGED)
    return img

def image_to_base64(image):
    # Convert float types to uint8
    if image.dtype == np.float64 or image.dtype == np.float32:
        # Normalize to 0-255 range and convert to uint8
        image = np.clip(image * 255 if image.max() <= 1.0 else image, 0, 255).astype(np.uint8)
    
    # Convert to BGR if it's RGB
    if len(image.shape) > 2 and image.shape[2] == 3:
        image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
    
    _, buffer = cv2.imencode('.png', image)
    img_bytes = base64.b64encode(buffer).decode('utf-8')
    return f"data:image/png;base64,{img_bytes}"

if __name__ == '__main__':
    port = int(os.environ.get("PORT", 7860))
    app.run(debug=True, host='0.0.0.0', port=port)