Мне нужно отслеживать видеоизображение на основе цветных гистограмм. как этот пример https://en.wikipedia.org/wiki/Color_histogram#Example_1 - PullRequest
0 голосов
/ 11 января 2020

эй, я пытаюсь сделать цветную гистограмму на основе бинов, как в этом примере: https://en.wikipedia.org/wiki/Color_histogram#Example_1 на данный момент, я только что сделал для 3 бинов самостоятельно, но я хочу сделать для более чем 3.

    function H=my_hist(img)
SIZE=size(img);
H=[0 0 0;0 0 0;0 0 0];
for i=1:3
    H(:,:,i)=[0 0 0;0 0 0;0 0 0];%%the template
end
for row=1:SIZE(1)%%%%%the main function for calculating bins
    for col=1:SIZE(2)
        %%check the bin of color
            if(img(row,col,1)<(1/3))
                red=1;
            elseif(img(row,col,1)<(2/3))
                red=2;
            elseif(img(row,col,1)<=1)
                red=3;
            end
            if(img(row,col,2)<(1/3))
                green=1;
            elseif(img(row,col,2)<(2/3))
                green=2;
            elseif(img(row,col,2)<=1)
                green=3;
            end
            if(img(row,col,3)<(1/3))
                blue=1;
            elseif(img(row,col,3)<(2/3))
                blue=2;
            elseif(img(row,col,3)<=1)
                blue=3;
            end
            H(red,green,blue)=H(red,green,blue)+1;%%fill histogram of bins
    end
end
end

может видеть матрицу 3 * 3 * 3 для 3 лотков. Я думаю, что код будет очень длинным, если я сделаю это сам. спасибо за помощь

1 Ответ

0 голосов
/ 11 января 2020

Для сбора трехмерной гистограммы с 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...