| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import cv2
- import math
- import numpy as np
- import os
- # create_correct ===============================================================
- # return:
- # (<Boolean> True/False), depending on the transformation process
- def create_correct(cv_dress):
- #Production dir:
- return correct_color(cv_dress, 5)
- # correct_color ==============================================================================
- # return:
- # <RGB> image corrected
- def correct_color(img, percent):
- assert img.shape[2] == 3
- assert percent > 0 and percent < 100
- half_percent = percent / 200.0
- channels = cv2.split(img)
- out_channels = []
- for channel in channels:
- assert len(channel.shape) == 2
- # find the low and high precentile values (based on the input percentile)
- height, width = channel.shape
- vec_size = width * height
- flat = channel.reshape(vec_size)
- assert len(flat.shape) == 1
- flat = np.sort(flat)
- n_cols = flat.shape[0]
- low_val = flat[math.floor(n_cols * half_percent)]
- high_val = flat[math.ceil( n_cols * (1.0 - half_percent))]
- # saturate below the low percentile and above the high percentile
- thresholded = apply_threshold(channel, low_val, high_val)
- # scale the channel
- normalized = cv2.normalize(thresholded, thresholded.copy(), 0, 255, cv2.NORM_MINMAX)
- out_channels.append(normalized)
- return cv2.merge(out_channels)
- #Color correction utils
- def apply_threshold(matrix, low_value, high_value):
- low_mask = matrix < low_value
- matrix = apply_mask(matrix, low_mask, low_value)
- high_mask = matrix > high_value
- matrix = apply_mask(matrix, high_mask, high_value)
- return matrix
- #Color correction utils
- def apply_mask(matrix, mask, fill_value):
- masked = np.ma.array(matrix, mask=mask, fill_value=fill_value)
- return masked.filled()
|