Заявление о проблеме: -
Для поиска в окне возможных смещений (вы будете искать [-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
Заданное входное изображение -
Требуемый вывод изображения-
Я сделал это до сих пор и получаю почти такой же вывод, как требуется, но компиляторпоказывает неправильное значение для ColorImg_aligned.
Что не так с моим кодом.Я новичок в 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