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)∈Sxy∑g(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)∈Sxy∏g(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)∈Sxy∑g(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)∈Sxy∑g(s,t)Q(s,t)∈Sxy∑g(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)=mn−d1(s,t)∈Sxy∑g(s,t) | 用函数alphatrim实现 |
这些滤波器只有平均值滤波器是线性滤波器,其余的要么是统计滤波器要么就是非线形的(统计也是非线形)。
这里想强调的就是说,最大、小值滤波这种统计滤波器可以考虑用 imdilate 和 imerode 来实现。这样可以避免你手撕的时候做太多循环,毕竟MATLAB是矩阵实验室,是向量实验室,不推荐用很多循环,效率会低很多。我还特定验证了一下,就以最小值滤波器为例
实际上,这个最大最小值滤波就是后面灰度级形态学腐蚀和膨胀的基础,所以自己也可以写一个function 来手动代替imerode和imdilate函数,只不过效率会比较低。可以直接考虑用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 A∩B | A A A & B B B | 与 |
A ∪ B A \cup B A∪B | A A A | B B B | 或 |
A c A^c Ac | ~ A A A | 非(补集) |
A-B | A&~B | 差集 |
终于学会用markdown的表格了