Для сбора трехмерной гистограммы с n
x n
x n
бинами можно использовать следующие этапы:
- Дискретизация значений RGB до
n
уровней каждый.
Пример : для n
= 4 все значения будут 0, 1, 2 или 3. - Преобразовать дискретизированный RGB в 2D-изображение, каждый элемент эквивалентен di git в "base n".
Представьте, что это трехзначное число в десятичном виде, например:
Получение 375 из цифр 3, 7, 5, когда 3 - это MSD (наиболее значимое значение di git), а 5 - это LSD (наименее значимое число *) 1041 *). - Соберите гистограмму 2D-изображения, используя histcounts Функция MATLAB.
Соберите гистограмму с помощью n ^ 3 бинов. - Измените собранную гистограмму в
n
x n
x n
3D матрицу.
Вот пример кода:
RGB = imread('peppers.png');
RGB = double(RGB)/256; %Convert image from uint8 to double (range [0, 0.9961]).
n = 3; %Number of histogram bins.
%Discretize: 1/n lowr elements goes to zero, next 1/n elements goes 1 next 1/n elements goes 2...
%The following formula applies uniform quantization, when range RGB is [0, 0.9999].
dRGB = floor(RGB * n); %In case of n = 3, discretizedRGB elements are going to be 0, 1, 2 (and 3)
%Convert dRGB to 2D image, each element is equivalent to digit in "base n".
%Think about is a three digits number in decimal base like:
%Getting 375 from the digits 3, 7, 5, when 3 is the MSD (most significant digit) and 5 is the LSD (least significant digit).
%I = dRGB(:,:,1) * n^2 + dRGB(:,:,2) * n + dRGB(:,:,3); %Take red as MSD
I = dRGB(:,:,1) + dRGB(:,:,2) * n + dRGB(:,:,3) * n^2; %Take blue as MSD
%Collect histogram of 2D image, with n^3 bins
H = histcounts(I(:), n^3);
%Reshape histogram to 3D matrix.
H3 = reshape(H, [n, n, n]);
%Check if result is equal to result of my_hist
if n == 3
refH3 = my_hist(RGB);
all(H3(:) == refH3(:))
end
Как видно, при n = 3 результат равен вашему результату реализации.
Примечание: Сбор гистограммы 3D не очень полезен.
В большинстве случаев вам нужно собирать отдельные гистограммы для каждого цветового канала:
R = RGB(:, :, 1);
G = RGB(:, :, 2);
B = RGB(:, :, 3);
rH = histcounts(R(:), n); %Red channel histogram
gH = histcounts(G(:), n); %Green channel histogram
bH = histcounts(B(:), n); %Blue channel histogram
И в некоторых случаях гистограмма яркости:
Gray = rgb2gray(RGB);
grayH = histcounts(Gray(:), n); %Histogram of Grayscale equivalent image.