Spaces:
Running
Running
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) | |