matlab练习程序(图像滤波时的边界处理)

2023-11-08

  我们在写滤波程序时一般会用矩阵模板与原图像做卷积,这时候在做图像边界的处理是一般都选择忽略边缘,不过要是模板比较大,那么处理的效果就不好了,图像四周就会是原图像,中间才是滤波后的结果,虽然用Matlab的imfilter就能解决,不过还是自己通过滤波的原理实践一下比较好。

  模板和图像一共有如下16种关系,我粗略的画了一下,前三张小矩形的是模板、大的矩形是图像,最后一张大的是模板,小的是图像。这就是图像和模板卷积时的所有关系。

  看似好像要写16个if判断,其实是不用的,我们只要判断卷积时模板的四个边界和图像的四个边界的关系就行了。这里有两对相对坐标,一个是表示图像的卷积范围,一个表示模板的卷积范围。先说怎么表示图像的卷积范围吧,如果当前处理的点是(i,j),模板大小都是2*r+1(我这里都用了对称的奇数模板,模板边界像素要是偶数会很难处理,这里我干脆把奇数也化成了偶数,原理差不多的)。八个边界可以这样表示,图像就是1表示图像上边缘,m表示图像下边缘,1表示图像左边缘,n表示图像右边缘,i-r表示模板上边缘,i+r表示模板下边缘,j-r表示模板左边缘,j+r表示模板右边缘。通过这四对的组合就能16个关系,具体还是见下面的代码吧,看注释结合代码比较清楚。

main.m

clear all;
close all;
clc;
r=20;
w=fspecial('average',[2*r+1 2*r+1]);

img=imread('lena.jpg');
img=mat2gray(img);
[m n]=size(img);
imshow(img);


imgn=filterim(img,w);
figure;
imshow(mat2gray(imgn));

imgn=img;

for i=r+1:m-r
    for j=r+1:n-r        
        
        imgn(i,j)=sum(sum(img(i-r:i+r,j-r:j+r).*w));
    
    end
end
figure;
imshow(mat2gray(imgn));


figure;
img=imfilter(img,w);
imshow(mat2gray(img))

filterim.m(实现主要功能):

function imgn=filterim(img,w)

    [r r]=size(w);
    [m n]=size(img);
    if mod(r,2)==0
        r=r+1;
        w=imresize(w,[r r]);
    end
    imgn=zeros(m,n);
    r=floor(r/2);

    for i=1:m
        for j=1:n
                                        %图像需要获得四个边界的卷积范围,模板只需要获得最上面和最左面就可以了,因为图像和模板两个卷积范围是一样的。
                if i-r<1                %判断模板上边缘和图像上边缘的关系
                    img_up=1;               %如果当前像素的高小于模板的一半,那么选择图像的上边缘作为卷积图像的上边缘
                    mark_up=r-i+1;          %模板的上边缘使用和图像相交的上边缘
                else
                    img_up=i-r;             %使用当前像素的高减去模板的一半作为卷积图像的上边缘
                    mark_up=1;              %使用模板的最上边缘作为卷积模板的上边缘
                end

                if i+r>m                %判断模板下边缘和图像下边缘的关系
                    img_down=m;             %如果当前像素的高加上模板的一半超过整个图像的高,那么卷积图像的下边缘使用整个图像的下边缘
                else
                    img_down=i+r;           %否则卷积图像的下边缘使用当前像素的高加上模板的一半
                end

                if j-r<1                %判断模板左边缘和图像左边缘的关系
                    img_left=1;             %如果当前像素的宽小于模板的一半,那么选择图像的左边缘作为卷积图像的左边缘
                    mark_left=r-j+1;        %模板的左边缘使用和图像相交的左边缘
                else
                    img_left=j-r;           %使用当前像素的宽减去模板的一半作为卷积图像的左边缘
                    mark_left=1;            %使用模板的最左边缘作为卷积模板的左边缘
                end

                if j+r>n                %判断模板右边缘和图像右边缘的关系
                    img_right=n;            %如果当前像素的宽加上模板的一般超过整个图像的宽,那么卷积图像的右边缘使用整个图像的右边缘
                else
                    img_right=j+r;          %否则卷积图像的右边缘使用当前像素的宽加上模板的一半
                end     

           imgn(i,j)=sum(sum(img(img_up:img_down,img_left:img_right).*w(mark_up:mark_up+(img_down-img_up),mark_left:mark_left+(img_right-img_left))));%/((img_down-img_up+1)*(img_right-img_left+1));
                                %卷积图像上边缘:下边缘,左边缘:右边缘  %卷积模板上边缘:上边缘+(竖直卷积范围),卷积模板左边缘:左边缘+(水平卷积范围)                     
        end
    end
end

说实话,这个注释写的我很纠结,注释我已经尽力写清楚了,虽然我感觉还是没解释清楚。我果然需要锻炼一下写作与表达能力。

下面是效果图:

原图

自己写的滤波时边界处理的效果

通常的不做边界处理的效果

Matlab函数处理的结果

我这个效果基本和matlab自带的效果很接近了,不过速度好像慢很多,matlab自带的函数也许使用汇编处理的,总之,算法就是这样啦。

转载于:https://www.cnblogs.com/tiandsp/archive/2012/11/02/2750835.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab练习程序(图像滤波时的边界处理) 的相关文章

  • Ilnumerics Ilpanel 在 winform 中编译成 dll 并加载到 matlab 时不激活

    我想将 Visual studio 2012 中用 C 编写的 winform 编译为 dll 然后将其加载到 matlab 2013a 中 然后 我想使用 matlab net 接口与 winform 进行交互 侦听其事件并通过一组预定义
  • 如何将数据传递给 MATLAB oncleanup 函数?

    我有一个编译好的 matlab 程序 可以自动调整机器参数 在调整周期结束时 我需要恢复一些原始设置 有时会发生意外错误 有时用户会发现调整算法未正常工作 因此应终止 使用 control C 如果发生可预测的错误 我可以使用 try ca
  • 通过多次合并相同的行向量来构建矩阵

    有没有一个matlab函数可以让我执行以下操作 x 1 2 2 3 然后基于x我想建立矩阵m 1 2 2 3 1 2 2 3 1 2 2 3 1 2 2 3 您正在寻找REPMAT http www mathworks com help t
  • 在 MATLAB 中绘图后恢复轴

    从文本文件绘制多种方法的输出后 未显示轴的右侧和上侧 我需要拥有它们并将它们加粗 就像当前的轴一样 绘制的数据来自存储每种方法数据的文件 每个数据文件都是一个 256x2 文件 包含 0 1 之间的值 第一列是精度 第二列是召回率 figu
  • 通过 cuFFT 进行逆 FFT 缩放

    每当我使用 cuFFT 绘制程序获得的值并将结果与 Matlab 的结果进行比较时 我都会得到相同形状的图形 并且最大值和最小值位于相同的点 然而 cuFFT 得到的值比 Matlab 得到的值大得多 Matlab代码是 fs 1000 s
  • 图像梯度角计算

    我实际上是按照论文的说明进行操作的 输入应该是二进制 边缘 图像 输出应该是一个新图像 并根据论文中的说明进行了修改 我对指令的理解是 获取边缘图像的梯度图像并对其进行修改 并使用修改后的梯度创建一个新图像 因此 在 MATLAB Open
  • 保存符号方程以供以后使用?

    From here http www mathworks com help releases R2011a toolbox symbolic brvfu8o 1 html brvfxem 1 我正在尝试求解这样的符号方程组 syms x y
  • Mathworks 生成 Matlab HTML 文档的方法是什么?

    我正在开发共享的 Matlab 代码 我们希望在本地网络中将生成的文档作为可搜索的 HTML 文档共享 我知道以下生成文档的方法 编写一个类似于 C 文件的转换器 这是在中完成的将 Doxygen 与 Matlab 结合使用 http ww
  • MATLAB问题:在图块中引用变量的值[重复]

    这个问题在这里已经有答案了 可能的重复 matlab 绘图标题中的变量 https stackoverflow com questions 5629458 matlab variable in plot title 我想在图中引用 m 文件
  • 图像处理方面的空间和时间表征有什么区别?

    我是学习图像处理的初学者 我对空间和时间表征的概念有点困惑 那么 对于空间表征来说 是不是像一张二维地图 包含了一些关于地图的统计信息呢 就时间特征而言 值是相对于时间的吗 这意味着什么以及我们为何关心 谢谢 当您在不同时间拍摄一系列图像时
  • 霍夫变换检测和删除线

    我想使用霍夫变换检测图像中的线条 但是我不想绘制线条 而是想删除原始图像中检测到的每条线条 image imread image jpg image im2bw image BW edge image canny imshow BW fig
  • 在 MATLAB 图中用值标记点

    以下命令确实用正方形标记了点 但没有在其中放入值 例如 21 0 X 21 8 2 1 0 Y 0 1 2 3 4 plot X Y k s 我应该添加哪个参数以便全部5点值出现在图上吗 这些值不能一一键入 因为它们是随机数 因此它们可能会
  • matlab中优先级队列的实现方法

    matlab中有没有提供minpriorityqueue功能的库 import java util PriorityQueue import java util public class MyQueue Comparator
  • 如何在matlab中使矩阵图平滑

    就像上图一样 怎样才能让画面更流畅呢 或者缩小y轴的范围 数据来自二维矩阵 然后我用plot data 请随意提出任何想法 平滑线条的一种方法涉及样本点之间数据的非线性插值 当你这样做时plot x y o http www mathwor
  • 如何从 Matlab 运行 R 脚本 [重复]

    这个问题在这里已经有答案了 我有 m 文件 我想用它来运行 R 脚本 我怎样才能做到这一点 Matlab文件 caller m some matlab code need to call a R script some matlab cod
  • Matlab 中的 3D 堆叠条形图

    我想在一个图中绘制多个堆叠条形图 detached 条形图 例如 准确地想象一下bar http mathworks com help matlab ref bar3 detached png绘图 但堆叠在一起 而不是单一颜色 Set up
  • 在 MATLAB 中验证输入的最佳实践

    在验证 MATLAB 函数中的输入时 什么时候使用 inputParser 比使用断言更好 或者还有其他更好的工具可用吗 我个人发现使用 inputParser 不必要地复杂 对于 Matlab 始终需要检查 3 项内容 存在 类型和范围
  • 如何从列中创建对称矩阵?

    例如 我想转动以下列 90 175 600 650 655 660 代入矩阵 90 175 600 650 655 660 175 600 650 655 660 655 600 650 655 660 655 650 650 655 66
  • 如何使用最小生成树方法将边缘连接到图像中的节点

    我正在做我的手写图像图形匹配项目 我想在图形中表示给定的单词图像 我使用下面的算法 Algorithm input Binary image B Grid width w Grid height h Output Graph g V E w
  • 如何从一个清晰的例子计算二维图像中的吉布斯能量

    我有一个关于矩阵的有趣问题 在吉布斯分布中 吉布斯能量U x 可以计算为 这是所有可能的派系 C 上的派系势 Vc x 的总和 右图 团 c 被定义为 S 中站点的子集 x 蓝色像素的邻域是左图中黄色像素的邻居 其中每对不同的站点都是邻居

随机推荐

  • mysql下载 补丁_mysql 官方补丁在哪里下载?

    MySQL 64位安装图解 解压缩后运行程序开始安装 选择接受协议 点击下一步 选择developer default 点击 next 检查是否满足安装需求 点击 Execute 按钮后 可能会下载一些程序 到时你自己点击安装就行了 直到所
  • 区块链架构-fabric集群版安装(centos7版本)

    书接上回 配置多机器多节点集群模式 服务器选择说明 暂不考虑高可用 也不考虑kafka 所以先使用三台机器 3M 3台服务器 1O 1 Order 2P 2 Org2Peer 3 1 2证书加密 证书与加密暂时不采用CA 直接使用官方提供的
  • Ai实现FPS游戏自动瞄准 yolov5fps自瞄

    大家好 我是毕加锁 锁 今天来分享一个Yolov5 FPS跟枪的源码解析和原理讲解 代码比较粗糙 各位有什么优化的方式可以留言指出 可以一起交流学习 需要了解的东西和可能会遇到的问题1 xy坐标点与当前鼠标的xy坐标点距离计算 2 获取窗口
  • 两个串口之间传输文件

    一 串口连接 将两个USB TO TTL用两根杜邦线连接 将两个USB TO TTL的RX TX引脚交叉连接 然后将两个USB TO TTL接口接在电脑上 二 传输文件 1 打开两个串口助手 波特率是115200 数据位8 停止位1 无校验
  • el-table合并列&同时在分页时不被割裂开

    核心思想 合并大表格 留出空间给到slot 插槽 在插槽内使用小表格 效果图 具体实现
  • 学生信息管理系统中遇到的一些问题

    学生信息管理系统虽然已经让师父验收了 但感觉还是有很多不足之处 主要是全心全意为客户服务的宗旨有好多地方没有注意到 除了光标的默认输入位置 修改密码时自动默认输入并选中旧密码 师父还提醒我把所有的有关信息的增 删 改 查的窗体都要设为主窗体
  • 访谈,智能座舱开发中的人机交互与人机工程布置

    Mixlab无界社区 跨学科 智能座舱 HCI 前沿知识 N1 智能座舱开发中的人机交互与人机工程布置 丰田部分车型的多媒体系统上的Apple CarPlay 今天是汽车HMI设计师 我最喜欢苹果的UI啦 IOS的UI风格 meta sha
  • Nacos 快速上手

    Nacos 快速上手 文章目录 Nacos 快速上手 准备工作 部署 Spring Boot 集成 配置说明 Spring Cloud Nacos Dubbo Nacos 公共 API 包 服务提供者 服务消费者 问题 微服务现在越来火 有
  • php奇偶数怎么求,php奇偶数循环

    根据表单提交的数据用户在浏览器生成图一示例的图形 图形参数说明 大小 图形中最长那一行的字符数 奇数行 偶数行 最长那一个行为奇数行 紧邻的两行算偶数行 以此类推 案例效果图 应用了for循环 还应用了一个php函数 str repeat
  • 初级算法-12-实现 strStr()

    描述 实现 strStr 函数 给你两个字符串 haystack 和 needle 请你在 haystack 字符串中找出 needle 字符串出现的第一个位置 下标从 0 开始 如果不存在 则返回 1 说明 当 needle 是空字符串时
  • Android Context 上下文 你必须知道的一切

    转载请标明出处 http blog csdn net lmj623565791 article details 40481055 本文出自 张鸿洋的博客 本文大多数内容翻译自 http www doubleencore com 2013 0
  • maven(四):一个基本maven项目的pom.xml配置

    继续之前创建的test项目 一个基本项目的pom xml文件 通常至少有三个部分 第一部分 项目坐标 信息描述等
  • Python爬虫从入门到精通:(27)scrapy框架04_scrapy数据解析_Python涛哥

    scrapy数据解析 这节课 我们来看下scrapy中的数据解析 创建工程 爬取内容 爬取段子网中的段子 https duanzixing com 段子 回顾上节课所学的知识 创建scrapy 我们先来创建工程和爬虫文件 1 scrapy
  • asp.net 根据url获取参数值

    以下是 根据url获取参数值 Uri myUri new Uri http 10 0 0 75 7003 SitePages t1 aspx CurrentFolder http 10 0 0 75 7003 test docs 人力资源部
  • 实现基于SSL的主从复制

    准备 两台主机 1 在主服务器上生成证书 mkdir etc my cnf d ssl cd etc my cnf d ssl openssl genrsa 2048 gt cakey pem openssl req new x509 ke
  • Web安全之中间件安全

    中间件 中间件 英语 Middleware 又译中间件 中介层 是一类提供系统软件和应用软件之间连接 便于软件各部件之间的沟通的软件 应用软件可以借助中间件在不同的技术架构之间共享信息与资源 中间件位于客户机服务器的操作系统之上 管理着计算
  • Conda安装及使用手册

    Conda 是一个开源的软件包管理系统和环境管理系统 用于安装和管理多个软件包及其依赖项 它可以帮助用户创建虚拟环境 使得不同的项目可以使用不同的软件包和版本 从而避免版本冲突和不兼容性问题 下面是 Conda 的安装和使用步骤 安装 Co
  • 鳄鱼笔记(一) --> C#_入门<--[认识C#]

    c 语言和特点 c 语言及其特点 一 特性 二 认识 net Framework net core 三 个人理解 End c 语言及其特点 一 特性 c 是微软发布的 运行于 net Framework 和 net core 之上的高级语言
  • 面向对象设计的SOLID原则

    S O L I D是面向对象设计和编程 OOD OOP 中几个重要编码原则 Programming Priciple 的首字母缩写 SRP The Single Responsibility Principle 单一责任原则 OCP The
  • matlab练习程序(图像滤波时的边界处理)

    我们在写滤波程序时一般会用矩阵模板与原图像做卷积 这时候在做图像边界的处理是一般都选择忽略边缘 不过要是模板比较大 那么处理的效果就不好了 图像四周就会是原图像 中间才是滤波后的结果 虽然用Matlab的imfilter就能解决 不过还是自