Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧиРкОв.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.26 Mб
Скачать

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');