pr1
.docxМинистерство цифрового развития, связи и массовых коммуникаций
Российской Федерации
Федеральное государственное бюджетное образовательное
учреждение высшего образования
«Санкт-Петербургский государственный университет телекоммуникаций
им. проф. М. А. Бонч-Бруевича»
_____________________________________________________________________________
Кафедра РАДИОТЕХНИКИ
Дисциплина «Технологии распознавания изображений и компьютерное зрение»
Практическая работа №1
«Обработка изображений»
Выполнили: студенты группы РТ-22,
бригада № 6
Спица М.А.
Стулин П.А.
Сараева Л.В.
Швецов Ф.П.
Проверил: к.т.н. доцент каф. РТ,
Коровин К.О.
________________________
Санкт-Петербург
2026
Задание 1: Корректировка низкоконтрастного изображения
Цель: Откорректировать низкоконтрастное изображение при помощи встроенных функций и используя CDF.
Теория:
Функция IPT imhist отображает гистограмму изображения, где ось x обозначает диапазон уровней интенсивности серого от 0 до 255, а ось y обозначает количество пикселей, относящихся к каждому уровню интенсивности серого.
Выравнивание
гистограммы - это процесс растягивания
гистограммы таким образом, чтобы она
охватывала весь диапазон от 0 до 255.
Значение цветопередачи в серых тонах
может быть скорректировано, если
гистограмму можно растянуть по всему
диапазону значений, и это называется
тональной коррекцией изображений. Если
L
— это общее количество уровней серого
(обычно 256), а k
- определенный уровень интенсивности,
то значение гистограммы h(k)
для уровня k,
т.е. общее количество пикселей, появляющихся
для уровня k
после выравнивания, определяется
следующим образом:
Листинг кода в MATLAB:
%%% Задание 1: откорректировать низкоконтрастное изображение
%%% По встроенным функциям
a=imread('lubimi_prepodavatel.jpg');
a=rgb2gray(a);
c=imadjust(a);
d=histeq(a);
%%% Теоретический расчет
amax=max(max(a));
r=0:amax;
L=256;
N=length(a)*length(a');
[counts, edges]=histcounts(a);
[countsd, edgesd]=histcounts(d);
[countsc, edgesc]=histcounts(c);
CDF1=cumsum(counts);
CDF1norm=CDF1/max(CDF1);
CDFd=cumsum(countsd);
CDFdnorm=CDFd/max(CDFd);
CDFc=cumsum(countsc);
CDFcnorm=CDFc/max(CDFc);
[testcounts,test] = imhist(a);
CDF=cumsum(testcounts);
h=round((CDF-min(CDF(CDF>0)))/(N-min(CDF(CDF>0)))*(L-1));
hman=uint8(h(double(a+1)));
[countsism, edgesism]=histcounts(hman);
CDFism=cumsum(countsism);
CDFismnorm=CDFism/max(CDFism);
%%% Графики
figure(10)
subplot(3,4,1); imshow(a); title('До коррекции')
subplot(3,4,2); imshow(d); title('После коррекции (histeq)')
subplot(3,4,3); imshow(c); title('После коррекции (imadjust)')
subplot(3,4,4); imshow(hman); title('После коррекции (Теор.)')
subplot(3,4,5); imhist(a); title('Гистограмма до коррекции')
subplot(3,4,6); imhist(d); title('Гистограмма до коррекции')
subplot(3,4,7); imhist(c); title('Гистограмма после коррекции (histeq)')
subplot(3,4,8); imhist(hman); title('Гистограмма после коррекции (Теор.)')
subplot(3,4,9); stairs(edges(2:end),CDF1norm); xlim([0 L-1]); ylim([0 max(CDF1norm)]); title('CDF До коррекции')
subplot(3,4,10); stairs(edgesd(2:end),CDFdnorm); xlim([0 L-1]); ylim([0 max(CDFdnorm)]); title('CDF после коррекции (histeq)')
subplot(3,4,11); stairs(edgesc(2:end),CDFcnorm); xlim([0 L-1]); ylim([0 max(CDFcnorm)]); title('CDF после коррекции (imadjust)')
subplot(3,4,12); stairs(edgesism(2:end),CDFismnorm); xlim([0 L-1]); ylim([0 max(CDFismnorm)]); title('CDF после коррекции (Теор.)')
Рис.1 Результат работы скрипта
Задание 2: Размытие выделенной части исходного изображения
Цель работы: Изучения пространственной фильтрации
Теория:
Для размытия изображения используется пространственная фильтрация. Для получения размытого изображения реализуется ФНЧ при помощи пространственной свертки маски размером 3х3,11х11,31х31 изображения
Листинг кода в MATLAB:
%%%%%%%%%%% Задание 2: Размытие изображение %%%%%%%%%%%%%%%%%
a=imread('lubimi_prepodavatel2.jpg');
a=rgb2gray(a);
figure(20)
[subImage, rect] = imcrop(a); % Появится курсор для выделения
imshow(subImage);
virez=double(subImage);
x1=fix(rect(2));
y1=fix(rect(2))+fix(rect(4));
x2=fix(rect(1));
y2=fix(rect(1))+fix(rect(3));
for i=2:size(virez,1)-1
for ii=2:size(virez,2)-1
svertka=conv2(virez(i-1:i+1,ii-1:ii+1),ones(3),'same');
svertkasr(i-1,ii-1)=svertka(2,2)/9;
end
end
svr1=uint8(svertkasr);
for i=6:size(virez,1)-5
for ii=6:size(virez,2)-5
svertka1=conv2(virez(i-5:i+5,ii-5:ii+5),ones(11),'same');
svertkasr1(i-5,ii-5)=svertka1(6,6)/121;
end
end
svr2=uint8(svertkasr1);
for i=16:size(virez,1)-15
for ii=16:size(virez,2)-15
svertka2=conv2(virez(i-15:i+15,ii-15:ii+15),ones(31),'same');
svertkasr2(i-15,ii-15)=svertka2(16,16)/961;
end
end
svr3=uint8(svertkasr2);
aism1=a;
aism2=a;
aism3=a;
aism1(x1+1:y1-1,x2+1:y2-1)=svr1;
aism2(x1+5:y1-5,x2+5:y2-5)=svr2;
aism3(x1+15:y1-15,x2+15:y2-15)=svr3;
%%% Графики
figure(20)
subplot(1,4,1); imshow(a); title('Исходная')
subplot(1,4,2); imshow(aism1); title('3x3')
subplot(1,4,3); imshow(aism2); title('11x11')
subplot(1,4,4); imshow(aism3); title('31x31')
Рис.2 Результат работы скрипта
Задание 3: Применение Лапласиана с ядрами 4 и 8
Листинг кода в MATLAB:
%%%%%%%%%%% Задание 3: Лапласиан с ядрами 4 и 8 %%%%%%%%%%%
a=imread('lubimi_prepodavatel3.jpg');
a=rgb2gray(a);
a1=double(a);
mx1=[0 -1 0; -1 4 -1; 0 -1 0];
mx2=[-1 -1 -1; -1 8 -1; -1 -1 -1];
%% Ядро 4
svertka3=conv2(a1,mx1,'same'); %% Свертка маски с изображением
svrt1=uint8(svertka3);
aitog1=a+svrt1; %% Сложение свертки с исходным изображением
%% Ядро 8
svertka4=conv2(a1,mx2,'same'); %% Свертка маски с изображением
svrt2=uint8(svertka4);
aitog2=a+svrt2; %% Сложение свертки с исходным изображением
%%% Графики
figure(30)
subplot(1,3,1); imshow(a); title('Исходная')
subplot(1,3,2); imshow(aitog1); title('Ядро 4')
subplot(1,3,3); imshow(aitog2); title('Ядро 8')
Рис.3 Результат работы скрипта
Задание 4: Применение нерезкого маскирования
Листинг кода в MATLAB:
%%%%%%%%%%% Задание 4: Нерезкое маскирование %%%%%%%%%%%%%%
a=imread('lubimi_prepodavatel2.jpg');
a=rgb2gray(a);
for i=16:size(a,1)-15
for ii=16:size(a,2)-15
svertka5=conv2(a(i-15:i+15,ii-15:ii+15),ones(31),'same');
svertkasr5(i-15,ii-15)=svertka5(16,16)/961;
end
end
svrt3=uint8(svertkasr5);
svrtdop3=padarray(svrt3,[(size(a,1)-size(svrt3,1))/2, (size(a,1)-size(svrt3,1))/2], 0, 'both');
aitog3=a-svrtdop3;
aitog4=aitog3+a;
%%% Графики
figure(40)
subplot(1,4,1); imshow(a); title('Исходная')
subplot(1,4,2); imshow(svrt3); title('Размытое')
subplot(1,4,3); imshow(aitog3); title('Маска')
subplot(1,4,4); imshow(aitog4); title('Нерезкое маскирование')
Рис.4 Результат работы скрипта
