上一篇分享了一些均值滤波相关的算法,均值滤波作为一种线性滤波器,在滤除噪声的同时也会导致边缘模糊问题。而且均值滤波对高斯噪声的效果很好,但是对于椒盐噪声的效果就很一般。但是中值滤波作为一种顺序滤波器,对于椒盐噪声的效果很好,而且保边能力很强,所以这一篇主要讨论一下中值相关的算法。

中值滤波

算法原理

中值滤波很好理解,均值滤波就是在一个小窗口中求均值来取代当前像素值,而中值滤波就是通过求小窗口中的中位值来取代当前位置的方式来滤波。

如图绿色窗口就是当前的滤波窗口,在一个3X3的邻域窗口中进行滤波。那么中值滤波做的就是:

  1. 对这个邻域中的像素值进行排序:[45, 50, 52, 60, 75, 80, 90, 200, 255];
  2. 从排序后的数据中找出中位值:75;
  3. 用中位值取代当前位置的像素值,所以就可以得到右侧的滤波后的数据。

代码实现

%% --------------------------------
%% author:wtzhu
%% email:wtzhu_13@163.com
%% date: 20210306
%% fuction: 中值滤波
%% --------------------------------
clear;
clc;
close all;
img = imread('./images/test_pattern_blurring_orig.tif');
[m, n] = size(img);
figure;subplot(221);imshow(img);title('original image');%% 运算的时候需要对边缘进行扩展
% 需要特殊处理四周最外圈的行和列,本算法中将其向外扩展一圈,用最外圈的值填充
headRowMat = img(1,:);%取f的第1行
tailRowMat = img(m,:);%取f的第m行
% 行扩展后,列扩展时需要注意四个角需要单独扩展进去,不然就成了十字架形的
headColumnMat = [img(1,1), img(:,1)', img(m,1)];
tailColumnMat = [img(1,n), img(:,n)', img(m,n)];
expandImage = [headRowMat; img; tailRowMat];
expandImage = [headColumnMat; expandImage'; tailColumnMat];
expandImage = uint8(expandImage');
subplot(222);imshow(expandImage);title('expand image');newImg = zeros(m, n);
for i =2: m+1for j =2: n+1imgRoi = [expandImage(i-1, j-1) expandImage(i-1, j) expandImage(i-1, j+1) ...expandImage(i  , j-1) expandImage(i  , j) expandImage(i  , j+1) ...expandImage(i+1, j-1) expandImage(i+1, j) expandImage(i+1, j+1)];orderedList = sort(imgRoi);sizeRoi = size(imgRoi);newImg(i-1, j-1) = orderedList((sizeRoi(2)+1)/2);end
end
newImg = uint8(newImg);
subplot(223);imshow(newImg);title('new image');
subplot(224);imshow(uint8(newImg-img));title('newImg-img');

从滤波效果图中可以看出去噪能力还可以,百块中的噪点去除了很多,而且边缘信息保留得也很好。

多级中值滤波

算法原理

简单的中值滤波器滤波效果有限,于是就有人提出了将多个中值滤波进行多级级联实现更好的滤波效果。

如图就是一种多级级联的方式,先在窗口中定义一个’+'和’X’形的窗口,然后分别求出这两个窗口的中位值,然后结合当前窗口的中心点就有3个候选值,再从这三个值中求出一个中位值作为滤波后的结果。

这种方式也可以直接应用到RAW图中做BNR,需要修改的就是窗口设置为5X5,然后在做滤波的时候需要区分G和RB通道,因为这个前面已经讲过,RAW图中的RGB分布是不均匀的,G占50%,R和B各占25%。

左侧就是针对G通道的滤波器,右侧是R和B通道的滤波器,都是定义了一个’+'和’X’形的窗口,不同的只是取的点的位置不同。

代码实现

%% --------------------------------
%% author:wtzhu
%% email:wtzhu_13@163.com
%% date: 20211023
%% fuction: multistage median filters
%% --------------------------------close all;
clear all;
clc
img = imread('./images/lena.bmp');
I = double(img);
% I = double(imresize(img, [64, 64]));
figure();
imshow(uint8(I));
title('org file');I_noise = I + 10 * randn(size(I));
figure();
imshow(uint8(I_noise));
title('noise file');
[m,n] = size(I_noise);DenoisedImg = zeros(m,n);
PaddedImg = padarray(I,[1, 1],'symmetric','both');tic
for i = 1: mfor j = 1: nroi = PaddedImg(i:i+2, j:j+2);% first stagemedian_HV = median([roi(1,2), roi(2,1), roi(2,2), roi(2,3), roi(3,2)]);median_diag = median([roi(1,1), roi(1,3), roi(2,2), roi(3,1), roi(3,3)]);% second stageDenoisedImg(i, j) = median([median_HV, roi(2,2), median_diag]);end
end
figure();
imshow(uint8(DenoisedImg));
title('denoise file');
tocb = medfilt2(I_noise,[3,3]);
figure();
imshow(uint8(b));
title('median filter of matlab denoise file');

多级中值混合滤波

算法原理

前面介绍过中值滤波和均值滤波各自有各自的优点和缺点,所以就可以考虑将两者结合起来,相互弥补实现更好的滤波效果,于是就有人提出了这种多级混合滤波的方式。

算法流程:

  1. 求出竖直方向相邻三个点的均值和水平方向相邻三个点的均值,再结合当前点,用这三个点再求一个中位值;
  2. 求出45°和135°方向上的均值,然后结合当前点求出一个中位值;
  3. 两个中位值结合当前点组成新的数组,最后求一个中位值作为当前点的值完成滤波。

这样就巧妙的将均值滤波和中位值滤波结合了。然后如果应用在RAW图上,只需要对滤波器稍作改善即可。

代码实现

%% --------------------------------
%% author:wtzhu
%% email:wtzhu_13@163.com
%% date: 20211023
%% fuction: multistage median hybird filters
%% --------------------------------close all;
clear all;
clc
img = imread('./images/lena.bmp');
I = double(img);
figure();
imshow(uint8(I));
title('org file');I_noise = I + 10 * randn(size(I));
figure();
imshow(uint8(I_noise));
title('noise file');
[m,n] = size(I_noise);DenoisedImg = zeros(m,n);
PaddedImg = padarray(I,[1, 1],'symmetric','both');tic
for i = 1: mfor j = 1: nroi = PaddedImg(i:i+2, j:j+2);% first stage: average and medianmean_V = mean(roi(:,2));mean_H = mean(roi(2,:));median_HV = median([mean_V, roi(2, 2)], mean_H);mean45 = mean([roi(1, 3), roi(2, 2), roi(3, 1)]);mean135 = mean([roi(1, 1), roi(2, 2), roi(3, 3)]);median_diag = median([mean45, roi(2, 2)], mean135);% second stageDenoisedImg(i, j) = median([median_HV, roi(2,2), median_diag]);end
end
figure();
imshow(uint8(DenoisedImg));
title('denoise file');
tocb = medfilt2(I_noise,[3,3]);
figure();
imshow(uint8(b));
title('median filter of matlab denoise file');

多级中值有理混合滤波

算法原理

WMF加权中值滤波

加权中值滤波也很好理解,和加权均值滤波差不多,就是在原始数据的基础上给每个点分别赋予一个权重,然后在加权后的数据中取出中位值作为滤波后的值。

算法流程

  1. 求出’+'形和’X’形的窗口的中位值;

  2. 对’+'形窗口再利用CWMF求出一个值,CWMF是WMF的一种特殊情况,就是只对中心点进行加权;

  3. 对以上求出的三个参数用一下公式计算出一个新的值作为滤波后的值
    y(m,n)=ϕ2(m,n)+ϕ1(m,n)−2∗ϕ2(m,n)+ϕ3(m,n)h+k(ϕ1(m,n)−ϕ3(m,n))y(m, n)=\phi 2(m, n)+\frac{\phi 1(m, n)-2 * \phi 2(m, n)+\phi 3(m, n)}{h+k(\phi 1(m, n)-\phi 3(m, n))} y(m,n)=ϕ2(m,n)+h+k(ϕ1(m,n)−ϕ3(m,n))ϕ1(m,n)−2∗ϕ2(m,n)+ϕ3(m,n)​

一样的,稍作改动该算法就可以用于raw格式图像

代码实现

%% --------------------------------
%% author:wtzhu
%% email:wtzhu_13@163.com
%% date: 20211023
%% fuction: median rational hybird file filter
%% references: MEDIAN-RATIONAL HYBRID FILTERS
%% --------------------------------close all;
clear all;
clc
img = imread('./images/lena.bmp');
I = double(img);
figure();
imshow(uint8(I));
title('org file');I_noise = I + 10 * randn(size(I));
figure();
imshow(uint8(I_noise));
title('noise file');
[m,n] = size(I_noise);DenoisedImg = zeros(m,n);
PaddedImg = padarray(I,[1, 1],'symmetric','both');h = 2;
k = 0.01;tic
for i = 1: mfor j = 1: nroi = PaddedImg(i:i+2, j:j+2);median_HV = median([roi(1,2), roi(2,1), roi(2,2), roi(2,3), roi(3,2)]);median_diag = median([roi(1,1), roi(1,3), roi(2,2), roi(3,1), roi(3,3)]);CWMF = median([roi(1,2), roi(2,1), roi(2,2)*3, roi(2,3), roi(3,2)]);DenoisedImg(i, j) = CWMF + (median_HV + median_diag - 2 * CWMF) / (h + k * (median_HV - median_diag));end
end
toc
figure();
imshow(uint8(DenoisedImg));
title('denoise file');
b = medfilt2(I_noise,[3,3]);
figure();
imshow(uint8(b));
title('median filter of matlab denoise file');

相关链接

  • zhihu: ISP图像处理 - 知乎 (zhihu.com)
  • CSDN:ISP图像处理_wtzhu_13的博客-CSDN博客
  • Bilibili:食鱼者的个人空间_哔哩哔哩_Bilibili
  • Gitee:ISPAlgorithmStudy: ISP算法学习汇总,主要是论文总结 (gitee.com)

NR基础篇下——中值滤波、多级中值滤波、多级中值混合滤波、加权中值滤波、中值有理滤波相关推荐

  1. 前端开发工程师 - 03.DOM编程艺术 - 第1章.基础篇(下)

    第1章.基础篇(下) Abstract: 数据通信.数据存储.动画.音频与视频.canvas.BOM.表单操作.列表操作 数据通信(HTTP协议) HTTP事务: 客户端向服务器端发送HTTP请求报文 ...

  2. NR基础篇上——均值滤波、高斯滤波、双边滤波、NLM

    人类的世界就是一个信号传输的世界,所以噪声无处不在,图像作为一种信号传输的方式当然也无法幸免.为了尽量减少噪声对图像质量的影响,还原物体的本来状态就提出了一系列降噪的方法,本文就简单介绍几种常见的降噪 ...

  3. [前端基础] JavaScript 基础篇(下)

    DOM 和 BOM DOM 指的是文档对象模型,它指的是把文档当做一个对象来对待,这个对象主要定义了处理网页内容的方法和接口.BOM 指的是浏览器对象模型,它指的是把浏览器当做一个对象来对待,这个对象 ...

  4. 一文搞懂AWS EC2, IGW, RT, NAT, SG 基础篇下

    B站实操视频更新 跟着拉面学习AWS--EC2, IGW, RT, NAT, SG 简介 长文多图预警,看结论可以直接拖到"总结"部分 本文承接上一篇文章介绍以下 AWS 基础概念 ...

  5. Python开发第一篇 基础篇(下)

    一.python种类 1.1 Cpython python官方版本,使用c语言实现,运行机制:先编译,py(源码文件)->pyc(字节码文件),最终执行时先将字节码转换成机器码,然后交给cpu执 ...

  6. PythonOpenCV基础篇2线段

    PythonOpenCV基础篇 第6章 绘制图形和文字 OpenCV提供了许多绘制图形的方法,包括绘制线段的line()方法.绘制矩形的rectangle()方法.绘制圆形的circle()方法.绘制 ...

  7. 【Kotlin】学习小记-基础篇

    Kotlin学习小记-基础篇 Kotlin的介绍 入门基础篇 属性声明 关于val和final的小Tips 参数 1.可变参数 2.命名参数 函数返回值 1.默认返回Unit值 2.返回Nothing ...

  8. 01 MSC类设备-基础篇(一)

    一.简介 在USB协议中,规定了一类大容量存储设备(Mass Storage Device Class)协议.常见的USB大容量设备有:U盘.USB移动硬盘.USB移动光驱.USB读卡器.USB打印机 ...

  9. 基础篇:如何做一名专业的软件测试工程师

    今晚在本人创建的测试群里,邀请了一位行业大佬做了一期关于软件测试工程师工作成长的很多"套路"的经验分享,受用良多... 会分为三篇博客进行描述,这篇博客,将基础篇做一个整理,分享出 ...

最新文章

  1. 修改 mysql 字符集_如何修改MySQL字符集
  2. 【Android UI设计与开发】7.底部菜单栏(四)PopupWindow 实现显示仿腾讯新闻底部弹出菜单...
  3. 走进webpack(1)--环境拆分及模块化
  4. 将博客文章转变为电子书
  5. Spring学习总结(26)——Spring事务原理详解
  6. Linux内存初始化(四) 创建系统内存地址映射
  7. 玩转Eclipse1--基本知识与配置
  8. Akka Remote Actor_简单示例二
  9. Python高级特性:Python迭代、生成器、列表生成式
  10. android中文朗读包,Android 通过手说tts中文语音包实现中文朗读
  11. Linux内核配置选项简介
  12. 跨终端实践-天猫试戴的解决方案
  13. 查询oracle所有回收站,oracle 回收站
  14. 前端工程师项目能力精选文章50篇
  15. python爬虫实训总结报告_python爬虫简单总结(一)
  16. 业务流程管理包括什么
  17. 目标检测(四):SSD之Pytorch源码解读
  18. 【计算机网络】ARP协议工作原理
  19. Docker学习(一):基础理论基础操作
  20. 阿里云栖大会100位顶级大咖演讲PPT+视频全分享!

热门文章

  1. 手机连无线网后没有网络连接到服务器,手机无线网络连接上但上不了网
  2. 综合评价体系之熵权法
  3. 基于C的双声道PCM文件数据处理
  4. Self-supervised Equivariant Attention Mechanism for Weakly Supervised Semantic Segmentation论文解读
  5. 1199: 8001 颜色映射
  6. 微信答题怎么做_分享公众号答题制作步骤
  7. KISS原则和YAGNI原则
  8. oracle能对某一用户解锁,oracle用户解锁
  9. 小白读iOS冗余资源扫描脚本
  10. 【技术美术美术部分】​3A 次世代游戏 PBR资源生产流程