
- •Содержание
- •Техническое задание
- •Анализ технического задания
- •2.1. Медианный фильтр. Медианная фильтрация
- •2.1.1 Достоинства и недостатки медианных фильтров
- •2.2 Принцип фильтрации.
- •2.3 Подавление статистических шумов
- •2.4 Импульсные и точечные шумы
- •2.5 Перепад плюс шум.
- •2.6 Фильтрация Винера
- •2.7. Фильтрация изображений.
- •2.7.1 Использование адаптивной фильтрации
- •2.7.2 Использование медианной фильтрации
- •3. Проектирование вспомогательной функции matlab
- •3.1. Считывание изображения и создание его копии.
- •3.2. Добавление шумов к копии исходного изображения.
- •3.3. Обработка зашумленной копии при помощи медианного фильтра.
- •3.4. Обработка зашумленной копии при помощи фильтра Винера %Обработка изображений фильтром Винера.
- •3.5. Расчет ско между фильтрованным изображением и оригиналом.
- •Результаты обработки
- •Список Литературы
3.4. Обработка зашумленной копии при помощи фильтра Винера %Обработка изображений фильтром Винера.
figure;
F1=wiener2(L1, [5 5]);
subplot(1,3,1), imshow(F1), title('winFilter_Gaussian');
F2=wiener2(L2, [5 5]);
subplot(1,3,2), imshow(F2), title('winFilter_Salt&Pepper');
F3=wiener2(L3, [5 5]);
subplot(1,3,3), imshow(F3), title('winFilter_Speckle');
% Тело функции wiener2
function [f,noise] = wiener2(varargin)
[g, nhood, noise] = ParseInputs(varargin{:});
classin = class(g);
classChanged = false;
if ~isa(g, 'double')
classChanged = true;
g = im2double(g);
end
localMean = filter2(ones(nhood), g) / prod(nhood);
localVar = filter2(ones(nhood), g.^2) / prod(nhood) - localMean.^2;
if (isempty(noise))
noise = mean2(localVar);
end
f = g - localMean;
g = localVar - noise;
g = max(g, 0);
localVar = max(localVar, noise);
f = f ./ localVar;
f = f .* g;
f = f + localMean;
if classChanged
f = changeclass(classin, f);
end
function [g, nhood, noise] = ParseInputs(varargin)
g = [];
nhood = [3 3];
noise = [];
wid = sprintf('Images:%s:obsoleteSyntax',mfilename);
switch nargin
case 0
msg = 'Too few input arguments.';
eid = sprintf('Images:%s:tooFewInputs',mfilename);
error(eid,'%s',msg);
case 1
g = varargin{1};
case 2
g = varargin{1};
switch numel(varargin{2})
case 1
noise = varargin{2};
case 2
nhood = varargin{2};
otherwise
msg = 'Invalid input syntax';
eid = sprintf('Images:%s:invalidSyntax',mfilename);
error(eid,'%s',msg);
end
case 3
g = varargin{1};
if (numel(varargin{3}) == 2)
% wiener2(I,[m n],[mblock nblock]) OBSOLETE
warning(wid,'%s %s',...
'WIENER2(I,[m n],[mblock nblock]) is an obsolete syntax.',...
'Omit the block size, the image matrix is processed all at once.');
nhood = varargin{2};
else
nhood = varargin{2};
noise = varargin{3};
end
case 4
warning(wid,'%s %s',...
'WIENER2(I,[m n],[mblock nblock],noise) is an obsolete syntax.',...
'Omit the block size, the image matrix is processed all at once.');
g = varargin{1};
nhood = varargin{2};
noise = varargin{4};
otherwise
msg = 'Too many input arguments.';
eid = sprintf('Images:%s:tooManyInputs',mfilename);
error(eid,'%s',msg);
end
if (ndims(g) == 3)
msg = 'WIENER2 does not support 3D truecolor images as an input.';
eid = sprintf('Images:%s:wiener2DoesNotSupport3D',mfilename);
error(eid,'%s',msg);
end
3.5. Расчет ско между фильтрованным изображением и оригиналом.
%Подсчет СКО
imwrite(I,'copie_image.tif');
L=imread('copie_image.tif');
j=1;
%Создание нулевых матриц
CKOGaus=zeros(1,50);
CKOSaPe=zeros(1,50);
CKOSpec=zeros(1,50);
CKOGausMed=zeros(1,50);
CKOSaPeMed=zeros(1,50);
CKOSpecMed=zeros(1,50);
CKOGausWin=zeros(1,50);
CKOSaPeWin=zeros(1,50);
CKOSpecWin=zeros(1,50);
%Создание условия наложения шума на изображение и его обработка с расчетом СКО.
for i=0.01:0.01:0.5;
L1=imnoise(L,'gaussian',0,i);
CKOGaus(j)=sqrt(sum(sum((L-L1).^2))/numel(L));
R1=medfilt2(L1);
F1=wiener2(L1, [5 5]);
CKOGausMed(j)=sqrt(sum(sum((L-R1).^2))/numel(L));
CKOGausWin(j)=sqrt(sum(sum((L-F1).^2))/numel(L));
L2=imnoise(L,'salt & pepper',i);
CKOSaPe(j)=sqrt(sum(sum((L-L2).^2))/numel(L));
R2=medfilt2(L2);
F2=wiener2(L2, [5 5]);
CKOSaPeMed(j)=sqrt(sum(sum((L-R2).^2))/numel(L));
CKOSaPeWin(j)=sqrt(sum(sum((L-F2).^2))/numel(L));
L3=imnoise(L,'speckle',i);
CKOSpec(j)=sqrt(sum(sum((L-L3).^2))/numel(L));
R3=medfilt2(L3);
F3=wiener2(L3, [5 5]);
CKOSpecMed(j)=sqrt(sum(sum((L-R3).^2))/numel(L));
CKOSpecWin(j)=sqrt(sum(sum((L-F3).^2))/numel(L));
j=j+1;
end
k=0.01:0.01:0.5;
figure;
hold on;
%Построение графиков
%plot(k,CKOGaus,'gx'); % График СКО шум от оригинала
plot(k,CKOGausMed,'gx'); %Вывод графиков окрашенного в зеленый цвет вид крестик
plot(k,CKOGausWin,'g');
%plot(k,CKOSaPe,'bx'); % График СКО шум от оригинала
plot(k,CKOSaPeMed,'bx'); %Вывод графиков окрашенного в синий цвет вид крестик
plot(k,CKOSaPeWin,'b');
%plot(k,CKOSpec,'rx'); %График СКО шум от оригинала
plot(k,CKOSpecMed,'rx'); %Вывод графиков окрашенного в красный цвет вид крестик
plot(k,CKOSpecWin,'r');