Borrar filtros
Borrar filtros

HOW TO APPLY A MEAN FILTER FOR 3x3

34 visualizaciones (últimos 30 días)
ajith
ajith el 27 de Sept. de 2012
Comentada: DGM el 10 de Feb. de 2023
I NEED TO APPLY THE 3x3 MEAN FILTER TO THE GRAY SCALE IMAGE. PLS SEND ME THE CODE FOR THAT

Respuesta aceptada

Wayne King
Wayne King el 27 de Sept. de 2012
How about just:
h = 1/3*ones(3,1);
H = h*h';
% im be your image
imfilt = filter2(H,im);
  6 comentarios
Walter Roberson
Walter Roberson el 10 de Feb. de 2023
Check class() of the input image and class() of the output image. I suspect that class of the output is double and that you would get what you want if you uint8() that.
DGM
DGM el 10 de Feb. de 2023
What is the class and scale of the input and output? The rendering of an image depends on an assumption of where white and black are. Floating-point images are expected to be unit-scale (i.e. 0-1). If you're using the above code, then it will be uint8-scale (0-255)
% this is a uint8 image
im = imread('cameraman.tif');
% create filter
h = 1/3*ones(3,1);
H = h*h';
% the output of this will be class 'double', but scaled as if uint8
imfilt = filter2(H,im);
% cast it to a class appropriate for its scale
imfilt = uint8(imfilt);
% display it
imshow(imfilt)
See also:

Iniciar sesión para comentar.

Más respuestas (5)

Image Analyst
Image Analyst el 27 de Sept. de 2012
filteredImage = conv2(single(grayscaleImage), ones(3)/9);
  7 comentarios
Ridho Liwardana
Ridho Liwardana el 23 de Mzo. de 2022
It's depend of matrix that you wanna use as filter, if it's a 3x3 matrix, the value is 1/(3x3) -> 1/9.
Image Analyst
Image Analyst el 23 de Mzo. de 2022
@SP The reason you divide by windowWidth^2 (1/9 in this case) is because if you don't, the filtering is the sum of the filter window times the image to be filtered. So if the image were all 255 under the filter, you'd get an output value of 9*255 instead of 255. So the image would be 9 times as bright. To ensure that the filtered image lies in the same intensity range as the original image, you need to divide the filter values by windowWidth^2.
If you didn't have a uniform filter (like here where they are all 1's) you'd have to divide by the sum of the kernel:
% Divide unnormalized kernel by the sum of the values in it.
% This will ensure the output image has the same intensity range as the original.
kernel = kernel / sum(kernel(:));
outputImage = imfilter(grayImage, kernel);
Actually, that is the most general approach which will work for any filter.

Iniciar sesión para comentar.


Mohamed Batran
Mohamed Batran el 11 de Jul. de 2015
thank you for your reply simple but helped a lot for customizing the filter i want

Celal Can Elgün
Celal Can Elgün el 24 de Oct. de 2015
How can we make it without using filter2(or any command) ?

Geetha raja
Geetha raja el 19 de Ag. de 2018
I NEED TO APPLY THE bilateral FILTER TO THE GRAY SCALE IMAGE for denoising. PLS SEND ME THE CODE FOR THAT
  1 comentario
Image Analyst
Image Analyst el 19 de Ag. de 2018
Geetha, there is a part of the web site called "File Exchange". You can look there for community-contributed programs: Search for bilateral filter

Iniciar sesión para comentar.


Jahid Hasan
Jahid Hasan el 19 de Abr. de 2022
Sorry to ask here, how to write mean and median filter without using a in-built function? What are the way to do it? Any help or code syntax. Thank you
  4 comentarios
Walter Roberson
Walter Roberson el 19 de Abr. de 2022
Potential reference implementation. Not tested.
sum_of_elements = 0;
index_of_element = 0;
while true
index_of_element = index_of_element + 1;
try
sum_of_elements = sum_of_elements + YourVector(index_of_element);
catch ME
break; %we ran off the end of the array
end
end
number_of_elements = index_of_element - 1; %loop over-counts by 1
mean_of_YourVector = sum_of_elements ./ number_of_elements;
sorted_vector = bogosort(YourVector, number_of_elements);
index_of_element = 0;
while true
index_of_element = index_of_element + 1;
if index_of_element + index_of_element == number_of_elements
median_of_YourVector = YourVector(index_of_element);
break
elseif index_of_element + index_of_element + 1 == number_of_elements
median_of_YourVector = (YourVector(index_of_element) + YourVector(index_of_element+1)) / 2;
break
end
end
function sortedVector = bogosort(vectorToSort, number_of_elements)
%this is a legitimate sort
while true
neworder = randperm(number_of_elements);
sortedVector = vectorToSort(neworder);
index_of_element = 0;
while true
index_of_element = index_of_element + 1;
if index_of_element >= number_of_elements
%we got to the end of the list without detecting out-of-order
return;
end
if YourVector(index_of_element) > YourVector(index_of_element+1)
%detected something out of order, try again with a new order
break
end
end
end
end

Iniciar sesión para comentar.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by