1.图像滤波

图像滤波是在尽量保留原图像细节特征的条件下,对该图像的噪声进行抑制,处理效果的好坏会直接影响后续操作的有效性。
消除图像中噪声数据的过程叫做图像滤波或图像平滑,图像中的有效信息主要集中在低频和中频区域,高频区域中的有效信息会被噪声数据影响。
图像滤波的目的: 消除图像中的噪声;为图像识别等后续操作提取中相应的特征。
图像滤波的要求: 尽可能地不破坏原图像中的特征(如边缘);视觉效果应更好。
(1)均值滤波
均值滤波是一种低通滤波器,高频信号将会被去掉,可消除图像中尖锐噪声,其思想是利用某一个像素点和它周围8邻域的像素值构建成一个算子,计算它们的均值,并用均值替换原图像该点的像素值。
(2)中值滤波
中值滤波是消除图像噪声较为常用的方法,处理椒盐噪声效果较好,其思想是利用某一个像素点和它周围8邻域的像素值构成一个算子,将它们排序后,并用中间的值替换原图像该点的像素值。
(3)最大最小值滤波
最大最小值滤波的思想是利用某一个像素点和它周围8邻域的像素值构成一个算子,将他们排序后,若中值比最大值大,将原图像该点像素值替换为该算子中的最大值,反之,替换为最小值,若处于最大值和最小值之间,可指定原图像该点的像素值为最大值/最小值。
(4)sobel算子
sobel算子是一个矩阵,主要用于图像中物体的边缘提取。
(5)高斯平滑
高斯平滑呈高斯分布,突出了中心点在像素平滑后的权重,有着较好的滤波效果,二维高斯公式如下:

(6)线性滤波
线性滤波的处理操作是利用权重矩阵(算子)与图像中某几个点对应相乘,并进行求和操作。(具体的讲解可参考下图的转载链接)

(图像转自https://blog.csdn.net/zouxy09/article/details/49080029,侵删)

2.各个方法实现步骤

(1)均值滤波
a.对原图像进行填充操作(padding)
b.取原图像的9个点作为kernel
c.求均值
d.更新像素值
e.直到循环结束
f.返回新图像
(2)中值滤波
a.对原图像进行填充操作(padding)
b.计算中位数位置
c.选取原图像的9个点作为kernel
d.排序
e.选取中间值更新原图像像素值
f.直到循环结束
g.返回新图像
(最大最小值滤波与中值滤波相似,此处不在重复说明)
(3)sobel算子
a.生成sobel矩阵
b.返回sobel矩阵
(4)高斯平滑
a.根据高斯公式计算高斯算子(其中x,y的计算方法可见https://blog.csdn.net/shawroad88/article/details/87935922)
b.进行线性滤波操作
(对高斯平滑加深理解可见https://www.zhihu.com/question/54918332)
(5)线性滤波
a.对原图像进行填充操作(padding)
b.截取图像中n*n个像素点与权重矩阵对应相乘
c.求和
d.更新像素值
e.对图像进行阶段操作(像素值大于255,令它为255,小于0,对该点像素进行abs操作)
f.直到循环结束
g.返回新图像

3.python实现

(1)均值滤波

def mean_filter(src,kernel_size,epoch):#均值滤波kernel_height,kernel_weight=kernel_sizedst=srcpad_num=int(np.floor(kernel_weight/2))#计算需要加的边pad_src=np.pad(src,((pad_num,pad_num),(pad_num,pad_num)),'constant')#加边for z in range(epoch):#迭代for i in range(pad_num,pad_src.shape[0]-pad_num):#滤波for j in range(pad_num,pad_src.shape[1]-pad_num):sum_temp=sum(pad_src[i-pad_num:i+pad_num+1,j-pad_num:j+pad_num+1]).tolist()#求和#print(sum_temp)sum_temp=sum(sum_temp)#print(sum_temp)temp=sum_temp/(kernel_weight*kernel_height)#求均值dst[i-pad_num,j-pad_num]=temp#更新像素src=dst#更新原图像pad_src = np.pad(src, ((pad_num, pad_num), (pad_num, pad_num)), 'constant')dst = dst.astype(np.uint8)return dst

(2)中值滤波

def median_filter(src,kernel_size,epoch):#中值滤波kernel_height,kernel_weight=kernel_sizepad_num=int(np.floor(kernel_height/2))#计算需要添加的边center=int(np.round((kernel_height*kernel_weight)/2))#计算中位数dst=srcpad_src=np.pad(src,((pad_num,pad_num),(pad_num,pad_num)),'constant')#加边for z in range(epoch):#迭代for i in range(pad_num, src.shape[0] - pad_num):#滤波for j in range(pad_num, src.shape[1] - pad_num):temp = pad_src[i - pad_num:i + pad_num + 1, j - pad_num:j + pad_num + 1].flatten().tolist()#获取n*n的矩阵并平展temp = sorted(temp)#排序dst[i - pad_num, j - pad_num] = temp[center]#更新像素值src=dst#更新原图像pad_src = np.pad(src, ((pad_num, pad_num), (pad_num, pad_num)), 'constant')dst=dst.astype(np.uint8)return dst

(3)sobel算子

def sobel_kernel():sobel_horizontal=np.array([[1,2,1],[0,0,0],[-1,-2,-1]]).astype(np.uint8)#水平sobel算子sobel_vertical=sobel_horizontal.T#垂直sobel算子return sobel_horizontal,sobel_vertical

(4)高斯平滑

def guass_kernel(kernel_size,sigma):#创建高斯kernelkernel_height,kernel_weight=kernel_sizekernel=np.zeros(kernel_size)#创建高斯kernelfor i in range(kernel_height):for j in range(kernel_weight):r=math.pow((i-(kernel_height-1)/2),2)#计算xc=math.pow((j-(kernel_weight-1)/2),2)#计算ykernel[i,j]=(1/(2*math.pi*math.pow(sigma,2)))*math.exp(-(math.pow(r,2)+math.pow(c,2))/(2*math.pow(sigma,2)))#按照高斯公式计算每一个kernel的值sum_temp=sum(kernel)#求和kernel=kernel/sum_temp#最终的高斯kernelreturn kernel

(5)线性滤波

def sliding_window(src,kernel,stride):#用于单通道滑窗dst = srckernel_height,kernel_weight=kernel.shape#获取kernel的高度和宽度exnum=int(np.floor(kernel_height/2))#填充的维数,floor函数向下取整img_pad=np.pad(src,((exnum,exnum),(exnum,exnum)),'constant')#给图像加边,方便滑窗for i in range(exnum,img_pad.shape[0]-exnum,stride):for j in range(exnum,img_pad.shape[1]-exnum,stride):temp=(img_pad[i-exnum:i+exnum+1,j-exnum:j+exnum+1]*kernel)/(kernel_height*kernel_weight)#截取n*n的mat与kenel对应相乘sum_temp=sum(temp).tolist()#相加sum_temp=sum(sum_temp)img_pad[i,j]=sum_temp#更新像素if img_pad[i,j]<0:#截断操作img_pad[i,j]=abs(img_pad[i,j])if img_pad[i,j]>255:img_pad[i,j]=255dst[i-exnum,j-exnum]=img_pad[i,j]dst=dst.astype(np.uint8)return dst

(6)测试代码

#均值滤波
img=cv2.imread("1.png",0)
dst=mean_filter(img,(3,3),5)
print(dst)
cv2.imshow("dst",dst)
cv2.waitKey(0)
#中值滤波
img=cv2.imread("1.png",0)
dst=mean_filter(img,(3,3),5)
print(dst)
cv2.imshow("dst",dst)
cv2.waitKey(0)
#高斯滤波
kernel=guass_kernel((3,3),1.5)
print(kernel)
img=cv2.imread("1.png",0)
dst=sliding_window(img,kernel,1)
cv2.imshow("dst",dst)
cv2.waitKey(0)
#sobel
sobel_kernel_horizontal,sobel_kernel_vertical=sobel_kernel()
img=cv2.imread("1.png",0)
dst_horizontal=sliding_window(img,sobel_kernel_horizontal,1)
dst_vertical=sliding_window(img,sobel_kernel_vertical,1)
dst=dst_horizontal+dst_vertical
cv2.imshow("dst_horizontal",dst_horizontal)
cv2.imshow("dst_vertical",dst_vertical)
cv2.imshow("dst",dst)
cv2.waitKey(0)

4.总结

(1)均值滤波
优点:算法简单,计算速度较快。
缺点:降噪的同时会使得图像模糊,尤其是物体的边缘。
(2)中值滤波
优点:抑制噪声效果较好,图像的清晰度基本保持。
缺点:对高斯噪声的抑制效果不是很好。
(3)sobel
主要用于提取物体的边缘。

(学习笔记)图像滤波及其python实现相关推荐

  1. 机器视觉学习笔记--图像滤波1

    基本理论 图像滤波的目的:去除图像噪声,修复图像损坏,改变图像分布. 均值滤波(Mean Filter) 求取NxN像素范围内的均值作为中心点的像素值,N为核大小 例:核为3 核越大,噪声消除效果越好 ...

  2. OpenCV与图像处理学习五——图像滤波与增强:线性、非线性滤波、直方图均衡化与Gamma变换

    OpenCV与图像处理学习五--图像滤波与增强:线性.非线性滤波.直方图均衡化与Gamma变换 三.图像滤波与增强 3.1 线性滤波 3.1.1 方框滤波 3.1.2 均值滤波 3.1.3 高斯滤波 ...

  3. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-04-基于Python的LeNet之MLP

    原文地址可以查看更多信息 本文主要参考于:Multilayer Perceptron  python源代码(github下载 CSDN免费下载) 本文主要介绍含有单隐层的MLP的建模及实现.建议在阅读 ...

  4. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-03-基于Python的LeNet之LR

    原地址可以查看更多信息 本文主要参考于:Classifying MNIST digits using Logistic Regression  python源代码(GitHub下载 CSDN免费下载) ...

  5. 学习笔记1:更改python下载源

    学习笔记1:更改python下载源,让安装速度更快! 1.常用的国内镜像源 清华镜像源 https://pypi.tuna.tsinghua.edu.cn/simple 中科大镜像源 https:// ...

  6. ROS学习笔记(二)——python、C++编译器以及ROS的安装

    ROS学习笔记(二)--python.C++编译器以及ROS的安装 文章目录 ROS学习笔记(二)--python.C++编译器以及ROS的安装 一.编译器的安装 二.ROS的安装 三.验证: 本文主 ...

  7. Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件

    Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件 用Polyworks脚本开发,没有高级语言的支持,功能难免单一,一些比较复杂的交互实现不了,界面和报告也很 ...

  8. python学习笔记(一)Python 简单介绍

    Python学习笔记(一)Python 简单介绍 Python介绍 Python简介 Python应用领域 Python是解释型的语⾔ 编译和解释的区别是什么? 编译型vs解释型 编译型 解释型 Py ...

  9. Python学习笔记(二)——Python基本图形绘制

    Python学习笔记(二)--Python基本图形绘制 文章目录 Python学习笔记(二)--Python基本图形绘制 不同编程语言的初心和适用对象 Python蟒蛇绘制 五星红旗绘制 这次笔记主要 ...

最新文章

  1. java深拷贝和浅拷贝介绍
  2. ASP.NET Core IP 请求频率限制
  3. 牛客题霸 [ 缺失数字] C++题解/答案
  4. 你想象中的实习是什么样的?
  5. 参数调优为什么要采样_程序员精进之路:性能调优利器--火焰图
  6. mysql8 高可用_mysql系列之8.mysql高可用 (mha4mysql)
  7. 2021年中国一次性个人防护装备市场趋势报告、技术动态创新及2027年市场预测
  8. 中国区Azure基本实例更新
  9. IP地址的分类及子网划分
  10. 各位,请慎用 subList!原来这么多坑!!
  11. 基于ggplot2网络可视化(二)
  12. java:从入门到放弃(二)
  13. 新手学习易语言必须掌握的命令
  14. 放入http请求头中的内容如果含有中文必须编码
  15. 客户端在线更新-QT
  16. 最新大数据产业生态地图:十大爆发点,百大公司起底
  17. 处理器排行_2020新电脑处理器排行榜
  18. 两个led并联和一个电阻串联两个灯不能同时亮问题
  19. windows查看mysql版本
  20. win11系统影响玩游戏吗?适合玩游戏吗?

热门文章

  1. 哈密顿回路/路径学习
  2. Latex安装方式:MiKTeX+Texmaker编辑器
  3. 水产养殖智能管理系统方案
  4. 【线段树_DFS序】POJ 3321 Apple Tree
  5. 机器学习预测实战 -- 信用卡交易欺诈数据监测(含方案和代码思路)
  6. uni-app:登录与支付-- 微信支付
  7. python控制手机-python + adb 实现控制手机
  8. android点击按钮弹出输入框,android 弹出框(输入框和选择框)
  9. MCMC学习笔记-马尔科夫链概述
  10. Linux系统开源浏览器“冰鼬”与“火狐”