Некоторое время назад я просмотрел код функции imresize
в MATLAB Image Processing Toolbox , чтобы создать упрощенную версию для интерполяции изображений только для ближайших соседей. Вот как это будет применяться к вашей проблеме:
%# Initializations:
scale = [2 2]; %# The resolution scale factors: [rows columns]
oldSize = size(inputImage); %# Get the size of your image
newSize = max(floor(scale.*oldSize(1:2)),1); %# Compute the new image size
%# Compute an upsampled set of indices:
rowIndex = min(round(((1:newSize(1))-0.5)./scale(1)+0.5),oldSize(1));
colIndex = min(round(((1:newSize(2))-0.5)./scale(2)+0.5),oldSize(2));
%# Index old image to get new image:
outputImage = inputImage(rowIndex,colIndex,:);
Другой вариант - использовать встроенную функцию interp2
, хотя вы упомянули, что не хотите использовать встроенные функции в одном из ваших комментариев.
РЕДАКТИРОВАТЬ: ОБЪЯСНЕНИЕ
В случае, если кому-то будет интересно, я подумал, что объясню, как работает решение выше ...
newSize = max(floor(scale.*oldSize(1:2)),1);
Сначала, чтобы получить новые размеры строк и столбцов, старые размеры строк и столбцов умножаются на коэффициент масштабирования. Этот результат округляется до ближайшего целого числа с floor
. Если коэффициент масштабирования меньше 1, вы можете получить странный случай, когда одно из значений размера равно 0, поэтому вызов max
позволяет заменить что-либо меньше 1 на 1 .
rowIndex = min(round(((1:newSize(1))-0.5)./scale(1)+0.5),oldSize(1));
colIndex = min(round(((1:newSize(2))-0.5)./scale(2)+0.5),oldSize(2));
Затем вычисляется новый набор индексов как для строк, так и для столбцов. Сначала вычисляется набор индексов для изображения с повышенной дискретизацией: 1:newSize(...)
. Каждый пиксель изображения считается имеющим заданную ширину, так что пиксель 1 охватывает от 0 до 1, пиксель 2 - от 1 до 2 и т. Д. Таким образом, «координата» пикселя рассматривается как центр, поэтому 0,5 вычитается из индексов. Эти координаты затем делятся на коэффициент масштабирования, чтобы получить набор координат центра пикселей для исходного изображения, к которым затем добавляется 0,5, и они округляются, чтобы получить набор целочисленных индексов для исходного изображения. Вызов min
гарантирует, что ни один из этих индексов не будет больше исходного размера изображения oldSize(...)
.
outputImage = inputImage(rowIndex,colIndex,:);
Наконец, новое изображение с повышенной дискретизацией создается путем простого индексирования исходного изображения.