imhistmatch

Настройте гистограмму 2D изображения, чтобы совпадать с гистограммой ссылочного изображения

Описание

пример

J = imhistmatch(I,ref) преобразовывает 2D черно-белое или цветное изображение I возврат выходного изображения J чья гистограмма приблизительно совпадает с гистограммой ссылочного изображения ref.

  • Если оба I и ref изображения истинного цвета, затем imhistmatch соответствия каждый цветовой канал I независимо к соответствующему цветовому каналу ref.

  • Если I изображение RGB истинного цвета и ref полутоновое изображение, затем imhistmatch соответствия каждый канал I против одной гистограммы, выведенной из ref.

  • Если I полутоновое изображение, затем ref должно также быть полутоновое изображение.

Изображения I и ref может быть любой из допустимых типов данных и не должен быть равным в размере.

пример

J = imhistmatch(I,ref,nbins) использование nbins равномерно распределенные интервалы в соответствующей области значений для данного типа данных image. Возвращенное изображение J имеет не больше, чем nbins дискретные уровни.

  • Если типом данных изображения является любой single или double, затем область значений гистограммы [0, 1].

  • Если типом данных изображения является uint8, затем область значений гистограммы [0, 255].

  • Если типом данных изображения является uint16, затем область значений гистограммы [0, 65535].

  • Если типом данных изображения является int16, затем область значений гистограммы [-32768, 32767].

пример

J = imhistmatch(___,Name,Value) пары "имя-значение" использования, чтобы изменить поведение алгоритма соответствия гистограммы.

пример

[J,hgram] = imhistmatch(___) возвращает гистограмму ссылочного изображения ref используемый для соответствия в hgram. hgram 1 nbins (когда ref шкала полутонов), или 3 nbins (когда ref истинный цвет), матрица, где nbins количество интервалов гистограммы. Каждая строка в hgram хранит гистограмму одного цветового канала ref.

Примеры

свернуть все

Эти воздушные изображения, взятые в разное время, представляют перекрывающиеся представления того же ландшафта в Конкорде, Массачусетс. Этот пример демонстрирует, что вход отображает A и Ref может иметь различные размеры и типы изображения.

Загрузите изображение RGB и ссылочное полутоновое изображение.

A = imread('concordaerial.png');
Ref = imread('concordorthophoto.png');

Получите размер A.

size(A)
ans = 1×3

        2036        3060           3

Получите размер Ref.

size(Ref)
ans = 1×2

        2215        2956

Обратите внимание на то, что отобразите A и Ref отличаются в размере и типе. Отобразите A изображение RGB истинного цвета, в то время как изображение Ref полутоновое изображение. Оба изображения имеют тип данных uint8.

Сгенерируйте соответствующее выходное изображение гистограммы. Пример совпадает с каждым каналом A против одной гистограммы Ref. Выходное изображение B берет характеристики изображения A - это - изображение RGB, размер которого и тип данных эквивалентны, отображают A. Количество отличных уровней, существующих в каждом канале RGB изображения B совпадает с количеством интервалов в гистограмме, созданной из полутонового изображения Ref. В этом примере, гистограмме Ref и B имейте количество по умолчанию интервалов, 64.

B = imhistmatch(A,Ref);

Отобразитесь RGB отображают A, ссылочное изображение Ref, и гистограмма совпадала с изображением RGB B. Изображения изменены перед отображением.

imshow(A)
title('RGB Image with Color Cast')

Figure contains an axes object. The axes object with title RGB Image with Color Cast contains an object of type image.

imshow(Ref)
title('Reference Grayscale Image')

Figure contains an axes object. The axes object with title Reference Grayscale Image contains an object of type image.

imshow(B)
title('Histogram Matched RGB Image')

Figure contains an axes object. The axes object with title Histogram Matched RGB Image contains an object of type image.

Считайте цветное изображение и ссылочное изображение. Чтобы продемонстрировать полиномиальный метод, присвойте ссылочное изображение, чтобы быть более темными из двух изображений.

I = imread('office_4.jpg');
ref = imread('office_2.jpg');
montage({I,ref})
title('Input Image (Left) vs Reference Image (Right)');

Figure contains an axes object. The axes object with title Input Image (Left) vs Reference Image (Right) contains an object of type image.

Используйте полиномиальный метод, чтобы настроить интенсивность изображения I так, чтобы это совпадало с гистограммой ссылочного изображения ref. Для сравнения также настройте интенсивность изображения I использование универсального метода.

J = imhistmatch(I,ref,'method','polynomial');
K = imhistmatch(I,ref,'method','uniform');
montage({J,K})
title('Histogram-Matched Image Using Polynomial Method (Left) vs Uniform Method (Right)');

Figure contains an axes object. The axes object with title Histogram-Matched Image Using Polynomial Method (Left) vs Uniform Method (Right) contains an object of type image.

Соответствующее гистограмме изображение с помощью универсального метода вводит фиктивные цвета в небе и дороге. Соответствующее гистограмме изображение с помощью полиномиального метода не показывает этот артефакт.

В этом примере показано, как можно варьироваться количество интервалов в целевой гистограмме, чтобы улучшить эквализацию гистограммы.

Загрузите два изображения типа данных uint8 в рабочую область. Изображения были взяты с цифровым фотоаппаратом и представляют два различных воздействия той же сцены. A недоэкспонированное изображение и кажется темным. ref ссылочное изображение с хорошим воздействием и яркостью.

A = imread('office_2.jpg');
ref = imread('office_4.jpg');

Отобразите изображения в монтаже.

montage({A,ref})
title('Dark Image (Left) and Reference Image (Right)')

Figure contains an axes object. The axes object with title Dark Image (Left) and Reference Image (Right) contains an object of type image.

Отобразите гистограмму каждого цветового канала с помощью 256 интервалов. Можно использовать функцию помощника, displayHistogramChannels, это включено с примером.

displayHistogramChannels(A,ref)

Figure contains 6 axes objects. Axes object 1 with title Histograms of Input Image contains an object of type histogram. Axes object 2 with title Histograms of Reference Image contains an object of type histogram. Axes object 3 contains an object of type histogram. Axes object 4 contains an object of type histogram. Axes object 5 contains an object of type histogram. Axes object 6 contains an object of type histogram.

Отобразите A, быть более темным изображением, имеет большинство его пикселей в более низких интервалах. Ссылочное изображение, ref, полностью заполняет все 256 значений интервалов во всех трех каналах RGB.

Считайте количество уникальных 8-битных значений уровня для каждого цветового канала темного и ссылочного изображения. Можно использовать функцию помощника, countUniqueValues, это включено с примером.

numVals = countUniqueValues(A,ref);
table(numVals(:,1),numVals(:,2),numVals(:,3), ...
  'VariableNames',["Red" "Green" "Blue"], ...
  'RowNames',["A" "ref"])
ans=2×3 table
           Red    Green    Blue
           ___    _____    ____

    A      205     193     224 
    ref    256     256     256 

Компенсируйте гистограмму темного изображения с помощью трех различных значений nbins: 64, 128 и 256. 64 количество по умолчанию интервалов, и 256 максимальное количество интервалов для uint8 пиксельные данные.

[B64,hgram64]   = imhistmatch(A,ref,64);   
[B128,hgram128] = imhistmatch(A,ref,128);
[B256,hgram256] = imhistmatch(A,ref,256);

figure
montage({B64,B128,B256},'Size',[1 3])
title('Output Image B64  |  Output Image B128  |  Output Image B256')

Figure contains an axes object. The axes object with title Output Image B64 | Output Image B128 | Output Image B256 contains an object of type image.

Отобразите гистограмму каждого цветового канала с помощью 256 интервалов. Можно использовать функцию помощника, displayThreeHistogramChannels, это включено с примером.

displayThreeHistogramChannels(B64,B128,B256)

Figure contains 9 axes objects. Axes object 1 with title Histograms of Output Image B64 contains an object of type histogram. Axes object 2 with title Histograms of Output Image B128 contains an object of type histogram. Axes object 3 with title Histograms of Output Image B256 contains an object of type histogram. Axes object 4 contains an object of type histogram. Axes object 5 contains an object of type histogram. Axes object 6 contains an object of type histogram. Axes object 7 contains an object of type histogram. Axes object 8 contains an object of type histogram. Axes object 9 contains an object of type histogram.

Рассчитайте количество уникальных 8-битных значений уровня для каждого цветового канала трех гистограмм компенсировало изображения. Как nbins увеличения, количество уровней в каждом канале RGB выходного изображения B также увеличения.

numVals = countUniqueValues(B64,B128,B256);
table(numVals(:,1),numVals(:,2),numVals(:,3), ...
  'VariableNames',["Red" "Green" "Blue"], ...
  'RowNames',["B64" "B128" "B256"])
ans=3×3 table
            Red    Green    Blue
            ___    _____    ____

    B64      57      60      58 
    B128    101     104     104 
    B256    134     135     136 

В этом примере показано, как выполнить гистограмму, соответствующую с различными количествами интервалов.

Загрузите 16-битное изображение DICOM колена, отображенного через MRI.

K = dicomread('knee1.dcm');   % read in original 16-bit image
LevelsK = unique(K(:));       % determine number of unique code values
disp(['image K: ',num2str(length(LevelsK)),' distinct levels']);
image K: 448 distinct levels
disp(['max level = ' num2str( max(LevelsK) )]);
max level = 473
disp(['min level = ' num2str( min(LevelsK) )]);
min level = 0

Все 448 дискретных значений в низких кодовых обозначениях, который заставляет изображение выглядеть темным. Чтобы исправить это, масштабируйте данные изображения, чтобы породить целую 16-битную линейную оболочку столбцов [0, 65535].

Kdouble = double(K);                  % cast uint16 to double
kmult = 65535/(max(max(Kdouble(:)))); % full range multiplier
Ref = uint16(kmult*Kdouble);   % full range 16-bit reference image

Затемните ссылочное изображение Ref создать изображение A это может использоваться в операции соответствия гистограммы.

%Build concave bow-shaped curve for darkening |Ref|.
ramp = [0:65535]/65535;
ppconcave = spline([0 .1 .50  .72 .87 1],[0 .025 .25 .5 .75 1]);
Ybuf = ppval( ppconcave, ramp);
Lut16bit = uint16( round( 65535*Ybuf ) );
% Pass image |Ref| through a lookup table (LUT) to darken the image.
A = intlut(Ref,Lut16bit);

Просмотрите ссылочное изображение Ref и затемненное изображение A. Обратите внимание на то, что они имеют то же количество дискретных кодовых обозначений, но отличаются по полной яркости.

subplot(1,2,1)
imshow(Ref)
title('Ref: Reference Image')
subplot(1,2,2)
imshow(A)
title('A: Darkened Image');

Figure contains 2 axes objects. Axes object 1 with title Ref: Reference Image contains an object of type image. Axes object 2 with title A: Darkened Image contains an object of type image.

Сгенерируйте соответствующие гистограмме выходные изображения с помощью гистограмм с различным количеством интервалов. Сначала используйте количество по умолчанию интервалов, 64. Затем используйте количество значений, существующих в изображении A, 448 интервалов.

B16bit64 = imhistmatch(A(:,:,1),Ref(:,:,1));  % default: 64 bins

N = length(LevelsK);     % number of unique 16-bit code values in image A.
B16bitUniq = imhistmatch(A(:,:,1),Ref(:,:,1),N);

Просмотрите результаты двух операций соответствия гистограммы.

figure
subplot(1,2,1)
imshow(B16bit64)
title('B16bit64: 64 bins')
subplot(1,2,2)
imshow(Ref)
title(['B16bitUniq: ',num2str(N),' bins'])

Figure contains 2 axes objects. Axes object 1 with title B16bit64: 64 bins contains an object of type image. Axes object 2 with title B16bitUniq: 448 bins contains an object of type image.

Входные параметры

свернуть все

Введите изображение, которое будет преобразовано в виде 2D истинного цвета или полутонового изображения. Возвращенное изображение будет посещать урок типа данных входного изображения.

Типы данных: single | double | int16 | uint8 | uint16

Ссылочное изображение, гистограмма которого является ссылочной гистограммой в виде 2D истинного цвета или полутонового изображения. Ссылочное изображение обеспечивает равномерно распределенный nbins гистограмма ссылки интервала, который выходное изображение J попытка состоит в том, чтобы соответствовать.

Типы данных: single | double | int16 | uint8 | uint16

Количество равномерно распределенных интервалов в ссылочной гистограмме в виде положительного целого числа. В дополнение к определению количества равномерно распределенных интервалов в гистограмме для изображения refnbins также представляет верхний предел количества уровней дискретных данных, существующих в выходном изображении J.

Типы данных: double

Аргументы name-value

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: imhistmatch(I,ref,'Method','polynomial') совпадает с гистограммой изображения I к тому из ссылочного изображения ref использование метода отображения полинома.

Отображение метода раньше сопоставляло гистограмму ref отображать IВ виде разделенной запятой пары, состоящей из 'Method' и одно из этих значений:

  • 'uniform' — Используйте основанную на гистограмме функцию интенсивности и эквализацию гистограммы.

  • 'polynomial' — Вычислите кубическую функцию отображения Многочлена Эрмита от совокупных гистограмм источника и ссылочных изображений. Полиномиальный метод полезен, когда ссылочное изображение является более темным, чем входное изображение. В этой ситуации полиномиальный метод дает более сглаженный цветовой переход, чем универсальный метод.

Выходные аргументы

свернуть все

Выходное изображение, возвращенное как 2D истинный цвет или полутоновое изображение. Выходное изображение выведено из изображения I чья гистограмма является аппроксимированным соответствием к гистограмме входного изображения ref созданный с nbins равномерно распределенные интервалы. Отобразите J одного размера и тип данных как входное изображение I. Входной параметр nbins представляет верхний предел количества дискретных уровней, содержавшихся в изображении J.

Типы данных: single | double | int16 | uint8 | uint16

Количества гистограммы вывели из ссылочного изображения refВ виде вектора или матрицы. Когда ref изображение истинного цвета, hgram 3 nbins матрица. Когда ref полутоновое изображение, hgram 1 nbins вектор.

Типы данных: double

Алгоритмы

Цель imhistmatch должен преобразовать отображают I таким образом, что гистограмма изображения J совпадает с гистограммой, выведенной из изображения ref. Это состоит из nbins равномерно распределенные интервалы, которые охватывают полный спектр типа данных image. Последствием соответствия с гистограммами таким образом является тот nbins также представляет верхний предел количества уровней дискретных данных, существующих в изображении J.

Важный поведенческий аспект этого алгоритма, чтобы отметить то, что как nbins увеличения значения, степени быстрых колебаний между смежным заполненным peaks в гистограмме изображения J имеет тенденцию увеличиваться. Это видно в следующих графиках гистограммы, взятых из 16-битного полутонового примера MRI.

Оптимальное значение для nbins представляет компромисс между большим количеством уровней на выходе (большие значения nbins) при минимизации пиковых колебаний гистограммы (меньшие значения nbins).

Представленный в R2012b