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. Las cámaras digitales, sin embargo, sin algún tipo de ajuste, pueden capturar fácilmente imágenes poco realistas con un fuerte fundido de color. Los algoritmos de balance de blancos automático (AWB) intentan corregir la luz ambiental con la entrada mínima del usuario, de modo que la imagen resultante se parezca a lo que verían nuestros ojos. 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: Estimar 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 nos centraremos 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 illuminante comparándolos con la iluminación de la escena de la verdad del suelo:

  • 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 suelen aplicar en los datos de imagen sin procesar, 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 balance de blancos realizado por la cámara, así como demosaico, denoising, compensación de aberración cromática, ajustes de tono, corrección gamma y otro procesamiento realizado antes de que la imagen se guarde 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 iluminante asumen una relación lineal entre la respuesta del sensor de imágenes y las intensidades de píxeles. Sin embargo, debido a la naturaleza no lineal de los dispositivos de visualización, archivos de imagen destinados a ser mostrados como archivos JPEG incorporan una corrección gamma. Sin corrección gamma las imágenes se verían muy tenues en la pantalla de un ordenador. Si está trabajando con imágenes corregidas por 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 la información de color que falta

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

A = demosaic(A,'rggb');

Gamma-Corregir la imagen para la visualización

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

A_sRGB = lin2rgb(A);

Mostrar 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. Usaremos los 6 parches neutros (acromáticos) en la fila inferior para estimar la iluminación de la verdad del suelo en la escena, con la que 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 cooridinatos de un cuadrilátero delimitador. Si desea seleccionar las coordenadas poligonales de forma interactiva, cambie el valor de a .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 asegurarnos de que no incluimos ningún píxel que pertenezca al gráfico.

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

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

Para el balance de blancos sólo utilizaremos los 6 parches neutros en la fila inferior del gráfico. Estos parches neutros reflejan la luz por igual a través del espectro visible. Reflejan la iluminación de la escena. El iluminador de la verdad del suelo se calcula como el color medio de los parches neutros, excluyendo los píxeles subexpuestos y sobreexpuestos.

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 a .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

Derivamos 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 neutros.

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

Erosione 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 suelo.

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 suelo, ya que también sesgarán 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 neutros.

mask_patches = mask_eroded & ~mask_clipped;

Visualice los píxeles seleccionados. Todos los píxeles resaltados deben estar dentro de los parches neutros. Si no es así, intente hacer clic en los centros de los parches de nuevo 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 de 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 iluminadoras funcionan en punto flotante, convertimos los valores RGB de los parches a doble 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);

Calcular el iluminante RGB de la verdad del suelo como el valor RGB medio a través de los parches neutros.

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

Angular Error

Para comparar un iluminador estimado con la verdad del suelo, calcule entre los dos colores.error angular Para entender mejor el concepto de error angular, considere la siguiente visualización de un iluminador arbitrario y la verdad del suelo 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 del iluminante estimado no importa tanto como su dirección, ya que la dirección del iluminante es lo que se utiliza para equilibrar el blanco de una imagen. Idealmente, el iluminante estimado debe estar alineado con el iluminador de la verdad del suelo. El error angular entre el iluminante estimado y la verdad del suelo 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 suelo.Cuanto menor sea el error angular, mejor será la estimación.

Parche Blanco Retinex

El método White Patch Retinex [1] para la estimación iluminador supone 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 tener en cuenta los píxeles sobreexpuestos.illumwhite

En primer lugar, calcule 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 que sea 0. El par nombre-valor se utiliza para especificar qué píxeles utilizar 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);

Calcular 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 de blanco la imagen (Paso 2 de AWB) utilizando este iluminante estimado, utilice la función, que de forma predeterminada escala los colores en el modelo de respuesta del cono Bradford.chromadapt Asegúrese de especificar que estamos trabajando con valores de color RGB lineales.

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

Mostrar la imagen balanceada en blanco corregida por 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 la selección del valor RGB máximo es sensible a los píxeles sobreexpuestos, el algoritmo White Patch Retinex se puede hacer más robusto excluyendo 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);

Calcular 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 

Muestre la imagen blanca balanceada con el nuevo 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')

Mundo Gris

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

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

En primer lugar, calcule la iluminación de la escena utilizando todos los píxeles de la imagen, excluyendo los correspondientes al 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 van a excluir.illumgray Aquí, especificamos los percentiles como [0 0].

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

Compare el iluminante estimado con la verdad del suelo calculando el error angular entre los dos, de manera 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 

Aplique la adaptación cromática para equilibrar la imagen con el iluminante estimado.

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

Mostrar la imagen balanceada en blanco corregida por 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, dado que los píxeles expuestos por debajo y sobreexpuestos pueden influir negativamente en la estimación del iluminante como el valor RGB medio de la imagen, excluyamos los píxeles inferior y superior del 1%. (El valor predeterminado para es [1 1].)percentiles

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

Calcular el error angular para el segundo iluminante estimado con Mundo gris.

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 

Muestre la imagen balanceada en blanco corregida por gamma con el nuevo 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]')

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

El método de estimación iluminante de Cheng [3] se inspira en métodos de dominio espacial como Grey Edge [4], que supone que los degradados de una imagen son acromáticos. Muestran que borde gris se puede mejorar mediante la introducción artificial de degradados fuertes mediante la barajación de bloques de imagen, y concluyen 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 medio de la imagen, y retener la parte inferior y superior p%. 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.análisis de componentes principales

El método de Cheng es implementado por la función.illumpca Usamos el método de Cheng para estimar el iluminante en la escena usando la parte inferior y superior del 5% de los 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 suelo.

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 

Mostrar la imagen balanceada en blanco corregida por 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 

Muestre 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')

Barrido de parámetros

Para encontrar el mejor parámetro 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 térmico.

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

Mostrar 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 

Calcular y mostrar el iluminador mejor estimado 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

Muestre las imágenes blancas balanceadas para cada método utilizando el mejor iluminador uno al lado del otro.

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 tiroteo rápido 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, el iluminador de la verdad del suelo se midió utilizando un gráfico ColorChecker y es sensible al ruido de disparos y sensores. El iluminador de la verdad del suelo de una escena se puede estimar mejor usando un espectrofotómetro.

En segundo lugar, estimamos el iluminador de la verdad del suelo 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 en una cantidad significativa. Por ejemplo, para la imagen de este estudio, utilizando los mismos píxeles, el color medio y el color medio de los parches neutros están separados por 0,5 grados, que en algunos casos pueden ser más que el error angular de los iluminadores estimados por diferentes métodos.

En tercer lugar, una comparación completa de los métodos de estimación de iluminante debe utilizar una variedad de imágenes tomadas en condiciones diferentes. 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, Constancia de Color. John Wiley & Sons, 2007. ISBN 978-0-470-05829-9.

[3] Cheng, Dongliang, Dilip K. Prasad y Michael S. Brown. "Estimación luminosa de la constancia del 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 bordes." Transacciones IEEE sobre el procesamiento de imágenes 16.9 (2007): 2207-2214.

Consulte también

| | | | | | | | |

Temas relacionados