%zhrmsl#2010-12-11
%没有写容错处理。
%编制一通用的空域卷积程序处理图像。
%改变模板大小、系数(平滑、锐化),观察处理结果。
%要求:模板大小可变、模板系数可变。
%本程序是努力实现matlab函数imfilter的功能。
%g = imfilter(f, w, filtering_mode, boundary_options, size_options);
%imfilter函数属性:
%filtering_mode:
%'corr' ——使用相关来完成
%'conv' ——使用卷积来完成
%boundary_options:
% 'X' ——边界用X填充,X默认值为0
%'replicate'——复制外边界的值来扩展边界
%'symmetric'——镜像反射其边界来扩展边界
%'circular' ——将图像看成是一个二维周期函数的一个周期来扩展
%size_options:
%'full' ——输出图像的大小与被扩展图像大小相同
%'same' ——输出图像与输入图像大小相同,模板的中心与输入图像的边界点重合。
clear all;close all;
img=imread('gaozhanyuanzhu.jpg');
gray_img=rgb2gray(img);
figure;imshow(gray_img);
title('原始图像');
%imfilter函数可以直接对RGB图像进行处理
%这里先考虑对二维的灰度图像
size_filter_m = 5; %模板大小n可变
size_filter_n = 5;
%muban_type = 'average'; %平滑模板
muban_type = 'log'; %锐化滤波
%锐化模板,用Log算子(n需要是奇数);用Laplace算子效果也很好。
filter = fspecial(muban_type,[size_filter_m,size_filter_n]);
%用函数生成模板filter。
%参数调整
%filtering_mode = 'corr'; %选择用相关来完成运算
filtering_mode = 'conv'; %选择用卷积来完成运算
%实验结果:卷积和相关结果一样
boundary_options = 0; %边界用0填充
%boundary_options = 'replicate';
%boundary_options = 'symmetric';
%boundary_options = 'circular';
size_options = 'same'; %输出与输入大小相同
%size_options = 'full'; %输出与扩展后大小相同
tic;
if strcmp(filtering_mode,'conv')
%如果选择卷积,则将filter旋转180°
filter = rot90(rot90(filter)); %两次逆时针旋转90°,这样最快
%filter = flipud(fliplr(filter)); %先左右翻转再上下翻转
%filter = rot90(A,2);
end
[m,n] = size(gray_img); %m、n是输入图像的大小
x1=(size_filter_m-1)/2; %输入图像首行前和末行后分别填充x1行
y1=(size_filter_n-1)/2; %输入图像首列前和末列后分别填充y1列
switch boundary_options
%padarray函数使用默认填充方向both
case 0
f = padarray(gray_img,[x1,y1]); %默认用0填充
%f = [zeros(x1,n+2*y1);[zeros(m,y1),gray_img,zeros(m,y1)];zeros(x1,n+2*y1)];
case 'replicate'
f = padarray(gray_img,[x1,y1],'replicate');
case 'symmetric'
f = padarray(gray_img,[x1,y1],'symmetric');
case 'circular'
f = padarray(gray_img,[x1,y1],'circular');
end
[m_f,n_f] = size(f);
img_out = ones(m_f,n_f);
k1 = x1+1;
k2 = x1+m;
p1 = y1+1;
p2 = y1+n;
f = double(f); %类型转换
for k=k1:k2
for p=p1:p2
A = f(k-x1:k+x1,p-y1:p+y1);
B = A.*filter;
img_out(k,p) = sum(B(:));
end
end
if strcmp(size_options,'same')
%输入和输出大小相同
img_zhr = uint8(img_out(x1+1:x1+m,y1+1:y1+n));
else
%输入和扩展图像大小相同
img_zhr = uint8(img_out);
end
figure;imshow(img_zhr);
title('zhrmsl的算法结果');
toc;
%用matlab函数imfilter滤波,用来对比
tic;
img_matlab = imfilter(gray_img,filter,filtering_mode,boundary_options,size_options);
figure;imshow(img_matlab);
title('matlab imfilter()的结果');
toc;
刘良运
- 粉丝: 78
- 资源: 1万+
最新资源
- 遗传算法带时间窗车辆路径规划问题VRPTW 内容:MATLAB程序完整源代码 用遗传算法求解工业园自主导航AGV快递配送车路径规划及投入AGV数量 详情:通过txt文档给定各客户坐标位置、方便取快
- 基于springboot高校就业招聘系统 - 编程语言:Java - 数据库:MySQL - 前端技术:Vue - 后端技术:SpringBoot全部资料+详细文档.zip
- 基于SSH(Struts2+Spring+Hibernate)搭建的失物招领平台,进行简单修改即可用于各高校失物招领。全部资料+详细文档.zip
- 基于SpringBoot框架的模拟高校招生的平行志愿录取系统全部资料+详细文档.zip
- 基于SSM的高校共享单车管理系统全部资料+详细文档.zip
- 基于SSM的高校人事招聘管理系统全部资料+详细文档.zip
- 基于SSM的高校考务管理系统,项目部署环境为腾讯云全部资料+详细文档.zip
- 基于ThinkPHP的高校班级管理系统全部资料+详细文档.zip
- 基于ssm高校学籍管理系统毕业源码案例设计全部资料+详细文档.zip
- 基于SSM框架的高校实验室管理系统全部资料+详细文档.zip
- 基于VC++的高校教材管理系统全部资料+详细文档.zip
- 基于Vue+Springboot高校失物招领系统设计毕业源码案例设计全部资料+详细文档.zip
- 基于Vue和SpringBoot的高校固定资产管理系统,用于实现高校对固定资产的管理需求,包含资产品类、资产单位、资产仓库、资产供应商、资产库存、资产采购、资产
- 基于Vue高校选课系统全部资料+详细文档.zip
- 基于Vue2+Spring Boot+Element-UI 的前后端分离项目高校二手物品交易平台全部资料+详细文档.zip
- Securecrt 9.6.1
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0