e e 458 project 002
TRANSCRIPT
PENNSYLVANIA STATE UNIVERSITY
Digital Image Processing Project 2 Using median filter theory to create a similar function
Chad Ryan Weiss 3/8/2016
Abstract: This report contains information on median filter theory as well as some of the basic MatLab functions and code (written by author) that demonstrates the practicality of such a digital image processing filter.
Theory: Median filtering is a common filtering technique used in digital image processing, often used to eliminate unwanted noise in any given image. This type of filter works best for removing salt & pepper noise (which basically consists of black and white specks appearing throughout the image). To operate, the filter must:
Create a square, odd-numbered matrix (mask or window). Fill the mask with the values from the original noisy image.
Calculate the median value of the mask.
Replace the centermost cell of the mask with the median. Proceed to the next row or column and repeat.
Figure 1: Median Filtering
If you refer to Fig. 1 shown above, you will notice that we begin with an image, an intensity matrix consisting of rows and columns each filled with pixel values used to designate the strength or magnitude of the color of the cell (top). Next you will see the mask, which is a square, three-by-three dimensional matrix that has focused itself upon one particular area within the image (center). The mask captures the values of the image and sorts them in ascending order into a data array, which can then be used to determine the median value of the mask (bottom). Once that has been completed, the median value will replace the center value of the mask which will imprint itself upon the original image thus completing the cycle. It will shift and repeat the same process until the entire image has been filtered. This is how the median filter operates.
MatLab: The code below shows a MatLab based computer program used to median filter a RGB color image. It takes no more than 180 seconds to filter a 1045-by-585-by-3 dimensional image.
% Name: Chad Weiss
% Date: March 8, 2016 % Instructor: Dr. Morales % Program: This program is a median filter
clear all
% Image I = imread('Focus.jpg'); Status = imfinfo('Focus.jpg'); % Noisy Image J = imnoise(I, 'salt & pepper', 0.1); figure; imshow(J); title('Noisy Image'); % Image Conversions Jhsv = rgb2hsv(J); Jhsv0 = [zeros(1,Status.Width,3);Jhsv;zeros(1,Status.Width,3)]; Jhsv0 = [zeros(Status.Height+2,1,3),Jhsv0,zeros(Status.Height+2,1,3)]; Jh = Jhsv0(:,:,1); Js = Jhsv0(:,:,2); Jv = Jhsv0(:,:,3); % Apply Filter for i = 1:Status.Height for j = 1:Status.Width mask = Jh(i:i+2,j:j+2); med = median(sort(transpose(single(mask(1:9))))); Jh(i+1,j+1) = med;
end end % Apply Filter for i = 1:Status.Height for j = 1:Status.Width mask = Js(i:i+2,j:j+2); med = median(sort(transpose(single(mask(1:9))))); Js(i+1,j+1) = med; end end % Apply Filter for i = 1:Status.Height for j = 1:Status.Width mask = Jv(i:i+2,j:j+2); med = median(sort(transpose(single(mask(1:9))))); Jv(i+1,j+1) = med; end end F = hsv2rgb(cat(3,Jh,Js,Jv)); figure; imshow(F); title('Filtered Image');
You can see the results on the following page.
The code used above was written by the author of this report. There are functions in
MatLab that perform similar operations such as the medfilt2 function. See the code
below for a demonstration of this function.
clear all % Image I = imread('Focus.jpg'); Status = imfinfo('Focus.jpg'); % Noisy Image J = imnoise(I, 'salt & pepper', 0.1); figure; imshow(J); title('Noisy Image'); % Image Conversions Jhsv = rgb2hsv(J); Jhsv0 = [zeros(1,Status.Width,3);Jhsv;zeros(1,Status.Width,3)]; Jhsv0 = [zeros(Status.Height+2,1,3),Jhsv0,zeros(Status.Height+2,1,3)]; Jh = Jhsv0(:,:,1); Js = Jhsv0(:,:,2); Jv = Jhsv0(:,:,3); % Apply Filters Ih = medfilt2(Jh); Is = medfilt2(Js); Iv = medfilt2(Jv); % Image Conversions output = hsv2rgb(cat(3, Ih,Is,Iv)); % Display Image figure; imshow(output); title('Filtered Image');
You can see that the image has been filtered from the original in Fig. 2; however, Fig. 3
appears to have a much better filter than Fig. 4.
Figure 4: Filtered Image (using medfilt2)
Analysis/Observations:
Upon coding the filter, it was noticed that the filtering techniques (both MatLab’s and the
author’s) were ineffective against three dimensional images; i.e., images including height,
width and depth, suggesting multiple planes. To overcome this challenge it was necessary
to convert the RGB (Red, Green, Blue) image into HSV (Hue, Saturation, Value) format;
furthermore, it was necessary to create variables holding the individual planes H, S and V,
for they are only two dimensional images containing height and width. After isolating the
planes, it was possible to apply the filters individually (to H, S and V), eliminating any
unwanted noise. Lastly, to recombine the three, two-dimensional filtered images into a
three-dimensional filtered image, we simply concatenated the three planes and converted
it back to RGB format.
Conclusion:
In conclusion, the hand-written median filter took about three minutes to run. In
comparison, the pre-installed, built-in MatLab functions took only about three seconds to
run; however, the quality of the image is much better the first time around for the hand-
written version. For an explanation of the code, please refer to Appendix A.
Appendix A: Code
Variables
If you refer to Fig. 5, you will see the list of variables used
in running the median filter computer program.
I: This variable contains the original image.
J: This variable contains the noisy image.
Figure 5: List of Variables
Jhsv: This variable contains the hsv noisy image.
Jhsv0: This variable contains the hsv noisy image w/ a zero border (1 pixel black border).
Jh: This variable contains the h-plane image of the Jhsv0 image.
Js: This variable contains the s-plane image of the Jhsv0 image.
Jv: This variable contains the v-plane image of the Jhsv0 image.
Status: This variable contains the original image I information.
mask: This variable is the 3x3x3 dimensional mask used in filtering the noisy images.
med: This variable contains the median value of the mask.
i: This is a row counter variable.
j: This is a column counter variable.
F: This variable contains the filtered image.
Functions:
imread(_): Reads-in an image
imfinfo(_): Reads-in image information
imshow(_): Displays an image
imnoise(_): Adds noise to an image
rgb2hsv(_): Converts a RGB image to HSV format
hsv2rgb(_): Converts a HSV image to RGB format
single(_): Converts data to the datatype single
transpose(_): Transposes matrices
sort(_): Sorts any matrix or array in ascending order
median(_): Determines the median value of any matrix or array
cat(_): Concatenates arrays
help: See above