File size: 1,883 Bytes
87b6396
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import cv2
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from skimage import filters

def calculate_redness_score(image_path):
    img = cv2.imread(image_path)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray_img, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    if len(faces) == 0:
        return 0, None

    x, y, w, h = faces[0]
    face_roi = img[y:y+h, x:x+w]
    face_hsv = cv2.cvtColor(face_roi, cv2.COLOR_BGR2HSV)
    lower_red = np.array([0, 70, 100])
    upper_red = np.array([10, 255, 255])
    mask = cv2.inRange(face_hsv, lower_red, upper_red)
    redness_percentage = (np.count_nonzero(mask) / (w * h)) * 100

    edge_mask = filters.sobel(mask)
    segmented_image = cv2.watershed(face_roi, edge_mask)

    regressor = RandomForestRegressor()
    X = np.array([[x, y, w, h] for x, y, w, h in faces])
    y = np.array([redness_percentage for _ in range(len(faces))])
    regressor.fit(X, y)

    plt.subplot(2, 2, 1)
    plt.imshow(img_rgb)
    plt.title('Original Image')

    plt.subplot(2, 2, 2)
    plt.imshow(cv2.cvtColor(cv2.bitwise_and(face_roi, face_roi, mask=mask), cv2.COLOR_BGR2RGB))
    plt.title('Red Mask')

    plt.subplot(2, 2, 3)
    plt.imshow(edge_mask, cmap='gray')
    plt.title('Edge Mask')

    plt.subplot(2, 2, 4)
    plt.imshow(segmented_image)
    plt.title('Segmented Image')

    plt.show()

    return redness_percentage, mask

image_path = 'main-qimg-8f68ebd077d3e8c95f1af2a120adbe90-lq.jpg'

redness_score, red_mask = calculate_redness_score(image_path)
print(f'Redness Score: {redness_score:.2f}')

if red_mask is not None:
    cv2.imwrite('red_mask.jpg', red_mask)