Après avoir commandé une demi-douzaine de webcams en ligne pour un projet, je remarque que les couleurs de la sortie ne sont pas cohérentes. Afin de compenser cela, j'ai essayé de prendre une image modèle et d'extraire les histogrammes R, G et B et essayé de faire correspondre les histogrammes RVB des images cibles en fonction de cela.Calibrage de la couleur de la webcam en utilisant OpenCV
Cela a été inspiré de la description de la solution pour un problème très similaire Comparative color calibration
La solution parfaite ressemblera à ceci:
Pour tenter de résoudre ce que j'ai écrit la script suivant qui a mal performé:
EDIT (Merci à @ DanMašek et @ api55)
import numpy as np
def show_image(title, image, width = 300):
# resize the image to have a constant width, just to
# make displaying the images take up less screen real
# estate
r = width/float(image.shape[1])
dim = (width, int(image.shape[0] * r))
resized = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
# show the resized image
cv2.imshow(title, resized)
def hist_match(source, template):
"""
Adjust the pixel values of a grayscale image such that its histogram
matches that of a target image
Arguments:
-----------
source: np.ndarray
Image to transform; the histogram is computed over the flattened
array
template: np.ndarray
Template image; can have different dimensions to source
Returns:
-----------
matched: np.ndarray
The transformed output image
"""
oldshape = source.shape
source = source.ravel()
template = template.ravel()
# get the set of unique pixel values and their corresponding indices and
# counts
s_values, bin_idx, s_counts = np.unique(source, return_inverse=True,
return_counts=True)
t_values, t_counts = np.unique(template, return_counts=True)
# take the cumsum of the counts and normalize by the number of pixels to
# get the empirical cumulative distribution functions for the source and
# template images (maps pixel value --> quantile)
s_quantiles = np.cumsum(s_counts).astype(np.float64)
s_quantiles /= s_quantiles[-1]
t_quantiles = np.cumsum(t_counts).astype(np.float64)
t_quantiles /= t_quantiles[-1]
# interpolate linearly to find the pixel values in the template image
# that correspond most closely to the quantiles in the source image
interp_t_values = np.interp(s_quantiles, t_quantiles, t_values)
return interp_t_values[bin_idx].reshape(oldshape)
from matplotlib import pyplot as plt
from scipy.misc import lena, ascent
import cv2
source = cv2.imread('/media/somadetect/Lexar/color_transfer_data/1/frame10.png')
s_b = source[:,:,0]
s_g = source[:,:,1]
s_r = source[:,:,2]
template = cv2.imread('/media/somadetect/Lexar/color_transfer_data/5/frame6.png')
t_b = source[:,:,0]
t_r = source[:,:,1]
t_g = source[:,:,2]
matched_b = hist_match(s_b, t_b)
matched_g = hist_match(s_g, t_g)
matched_r = hist_match(s_r, t_r)
y,x,c = source.shape
transfer = np.empty((y,x,c), dtype=np.uint8)
transfer[:,:,0] = matched_r
transfer[:,:,1] = matched_g
transfer[:,:,2] = matched_b
show_image("Template", template)
show_image("Target", source)
show_image("Transfer", transfer)
cv2.waitKey(0)
image Modèle:
image cible:
L'image matched:
Ensuite, j'ai trouvé la tentative d'Adrian (de pyimagesearch) pour résoudre un problème similaire dans le lien suivant
Les résultats semblent être assez bonne avec quelques défauts de saturation. J'apprécierais toute suggestion ou indication sur la façon de résoudre ce problème afin que toutes les sorties de la webcam puissent être calibrées pour produire des couleurs similaires basées sur une image modèle.
Même si je ne connais pas grand-chose à la vision industrielle, cette approche de transfert de couleur ne me semble pas juste. C'est une tâche complètement différente. Dans votre cas, je suppose, vous voulez quelque chose qui a un modèle sous-jacent, ce qui explique pourquoi ces caméras se comportent différemment! Ignorer un tel modèle pourrait conduire à trop de degrés de liberté/pas assez de régularisation et donc de mauvais résultats. Encore une fois, pas beaucoup d'expérience, mais ces caméras en interne ne fonctionnent sûrement pas avec RVB, mais probablement un modèle Bayer qui permet un modèle de bruit plus ajusté * (capteur-données disponibles?). – sascha
Avez-vous commandé une douzaine de caméras de marques différentes ou sont-elles différentes au sein d'une même marque? – Arturo