MATLAB--Цифровая обработка изображений Уменьшение изображения

MATLAB

«Это 13-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г."

предисловие

Привет! Приятель!

Большое спасибо за прочтение статьи Haihong.Если в статье есть какие-либо ошибки, вы можете указать на них~

 

Самостоятельное введениеଘ(੭ˊᵕˋ)੭

Прозвище: Хайхун

Ярлыки: Программисты|С++ игроки|Студенты

Введение: Я познакомился с программированием благодаря языку C, а затем перевелся на компьютерную специальность, мне посчастливилось получить несколько национальных и провинциальных наград. Сейчас изучаю C++/Linux/Python

Опыт обучения: прочная основа + больше заметок + больше кодирования + больше размышлений + хорошее изучение английского языка!

уменьшение изображений

определение: Сжатие изображения обычно называют увеличением и сокращением, а в цифровой обработке изображений это относится к увеличению и уменьшению пикселей. как 2Изображение 2 с 4 пикселями, увеличенное вдвое, тогда есть 44=16 пикселей.

Итак, как уменьшить изображение?

Вот пример увеличения: изображение, увеличенное вдвое, означает, что ширина и высота изображения увеличены вдвое, то есть общее количество пикселей в четыре раза больше исходного. Итак, как увеличить пиксели, сохранив содержимое изображения без изменений? Это тоже просто.Например, красный круг изначально представлен 4 пикселями (4 одинаковыми пикселями), а сдвоенный круг представлен 16 пикселями (тоже одинаковыми). такая же графика. Изначально нужно было 4, теперь нужно 16.

Конечно, фрагмент над случайным изображением представлен несколькими разными пикселями, так как же увеличить количество пикселей без изменения графики? Это будет рассчитано интерполяцией. Например, если дорога в гору должна быть увеличена (посередине), она должна быть заполнена посередине с той же высотой, что и две стороны, чтобы первоначальный уклон также был непрерывным, а первоначальная непрерывность сохранялась. Следовательно, целью интерполяции является сохранение согласованности исходного изображения путем заполнения пикселей, что аналогично сохранению непрерывности после изменения большого числа. Следующий рисунок представляет собой описание метода интерполяции:在这里插入图片描述 在这里插入图片描述Псевдокод для алгоритма:在这里插入图片描述

Мое понимание:Например, размер исходного изображения 300400, увеличенное вдвое, становится 600800; точка (1,2) на исходном изображении соответствует (2,4) на увеличенном изображении. Это должно быть легче понять.

При программировании мы сначала строим пустую матрицу для увеличения изображения, а затем по очереди заполняем значения. Это требует, чтобы мы знали координаты точки на увеличенном изображении, вычисляли координаты исходного изображения, а затем присваивали координаты исходного изображения новой точке.

Здесь используется идея пропорциональности.Например, по оси абсцисс увеличенное изображение равно 2, что составляет 2/600 от общей длины 600. Тогда координата абсцисс исходного изображения также составляет 2/600 оси x, которая рассчитывается как 1. Предположим, что (x1, y1) — значение увеличенного изображения, (x0, y0) — значение исходного изображения, m, n — длина по горизонтали и вертикали исходного изображения, rm, rn — длина по горизонтали и вертикали. длины увеличенного изображения.

Существуют следующие отношения:

x1/rm=x0/m y1/rn=y0/n

Можно сделать вывод, что:

x0=x1m/rm y0=y1n/rn

Наконец, используйте метод билинейной интерполяции для интерполяции. Код здесь такой (на самом деле он состоит в том, чтобы отдельно найти окружающие 4 точки, использовать разные функции значений, а затем вычислить):

rt(i,j,:)=t(floor(x),floor(y),:)*(1-u)*(1-v)+t(floor(x),ceil(y),:)*(1-u)*v+t(ceil(x),ceil(y),:)*(u)*(1-v)+t(ceil(x),ceil(y),:)*u*v;

Полный код:

 t=imread('a1.jpg');
[m,n,dep]=size(t);
%自定义长 宽 
rm=1400;
rn=822;

%构造新矩阵 存储收缩后的图片
rt=zeros(rm,rn,dep);

for i=1:rm
for j=1:rn
%坐标转换
x=i*m/rm;
y=j*n/rn;
%求出偏移量
u=x-floor(x);
v=y-floor(y);
%边缘处理
if x<1
x=1;
end
if y<1
y=1;
end
%双线性插值
rt(i,j,:)=t(floor(x),floor(y),:)*(1-u)*(1-v)+t(floor(x),ceil(y),:)*(1-u)*v+t(ceil(x),ceil(y),:)*(u)*(1-v)+t(ceil(x),ceil(y),:)*u*v;
end
end


imshow(t);title('原图');
figure;imshow(uint8(rt));title('加倍后的图片');