Выравнивание каналов RGB (с использованием SSD) данного изображения для получения цветного и правильно выровненного и четкого изображения - PullRequest
0 голосов
/ 10 июля 2019

Заявление о проблеме: -
Для поиска в окне возможных смещений (вы будете искать [-10,10] пикселей), оцените каждое из них, используя некоторую метрику соответствия изображения, и возьмитесмещение с лучшим счетом.Самым простым из них является расстояние суммы квадратов разностей (SSD), которое просто вычитает одну область изображения из другой и оценивает сумму квадратов значений в каждом пикселе.Необходимо выполнить расчеты на основе SSD для областей изображения двойного типа.
Поскольку каналы R, G, B имеют высокую корреляцию друг с другом, метрика SSD с большой вероятностью будет работать.Ваша задача - удерживать канал G в качестве эталона, перемещаться по нему по каналам R и B и отслеживать значение SSD для областей изображения 51x51 в центре каналов.Для каждого канала вы найдете вектор смещения (x, y), который дает минимальное значение SSD.

Программа должна разделить изображение на три равные части.
Первое изображение - Синий канал,второй канал - зеленый, последний - канал красный.Вы должны назвать свои переменные, как показано ниже:

Изображение синего канала - B
Изображение зеленого канала - G
Изображение красного канала - R

Эталонный зеленый участок центрального канала (51x51) -
ref_img_region (центр этой области совпадает с центром изображения, а индексы всегда являются целыми числами) Окончательно выровненное изображение - ColorImg_aligned
Заданное входное изображение -
The given image is -

Требуемый вывод изображения- Required output image



Я сделал это до сих пор и получаю почти такой же вывод, как требуется, но компиляторпоказывает неправильное значение для ColorImg_aligned.
compiler message
Что не так с моим кодом.Я новичок в Matlab.Извините, если код не эффективен.

%Read the image
img = imread('course1image.jpg');
[r,c] = size(img);

B = img(1:r/3,:);
G = img((r/3)+1:(2*r/3),:);
R = img((2*r/3)+1:r,:);

ref_img_region = G;
[rg,cg] = size(ref_img_region);
ref_img_region = ref_img_region(ceil((rg-50)/2) :ceil((rg-50)/2) + 50,ceil((cg-50)/2) :ceil((cg-50)/2) + 50);
%disp(size(ref_img_region));
ref_img_region = double(ref_img_region);

% Naive way
% ColorImg_aligned = cat(3,R,G,B);
% imshow(ColorImg_aligned);

% SSD way
nR = align(G,R);
nB = align(G,B);
ColorImg_aligned = cat(3,nR,G,nB);
imshow(ColorImg_aligned);


function aligned = align(green,red)
    [red_row,red_col] = size(red);
    [green_row,green_col] = size(green);

    % checking SSD for cropped part of the images for faster calculation 
    cropped_red = red(ceil((red_row-50)/2) : ceil((red_row-50)/2) + 50,ceil((red_col-50)/2) :ceil((red_col-50)/2) + 50);
    cropped_green = green(ceil((green_row-50)/2) : ceil((green_row-50)/2) + 50,ceil((green_col-50)/2) :ceil((green_col-50)/2) + 50);

    MiN = 9999999999;
    r_index = 0;
    r_dim = 1;
    for i = -10:10
        for j = 1:2
            ssd =     SSD(cropped_green,circshift(cropped_red,i,j));
            if ssd < MiN
                MiN = ssd;
                r_index = i;
                r_dim = j;
            end
        end
    end
    aligned = circshift(red,r_index,r_dim);
end       

function ssd = SSD(a1,a2)
    x = double(a1)-double(a2);
    ssd = sum(x(:).^2);
end       

1 Ответ

0 голосов
/ 11 июля 2019

Наконец я смог выполнить задание.
Я только что изменил

Y = круговое смещение (A, K, затемнение)

версия кругового смещения на

Y = круговое смещение (A, [i, j])

Я все еще делаюто же самое, но компилятор принял ответ на этот раз.
У кого-нибудь есть мысли о том, почему это произошло?

После модификации код выглядит следующим образом.
%Read the image
img = imread('course1image.jpg');
[r,c] = size(img);

B = img(1:r/3,:);
G = img((r/3)+1:(2*r/3),:);
R = img((2*r/3)+1:r,:);

ref_img_region = G;
[rg,cg] = size(ref_img_region);
ref_img_region = ref_img_region(ceil((rg-50)/2) :ceil((rg-50)/2) + 50,ceil((cg-50)/2) :ceil((cg-50)/2) + 50);
%disp(size(ref_img_region));
ref_img_region = double(ref_img_region);

% Naive way
% ColorImg_aligned = cat(3,R,G,B);
% imshow(ColorImg_aligned);

% SSD way
nR = align(G,R);
nB = align(G,B);
ColorImg_aligned = cat(3,nR,G,nB);
imshow(ColorImg_aligned);


function aligned = align(green,red)
    [red_row,red_col] = size(red);
    [green_row,green_col] = size(green);

    % checking SSD for cropped part of the images for faster calculation 
    cropped_red = red(ceil((red_row-50)/2) : ceil((red_row-50)/2) + 50,ceil((red_col-50)/2) :ceil((red_col-50)/2) + 50);
cropped_green = green(ceil((green_row-50)/2) : ceil((green_row-50)/2) + 50,ceil((green_col-50)/2) :ceil((green_col-50)/2) + 50);

    MiN = 9999999999;
    r_index = 0;
    r_dim = 1;
    % Modifications
    for i = -10:10
        for j = -10:10
            ssd =     
SSD(cropped_green,circshift(cropped_red,[i,j])); %circshift(A,[i,j])
            if ssd < MiN
                MiN = ssd;
                r_index = i;
                r_dim = j;
            end
        end
    end
    aligned = circshift(red,[r_index,r_dim]);
end       

function ssd = SSD(a1,a2)
    x = double(a1)-double(a2);
    ssd = sum(x(:).^2);
end 

Вывод

enter image description here

...