数字图像处理笔记(十)关于MATLAB的一些补充知识(二值图像交、并、补,空间滤波器手撕方法)

1.空间滤波器的一些手撕方法

  空间滤波器实际上就是一个移动窗口,在移动到中心点经过特殊的运算,然后将这个特殊的运算的结果赋值给原来矩阵的相应位置,像平均值滤波器是一种平滑的方法,它是一种线性滤波器 ,本质上就是矩阵的点乘运算,可以利用循环让模板去点乘(.*)的方法来实现,在数字图像处理中P141页有一个非常伟大的表格

滤波器名称公 式注 释
平均值 f ^ ( x , y ) = 1 m n ∑ ( s , t ) ∈ S x y g ( s , t ) \hat{f}(x,y) =\dfrac{1}{mn} \sum\limits_{(s,t)\in S_{xy}} g(s,t) f^(x,y)=mn1(s,t)Sxyg(s,t)fspecial和imfilter实现
几何均值 f ^ ( x , y ) = [ ∏ ( s , t ) ∈ S x y g ( s , t ) ] m n \hat{f}(x,y) = [\prod\limits_{(s,t) \in S_{xy}}g(s,t)]^{mn} f^(x,y)=[(s,t)Sxyg(s,t)]mn用gmean实现
调和均值 f ^ ( x , y ) = m n ∑ ( s , t ) ∈ S x y 1 g ( s , t ) \hat{f}(x,y) = \dfrac{mn}{\sum\limits_{(s,t)\in S_{xy}} \dfrac{1}{g(s,t)}} f^(x,y)=(s,t)Sxyg(s,t)1mn用harmean实现
反调和均值 f ^ ( x , y ) ∑ ( s , t ) ∈ S x y g ( s , t ) Q + 1 ∑ ( s , t ) ∈ S x y g ( s , t ) Q \hat{f}(x,y) \dfrac{\sum\limits_{(s,t)\in S_{xy}} {g(s,t)}^{Q+1}}{\sum\limits_{(s,t)\in S_{xy}} {g(s,t)}^Q} f^(x,y)(s,t)Sxyg(s,t)Q(s,t)Sxyg(s,t)Q+1用charmean实现
中值 f ^ ( x , y ) = m e d i a n ( s , t ) ∈ S x y { g ( s , t ) } \hat{f}(x,y)= median _{(s,t) \in S_{xy}} \{g(s,t)\} f^(x,y)=median(s,t)Sxy{g(s,t)}用medfilt实现
最大值 f ^ ( x , y ) = max ⁡ ( s , t ) ∈ S x y { g ( s , t ) } \hat{f}(x,y)=\max\limits_{(s,t) \in S_{xy}} \{g(s,t)\} f^(x,y)=(s,t)Sxymax{g(s,t)}用imdilate实现
最小值 f ^ ( x , y ) = min ⁡ ( s , t ) ∈ S x y { g ( s , t ) } \hat{f}(x,y)=\min\limits_{(s,t) \in S_{xy}} \{g(s,t)\} f^(x,y)=(s,t)Sxymin{g(s,t)}用imerode实现
中点值 f ^ ( x , y ) = 1 2 [ max ⁡ ( s , t ) ∈ S x y { g ( s , t ) } + min ⁡ ( s , t ) ∈ S x y { g ( s , t ) } ] \hat{f}(x,y) = \dfrac{1}{2}[\max\limits_{(s,t) \in S_{xy}} \{g(s,t)\} + \min\limits_{(s,t) \in S_{xy}} \{g(s,t)\}] f^(x,y)=21[(s,t)Sxymax{g(s,t)}+(s,t)Sxymin{g(s,t)}]用imerode和imdilate的0.5倍实现
字母平衡值 f ^ ( x , y ) = 1 m n − d ∑ ( s , t ) ∈ S x y g ( s , t ) \hat{f}(x,y) = \dfrac{1}{mn-d}\sum\limits_{(s,t)\in S_{xy}} {g(s,t)} f^(x,y)=mnd1(s,t)Sxyg(s,t)用函数alphatrim实现

  这些滤波器只有平均值滤波器是线性滤波器,其余的要么是统计滤波器要么就是非线形的(统计也是非线形)
  这里想强调的就是说,最大、小值滤波这种统计滤波器可以考虑用 imdilate 和 imerode 来实现。这样可以避免你手撕的时候做太多循环,毕竟MATLAB是矩阵实验室,是向量实验室,不推荐用很多循环,效率会低很多。我还特定验证了一下,就以最小值滤波器为例
  实际上,这个最大最小值滤波就是后面灰度级形态学腐蚀和膨胀的基础,所以自己也可以写一个function 来手动代替imerodeimdilate函数,只不过效率会比较低。可以直接考虑用conv(卷积)函数,不过conv的底层应该就是循环了。

a = [1,2,3;4,5,6;7,8,9];

%填充边缘,需要用replicate否则会和imerode结果不一样
a_ = padarray(a,[1,1],'replicate','both');

a_1 = a_;		%用另一个矩阵保留
for i = 2:4 
    for j = 2:4 
        temp = a_(i-1:i+1,j-1:j+1);         %提出3*3邻域内的数据
        min_ = min(reshape(temp,1,9));		%取出最小值
        a_1(i,j) = min_;	
    end
end
result = a_1(2:end-1,2:end-1)

b = imerode(a,ones(3,3)); %利用腐蚀坐的最小值滤波器

if result == b 
    fprintf('灰度级的均值滤波就是腐蚀的结果');
end

在这里插入图片描述
  为啥这两个相等我得思考思考,碰巧两本书互翻的时候看到了,就记下来。
所以如果你要做 3*3 的最大最小值滤波,只要像上面那样用求出3 * 3 邻域内的最大最小值再给到代替矩阵的相应位置就可以了。至于空间卷积、相关,频域卷积和相关是怎么做的,可以补补知识,我的理解就是一个滑动小窗做一个“魔法的变换”。
模板的尺寸是可以自己定的,填充的行数和列数话就只需要用floor(m/2)+1,floor(n/2)+1即可,直接调用padarray函数可以,或者用矩阵的拼接补上边缘也行。

Waring:只有理解了基本的原理才不会老是该调用函数的时候不知道调用哪一个,后期在写东西的时候才不会只会改参数,只会改参数到后期的学习,想发好的paper怕是难上天。

2.关于二值图像如何取交、并、补集

  之前在手撕算法的时候一直在找集合运算用MATLAB表示,找了半天没找到,今天在读冈萨雷斯老师的MATLAB数字图像处理第三版看到了个厉害的表格,特此补充(p337)。

集合运算二值图像图像的MATLAB语句名称
A ∩ B A \cap B AB A A A & B B B
A ∪ B A \cup B AB A A A | B B B
A c A^c Ac~ A A A非(补集)
A-BA&~B差集

终于学会用markdown的表格了

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值