function varargout = mine(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @mine_OpeningFcn, ...
'gui_OutputFcn', @mine_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before mine is made visible.
function mine_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
function varargout = mine_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
% 选择文件
function pushbutton1_Callback(hObject, eventdata, handles)
[filename,pathname]=uigetfile({'*.jpg','ALLFILES(*.*)'},'选择图像文件');
if isequal([filename pathname],[0,0])
return;
end
global I;
I= imread(filename);
% 显示原图
function pushbutton3_Callback(hObject, eventdata, handles)
global I;
axes(handles.axes1);
imshow(I);
% 灰度图像
function pushbutton9_Callback(hObject, eventdata, handles)
global I;
global gmap;
gmap = rgb2gray(I);
axes(handles.axes1);
imshow(gmap);
% 选择噪声按钮组
function uibuttongroup2_SelectionChangedFcn(hObject, eventdata, handles)
global noise_value;
noise_value = 1;
switch get(hObject,'Tag')%判断按钮组下被选中的按钮标签
case 'radiobutton4'
noise_value = 1;
case 'radiobutton5'
noise_value = 2;
case 'radiobutton6'
noise_value = 3;
otherwise
end
% 获取滑块值.
function slider2_Callback(hObject, eventdata, handles)
global sliderValue;
sliderValue = get(hObject, 'Value')
%添加噪声函数
function add_noise()
global gmap;
global noise_value;
global J;
global sliderValue;
switch noise_value
case 1
J=imnoise(gmap,'gaussian',sliderValue*100,1);%添加高斯白噪声,均值为 m,方差为 0.01
case 2
J=imnoise(gmap,'salt & pepper',sliderValue*0.1);%添加椒盐噪声,噪声密度为 0.02。这会影响大约 2% 的像素。
case 3
J=imnoise(gmap,'speckle');%使用方程 J = I+n*I 添加乘性噪声,其中 n 是均值为 0、方差为 0.05 的均匀分布随机噪声。
otherwise
end
%加噪后图像
function pushbutton5_Callback(hObject, eventdata, handles)
add_noise();
global J;
axes(handles.axes2);
imshow(J);
% 选择滤波按钮组
function uibuttongroup1_SelectionChangedFcn(hObject, eventdata, handles)
global Filter_value;
Filter_value = 1;
switch get(hObject,'Tag')%判断按钮组下被选中的按钮标签
case 'radiobutton1'
Filter_value = 1;
case 'radiobutton2'
Filter_value = 2;
case 'radiobutton3'
Filter_value = 3;
otherwise
end
%中值滤波器
function filteredImage = medianFilter(inputImage, filterSize)
% 检查输入图像是否为灰度图像
if size(inputImage, 3) == 3
error('Input image must be a grayscale image');
end
% 获取输入图像的尺寸
[rows, cols] = size(inputImage);
% 初始化输出图像
filteredImage = zeros(rows, cols, 'uint8');
% 计算滤波器的边界
padSize = floor(filterSize / 2);
% 对输入图像进行边缘填充
paddedImage = padarray(inputImage, [padSize padSize], 'replicate', 'both');
% 应用中值滤波
for i = 1:rows
for j = 1:cols
% 提取当前像素周围的区域
window = paddedImage(i:i+2*padSize, j:j+2*padSize);
% 计算中值并更新输出图像
filteredImage(i, j) = median(window(:));
end
end
%均值滤波器
function filteredImage = meanFilter(inputImage, filterSize)
% 检查输入图像是否为灰度图像
if size(inputImage, 3) == 3
error('Input image must be a grayscale image');
end
% 获取输入图像的尺寸
[rows, cols] = size(inputImage);
% 初始化输出图像
filteredImage = zeros(rows, cols, 'uint8');
% 计算滤波器的边界
padSize = floor(filterSize / 2);
% 对输入图像进行边缘填充
paddedImage = padarray(inputImage, [padSize padSize], 'replicate', 'both');
% 应用均值滤波
for i = 1:rows
for j = 1:cols
% 提取当前像素周围的区域
window = paddedImage(i:i+2*padSize, j:j+2*padSize);
% 计算平均值并更新输出图像
filteredImage(i, j) = mean(window(:));
end
end
%高斯滤波器
function filteredImage = gaussianFilter(inputImage, filterSize, sigma)
% 检查输入图像是否为灰度图像
if size(inputImage, 3) == 3
error('Input image must be a grayscale image');
end
% 初始化高斯滤波器
center = floor(filterSize / 2) + 1;
gaussianFilter = zeros(filterSize);
% 计算高斯滤波器的系数
for i = 1:filterSize
for j = 1:filterSize
x = i - center;
y = j - center;
gaussianFilter(i, j) = exp(-(x^2 + y^2) / (2 * sigma^2));
end
end
% 归一化滤波器系数
gaussianFilter = gaussianFilter / sum(gaussianFilter(:));
% 应用高斯滤波器
filteredImage = imfilter(inputImage, gaussianFilter, 'same', 'replicate');
%size文本框
function edit1_Callback(hObject, eventdata, handles)
global size_value;
size_value = str2double(get(hObject, 'String'))
%sigma文本框
function edit2_Callback(hObject, eventdata, handles)
global sigma_value;
sigma_value = str2double(get(hObject, 'String'))
%应用滤波器(自写函数)
function add_filter()
global Filter_value;
global J;
global J_filter;
global size_value;
global sigma_value;
switch Filter_value
case 1
J_filter=medianFilter(J, size_value);%应用中值滤波器,如3*3
case 2
J_filter=meanFilter(J,size_value);%应用均值滤波器,如3*3
case 3
J_filter=gaussianFilter(J,size_value,sigma_value);%应用高斯滤波器,如5*5,标准差为1
otherwise
end
% 滤波后图像
function pushbutton6_Callback(hObject, eventdata, handles)
add_filter();
global J_filter;
axes(handles.axes3);
imshow(J_filter);
function slider2_CreateFcn(hObject, eventdata, handles)
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
function edit1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end