Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Comparación de algoritmos de balance de blancos automáticos

Nuestros ojos son muy buenos para juzgar lo que es blanco bajo diferentes condiciones de iluminación. Sin embargo, las cámaras digitales, sin algún tipo de ajuste, pueden capturar fácilmente imágenes poco realistas con un fundido de color fuerte. Los algoritmos de balance de blancos automáticos (AWB) intentan corregir la luz ambiental con una entrada mínima del usuario, de modo que la imagen resultante se parezca a lo que nuestros ojos verán. Pero, ¿cuál es el mejor algoritmo AWB para usar? En este ejemplo, explicamos el proceso detrás del balance de blancos automático y mostramos cómo comparar y seleccionar el mejor algoritmo.

El balance de blancos automático se realiza en dos pasos:

  • Paso 1: Estime la iluminación de la escena.

  • Paso 2: Corrija el balance de color de la imagen.

El paso más difícil, y el que se centrará en la optimización, es el paso 1-la estimación de la luz ambiental. Una vez que se conoce la luz ambiental, la corrección de los colores de la imagen (paso 2) es un proceso fácil y fijo.

A continuación, juzgamos la calidad de tres algoritmos para la estimación de iluminantes comparándolos con la iluminación de la escena de la verdad del terreno:

  • Parche blanco Retinex [1]

  • Mundo gris [2]

  • Método de análisis de componentes principales (PCA) de Cheng [3]

Leer imagen de 16 bits de valores RGB lineales

Los algoritmos de balance de blancos automáticos se aplican generalmente en los datos de imagen RAW, antes de que la imagen se comprima y se guarde en la tarjeta de memoria. es un archivo de imagen que contiene estos datos de sensor sin procesar después de corregir el nivel de negro y escalar las intensidades a 16 bits por píxel.foosballraw.tiff Esta imagen está libre del equilibrio blanco hecho por la cámara, así como demosaicking, denoising, compensación de aberración cromática, ajustes de tono, corrección gamma y otro procesamiento hecho antes de que la imagen se guarda en la tarjeta de memoria.

A = imread('foosballraw.tiff');

La imagen contiene valores RGB lineales.Un La mayoría de los algoritmos de estimación de iluminantes asumen una relación lineal entre la respuesta del sensor de imagen y las intensidades de píxel. Sin embargo, debido a la naturaleza no lineal de los dispositivos de visualización, los archivos de imagen destinados a mostrarse, como los archivos JPEG, incorporan una corrección de gamma. Sin las imágenes de corrección gamma se vería muy tenue en una pantalla de ordenador. Si está trabajando con imágenes con corrección gamma, asegúrese de linealizarlas con la función.rgb2lin Este no es el caso con, así que omita este paso.foosballraw.tiff

Interpolar para recuperar información de color que falta

Las cámaras digitales utilizan una matriz de filtros de color superpuesta en el sensor de imagen para simular la visión del color, de modo que cada píxel sea sensible a rojo, verde o azul. Para recuperar la información de color que falta en cada píxel, debe interpolar. El patrón de Bayer utilizado por la cámara con la que se capturó la foto (Canon EOS 30D) es RGGB.

A = demosaic(A,'rggb');

Gamma-corrija la imagen para la visualización

Si intenta mostrar la imagen lineal tal cual, aparecerá muy tenue, debido a la característica no lineal de los dispositivos de visualización. Por lo tanto, para fines de visualización, gamma-corrija la imagen para utilizar el espacio de color sRGB.

A_sRGB = lin2rgb(A);

Visualice la imagen original, mínimamente procesada antes y después de la corrección gamma

warning('off','images:initSize:adjustingMag') montage({A,A_sRGB}) title('Original, minimally processed image before and after gamma correction')

Localice el gráfico ColorChecker

Se ha incluido un gráfico ColorChecker en la escena. Este gráfico está hecho de 24 parches neutros y de color con reflectancias espectrales conocidas. Utilizaremos los 6 parches neutrales (acromáticos) en la fila inferior para estimar la iluminación de la verdad del terreno en la escena, contra la cual se compararán los algoritmos. Sin embargo, al probar los algoritmos, el gráfico debe excluirse para evitar que los algoritmos se aprovechen injustamente de él – no hay ningún gráfico ColorChecker en situaciones de la vida real.

Especifique la ubicación del gráfico ColorChecker. De forma predeterminada, el ejemplo proporciona los cooridinates de un cuadrilátero delimitador. Si desea seleccionar las coordenadas de polígono de forma interactiva, cambie el valor de to.select_polygontrue

select_polygon = false;  if select_polygon          % Use roipoly to create a mask from a polygon drawn manually.      % Click to add vertices, then right-click and select "Create Mask" to return.     imshow(A_sRGB)      title('Draw a polygon around the chart')      mask_chart = roipoly;       else          % Use the provided coordinates of the bounding rectangle.     c = [930 1280 1316 953];     r = [1877 1890 1382 1370];     mask_chart = roipoly(A_sRGB,r,c);      end

Dilatar ligeramente la máscara para garantizar que no se incluyan píxeles pertenecientes al gráfico.

mask_chart = imdilate(mask_chart,ones(7));

Mida la iluminación de la verdad del suelo utilizando el gráfico ColorChecker

A los efectos del balance de blancos Sólo usaremos los 6 parches neutrales en la fila inferior del gráfico. Estos parches neutros reflejan la luz por igual en el espectro visible. Reflejan la iluminación de la escena. La iluminante de la verdad del terreno se calcula como el color medio de los parches neutrales, excluyendo los píxeles de debajo y sobre expuestos.

Especifique el centro de cada parche neutro. De forma predeterminada, el ejemplo proporciona una estimación de la coordenada central de cada parche. Si desea seleccionar los centros de ROI de forma interactiva, cambie el valor de to.estimate_roi_centerstrue

estimate_roi_centers = false;  if estimate_roi_centers          %  Zoom in and click the center of each of the 6 neutral patches.     xlim([1350 1930])      ylim([900 1350])     title('Click the center of each of the 6 neutral patches')      [x,y] = ginput(6);  else          % Use the provided estimate of ROI center coordinates.     x = [1424 1514 1598 1676 1757 1835];     y = [1268 1250 1247 1250 1235 1229]; end

Obtenemos un área cuadrada de las coordenadas del centro de cada parche Considerando que el lado de un cuadrado es el 80% de la distancia que separa los centros de dos parches consecutivos.

x = round(x); y = round(y); r = mean(diff(x)) / 2 * 0.80; r = floor(r);

Cree una máscara binaria que cubra los parches neutrales.

mask = false(size(A,1), size(A,2)); for k = 1:6     mask(y(k)-r:y(k)+r,x(k)-r:x(k)+r) = true; end

Erosionan la máscara para evitar incluir píxeles fuera de los parches o en el borde, que son propensos a la aberración cromática, cuyos colores pueden sesgar la medición de la verdad del terreno.

mask_eroded = imerode(mask, strel('disk',5));

Identifique los valores RGB saturados en la imagen de entrada. Estos valores deben excluirse del cálculo de la verdad del terreno, ya que también sesgan la medición.

mask_clipped = (A == intmax(class(A))) | (A == intmin(class(A))); mask_clipped = mask_clipped(:,:,1) | mask_clipped(:,:,2) | mask_clipped(:,:,3);

Excluya estos píxeles recortados de la máscara correspondiente a los parches neutrales.

mask_patches = mask_eroded & ~mask_clipped;

Visualice los píxeles seleccionados. Los píxeles resaltados deben estar dentro de los parches neutrales. Si no es así, intente hacer clic de nuevo en los centros de los parches y repita los pasos anteriores.

A_patches = imoverlay(A_sRGB,mask_patches);  imshow(A_patches) title('The selected pixels are highlighted in yellow')

Obtenga los valores rojo, verde y rojo para los parches neutros.

patches_R = A(:,:,1); patches_G = A(:,:,2); patches_B = A(:,:,3); patches_R = patches_R(mask_patches); patches_G = patches_G(mask_patches); patches_B = patches_B(mask_patches);

Para simplificar y porque la mayoría de los algoritmos de estimación de iluminantes funcionan en punto flotante, convertimos los valores RGB de los parches en Double y escalamos los valores para que estén en [0 1] antes de calcular la media.

patches_R = im2double(patches_R); patches_G = im2double(patches_G); patches_B = im2double(patches_B);

Calcule la iluminante RGB de la verdad del terreno como el valor medio RGB en los parches neutros.

illuminant_groundtruth = [mean(patches_R) mean(patches_G) mean(patches_B)];

Error angular

Para comparar una iluminante estimada con la verdad del terreno, calcule el entre los dos colores.angular error Para comprender mejor el concepto de error angular, considere la siguiente visualización de un iluminante arbitrario y la verdad del terreno que acabamos de medir. Cada iluminante representa un vector en el espacio RGB.

illuminant = [0.066 0.1262 0.0691];  plot3([0 1],[0 1],[0,1],'LineStyle',':','Color','k') hold on plot3(...     [0 illuminant_groundtruth(1)/norm(illuminant_groundtruth)], ... % Red     [0 illuminant_groundtruth(2)/norm(illuminant_groundtruth)], ... % Green     [0 illuminant_groundtruth(3)/norm(illuminant_groundtruth)], ... % Blue     'Marker','.', 'MarkerSize',10) hold on plot3( ...     [0 illuminant(1)/norm(illuminant)], ... % Red     [0 illuminant(2)/norm(illuminant)], ... % Green     [0 illuminant(3)/norm(illuminant)], ... % Blue     'Marker','.', 'MarkerSize',10) xlabel('R') ylabel('G') zlabel('B') title('Illuminants in RGB space') xlim([0 1]) ylim([0 1]) zlim([0 1]) view(28, 36) legend('achromatic line', 'ground truth illuminant', 'estimated illuminant') grid on axis equal

El valor exacto de la iluminante estimada no importa tanto como su dirección, ya que la dirección de la iluminante es lo que se utiliza para equilibrar el blanco de una imagen. Idealmente, la iluminante estimada debe alinearse con la iluminante de la verdad del suelo. El error angular entre la iluminante estimada y la verdad del terreno es el ángulo (en grados) formado por los dos vectores. Evaluaremos la calidad de una estimación de acuerdo con el error angular contra la verdad del terreno.The smaller the angular error, the better the estimation is.

White patch Retinex

El método White patch Retinex [1] para la estimación de iluminantes asume que la escena contiene un parche brillante. Este parche refleja la máxima luz posible para cada banda de color, que es el color de la iluminación de la escena.

La función implementa el método White patch Retinex al tiempo que proporciona la capacidad de excluir parte de los píxeles más brillantes del cálculo, con el fin de evitar tomar en consideración los píxeles sobre-expuestos.illumwhite

En primer lugar, estimar la iluminación de la escena utilizando todos los píxeles de la imagen, menos el gráfico ColorChecker. Esto se hace especificando el percentil superior que se excluirá para ser 0. El par nombre-valor se utiliza para especificar los píxeles que se usarán para el cálculo, que en nuestro caso son píxeles que no pertenecen al gráfico ColorChecker.'Mask'

illuminant_wp1 = illumwhite(A, 0, 'Mask', ~mask_chart);

Calcule el error angular para el iluminante estimado con White patch Retinex.

err_wp1 = colorangle(illuminant_wp1, illuminant_groundtruth); disp(['Angular error for White Patch with percentile=0: ' num2str(err_wp1)])
Angular error for White Patch with percentile=0: 16.5163 

Para equilibrar el blanco de la imagen (paso 2 de AWB) utilizando esta iluminante estimada, utilice la función, que por defecto escala los colores en el modelo de respuesta del cono de Bradford.chromadapt Asegúrese de especificar que estamos trabajando con valores de color RGB lineales.

B_wp1 = chromadapt(A, illuminant_wp1, 'ColorSpace', 'linear-rgb');

Visualice la imagen equilibrada de color blanco con corrección gamma

B_wp1_sRGB = lin2rgb(B_wp1);  figure imshow(B_wp1_sRGB) title('White balanced image using White Patch Retinex with percentile=0')

En segundo lugar, dado que seleccionar el valor RGB máximo es sensible a los píxeles sobreexpuestos, el algoritmo de Retinex de White patch puede ser más robusto al excluir un cierto porcentaje de los píxeles más brillantes del cálculo. Esto se logra a través del parámetro percentil de la función illumwhite. Elija un valor de percentil de 1. (El valor predeterminado es 1.)

illuminant_wp2 = illumwhite(A, 1, 'Mask', ~mask_chart);

Calcule el error angular para el iluminante estimado con la versión más robusta de White patch Retinex.

err_wp2 = colorangle(illuminant_wp2, illuminant_groundtruth); disp(['Angular error for White Patch with percentile=1: ' num2str(err_wp2)])
Angular error for White Patch with percentile=1: 5.0323 

Visualice la imagen equilibrada de color blanco con corrección gamma con la nueva iluminante

B_wp2 = chromadapt(A, illuminant_wp2, 'ColorSpace', 'linear-rgb'); B_wp2_sRGB = lin2rgb(B_wp2);  imshow(B_wp2_sRGB) title('White balanced image using White Patch Retinex with percentile=1')

Gray World

Gray World [2] es sin duda el mejor método de estimación de iluminante conocido. Se asume que el color medio del mundo es gris, es decir, acromático. Por lo tanto, calcula la iluminante de escena como el valor RGB en la imagen.average

La función implementa el algoritmo del mundo gris con una adición:illumgray Proporciona la capacidad de excluir los píxeles más oscuros y más brillantes del cómputo, lo que puede sesgar la estimación de la iluminante, haciendo que el algoritmo sea más robusto.

En primer lugar, estimar la iluminación de la escena utilizando todos los píxeles de la imagen, excluyendo los correspondientes a la gráfico ColorChecker. La función proporciona un parámetro para especificar los percentiles de los valores inferior y superior (ordenados por brillo) que se excluirán.illumgray Aquí, especificamos los percentiles como [0 0].

illuminant_gw1 = illumgray(A, 0, 'Mask', ~mask_chart);

Compare la iluminante estimada con la verdad del terreno calculando el error angular entre los dos, de forma similar a lo que hicimos para White patch Retinex.

err_gw1 = colorangle(illuminant_gw1, illuminant_groundtruth); disp(['Angular error for Gray World with percentiles=[0 0]: ' num2str(err_gw1)])
Angular error for Gray World with percentiles=[0 0]: 5.063 

Aplicar la adaptación cromática al balance de blancos de la imagen con la iluminante estimada.

B_gw1 = chromadapt(A, illuminant_gw1, 'ColorSpace', 'linear-rgb');

Visualice la imagen equilibrada de color blanco con corrección gamma

B_gw1_sRGB = lin2rgb(B_gw1);  imshow(B_gw1_sRGB) title('White balanced image using Gray World with percentiles=[0 0]')

En segundo lugar, ya que los píxeles bajo y sobreexpuesto pueden influir negativamente en la estimación del iluminante como el valor medio de RGB en la imagen, vamos a excluir el 1% de los píxeles inferior y superior. (El valor predeterminado es [1 1].)percentiles

illuminant_gw2 = illumgray(A, 1, 'Mask', ~mask_chart);

Calcule el error angular para la segunda iluminante estimada con Gray World.

err_gw2 = colorangle(illuminant_gw2, illuminant_groundtruth); disp(['Angular error for Gray World with percentiles=[1 1]: ' num2str(err_gw2)])
Angular error for Gray World with percentiles=[1 1]: 5.1314 

Visualice la imagen equilibrada de color blanco con corrección gamma con la nueva iluminante.

B_gw2 = chromadapt(A, illuminant_gw2, 'ColorSpace', 'linear-rgb'); B_gw2_sRGB = lin2rgb(B_gw2);  imshow(B_gw2_sRGB) title('White balanced image using Gray World with percentiles=[1 1]')

El método de análisis de componentes principales de Cheng (PCA)

El método de estimación de iluminante de Cheng [3] se inspira en los métodos de dominio espacial como Grey Edge [4], que asume que los degradados de una imagen son acromáticos. Muestran que Grey Edge se puede mejorar artificialmente introduciendo gradientes fuertes al barajar bloques de imagen, y concluir que los degradados más fuertes siguen la dirección del iluminante. Su método consiste en ordenar los píxeles de acuerdo con la norma de su proyección a lo largo de la dirección del color de la imagen media, y retener el p% inferior y superior. Estos dos grupos corresponden a degradados fuertes en la imagen. Por último, realizan un (PCA) en los píxeles retenidos y devuelven el primer componente como la iluminación estimada.principal component analysis

El método de Cheng es implementado por la función.illumpca Utilizamos el método de Cheng para estimar la iluminante en la escena usando el 5% inferior y superior de píxeles a lo largo de la dirección del color medio. (El valor predeterminado es 3,5.)

illuminant_ch1 = illumpca(A, 5, 'Mask', ~mask_chart);

Compare esta estimación con la verdad del terreno.

err_ch1 = colorangle(illuminant_ch1, illuminant_groundtruth); disp(['Angular error for Cheng with percentage=5: ' num2str(err_ch1)])
Angular error for Cheng with percentage=5: 4.7595 

Visualice la imagen equilibrada de color blanco con corrección gamma

B_ch1 = chromadapt(A, illuminant_ch1, 'ColorSpace', 'linear-rgb'); B_ch1_sRGB = lin2rgb(B_ch1);  imshow(B_ch1_sRGB) title('White balanced image using Cheng with percentage=5')

Ahora vamos a usar el valor de porcentaje predeterminado y ver cómo se compara.

illuminant_ch2 = illumpca(A, 'Mask', ~mask_chart); err_ch2 = colorangle(illuminant_ch2, illuminant_groundtruth); disp(['Angular error for Cheng with percentage=3.5: ' num2str(err_ch2)])
Angular error for Cheng with percentage=3.5: 5.0283 

Visualice la imagen corregida en sRGB.

B_ch2 = chromadapt(A, illuminant_ch2, 'ColorSpace', 'linear-rgb'); B_ch2_sRGB = lin2rgb(B_ch2);  imshow(B_ch2_sRGB) title('White balanced image using Cheng with percentile=3.5')

Parámetro barrido

Para encontrar el mejor parámetro a utilizar para cada método podemos barrer a través de un rango y calcular el error angular para cada uno de ellos. Los parámetros de los tres algoritmos tienen significados diferentes, pero los rangos similares de estos parámetros facilitan la búsqueda mediante programación del mejor para cada algoritmo.

param_range = 0:0.25:5; err = zeros(numel(param_range),3); for k = 1:numel(param_range)     % White Patch     illuminant_wp = illumwhite(A, param_range(k), 'Mask', ~mask_chart);     err(k,1) = colorangle(illuminant_wp, illuminant_groundtruth);     % Gray World     illuminant_gw = illumgray(A, param_range(k), 'Mask', ~mask_chart);     err(k,2) = colorangle(illuminant_gw, illuminant_groundtruth);     % Cheng     if (param_range(k) ~= 0)         illuminant_ch = illumpca(A, param_range(k), 'Mask', ~mask_chart);         err(k,3) = colorangle(illuminant_ch, illuminant_groundtruth);     else         % Cheng's algorithm is undefined for percentage=0.         err(k,3) = NaN;     end end

Cree una visualización del error angular como mapa de calor.

err_normalized = mat2gray(log(err)); block_size_x = 120; block_size_y = 50; err_image = ones(size(err,1) * block_size_y, size(err,2) * block_size_x); for i = 0:size(err,1)-1     for j = 0:size(err,2)-1         err_image(block_size_y*i+1:block_size_y*(i+1), block_size_x*j+1:block_size_x*(j+1)) = err_normalized(i+1,j+1);     end end

Visualice el mapa térmico del error angular. Los colores azul claro indican un error angular bajo (bueno), mientras que los colores rojos indican un error angular alto (malo).

old_pref = iptgetpref('ImshowAxesVisible'); iptsetpref('ImshowAxesVisible','on') imshow(err_image, 'Colormap', cool) iptsetpref('ImshowAxesVisible',old_pref) for i = 0:size(err,1)-1     for j = 0:size(err,2)-1         y = block_size_y*i + 1 + block_size_y/2;         x = block_size_x*j + 1 + block_size_x/3;         text(x,y,sprintf('%1.2f',err(i+1,j+1)))     end end box off title('Angular Error') ylabel('Parameter')  yticks(linspace(block_size_y/2, size(err_image,1) - block_size_y/2, numel(param_range))) yticklabels(arrayfun(@(x) {num2str(x)}, param_range))  xticks(block_size_x/2 + [0 block_size_x 2*block_size_x]) xticklabels({'White Patch','Gray World','Cheng'})

Encuentre el mejor parámetro para cada algoritmo.

[~,idx_best] = min(err); best_param_wp = param_range(idx_best(1)); best_param_gw = param_range(idx_best(2)); best_param_ch = param_range(idx_best(3));  fprintf('The best parameter for White Patch is %1.2f with angular error %1.2f degrees\n', ...     best_param_wp, err(idx_best(1),1));
The best parameter for White Patch is 0.25 with angular error 3.33 degrees 
fprintf('The best parameter for Gray World is %1.2f with angular error %1.2f degrees\n', ...     best_param_gw, err(idx_best(2),2));
The best parameter for Gray World is 0.00 with angular error 5.06 degrees 
fprintf('The best parameter for Cheng is %1.2f with angular error %1.2f degrees\n', ...     best_param_ch, err(idx_best(3),3));
The best parameter for Cheng is 0.50 with angular error 1.72 degrees 

Calcule y visualice la mejor iluminante estimada para cada algoritmo en el espacio RGB.

best_illum_wp = illumwhite(A, best_param_wp, 'Mask', ~mask_chart); best_illum_gw = illumgray(A, best_param_gw, 'Mask', ~mask_chart); best_illum_ch = illumpca(A, best_param_ch, 'Mask', ~mask_chart);  plot3([0 1],[0 1],[0,1],'LineStyle',':','Color','k') hold on plot3(...     [0 illuminant_groundtruth(1)/norm(illuminant_groundtruth)], ... % Red     [0 illuminant_groundtruth(2)/norm(illuminant_groundtruth)], ... % Green     [0 illuminant_groundtruth(3)/norm(illuminant_groundtruth)], ... % Blue     'Marker','.', 'MarkerSize',10) plot3( ...     [0 best_illum_wp(1)/norm(best_illum_wp)], ... % Red     [0 best_illum_wp(2)/norm(best_illum_wp)], ... % Green     [0 best_illum_wp(3)/norm(best_illum_wp)], ... % Blue     'Marker','.', 'MarkerSize',10) plot3( ...     [0 best_illum_gw(1)/norm(best_illum_gw)], ... % Red     [0 best_illum_gw(2)/norm(best_illum_gw)], ... % Green     [0 best_illum_gw(3)/norm(best_illum_gw)], ... % Blue     'Marker','.', 'MarkerSize',10) plot3( ...     [0 best_illum_ch(1)/norm(best_illum_ch)], ... % Red     [0 best_illum_ch(2)/norm(best_illum_ch)], ... % Green     [0 best_illum_ch(3)/norm(best_illum_ch)], ... % Blue     'Marker','.', 'MarkerSize',10) xlabel('R') ylabel('G') zlabel('B') title('Best illuminants in RGB space') xlim([0 1]) ylim([0 1]) zlim([0 1]) view(28, 36) legend('achromatic line', 'ground truth', 'White Patch', 'Gray World', 'Cheng') grid on axis equal

Visualice las imágenes blancas equilibradas para cada método utilizando el mejor iluminante lado a lado.

B_wp_best = chromadapt(A, best_illum_wp, 'ColorSpace', 'linear-rgb'); B_wp_best_sRGB = lin2rgb(B_wp_best); B_gw_best = chromadapt(A, best_illum_gw, 'ColorSpace', 'linear-rgb'); B_gw_best_sRGB = lin2rgb(B_gw_best); B_ch_best = chromadapt(A, best_illum_ch, 'ColorSpace', 'linear-rgb'); B_ch_best_sRGB = lin2rgb(B_ch_best);  M = zeros(size(A,1), 3*size(A,2), size(A,3), 'like', A); M(:,1:size(A,2),:) = B_wp_best_sRGB; M(:,size(A,2)+1:2*size(A,2),:) = B_gw_best_sRGB; M(:,2*size(A,2)+1:end,:) = B_ch_best_sRGB;  figure imshow(M) title('Montage of the best white balanced images: White Point, Gray World, Cheng')

Conclusión

Este rápido tiroteo entre dos métodos clásicos de estimación de iluminante y uno más reciente muestra que el método de Cheng, usando los píxeles superior e inferior 0,75% más oscuros y brillantes, gana para esa imagen en particular. Sin embargo, este resultado debe tomarse con un grano de sal.

En primer lugar, la iluminante de la verdad del terreno se midió utilizando un gráfico ColorChecker y es sensible al ruido de disparo y sensor. La iluminante de la verdad del terreno de una escena se puede estimar mejor usando un espectrofotómetro.

En segundo lugar, calculamos la iluminante de la verdad del terreno como el color medio de los parches neutros. También es común utilizar la mediana en lugar de la media. Hacerlo podría cambiar la verdad del terreno por una cantidad significativa. Por ejemplo, para la imagen de este estudio, utilizando los mismos píxeles, el color mediano y el color medio de los parches neutros son de 0,5 grados, que en algunos casos pueden ser más que el error angular de los iluminantes estimados por diferentes métodos.

En tercer lugar, una comparación completa de los métodos de estimación de iluminantes debe utilizar una variedad de imágenes tomadas bajo diferentes condiciones. Un método podría funcionar mejor que los demás para una imagen determinada, pero podría tener un rendimiento deficiente en todo el conjunto de datos.

Referencias

[1] Ebner, Marc. Parche blanco Retinex, constancia de color. John Wiley & Sons, 2007. ISBN 978-0-470-05829-9.

[2] Ebner, Marc. La asunción del mundo gris, la constancia del color. John Wiley & Sons, 2007. ISBN 978-0-470-05829-9.

[3] Cheng, Dongliang, Dilip K. Prasad y Michael S. Brown. "Estimación del iluminante para la constancia de color: por qué funcionan los métodos de dominio espacial y el papel de la distribución del color." JOSA A 31,5 (2014): 1049-1058.

[4] van de weijer, Joost, Theo Gevers, y Arjan Gijsenij. "Constancia de color basada en el borde." Transacciones IEEE en el procesamiento de imágenes 16,9 (2007): 2207-2214.

Consulte también

| | | | | | | | |

Temas relacionados