技术标签: python 图像处理 数字图像处理学习 opencv
自适应中值滤波算法有两个处理层次:
**层次A:**若zmin<zmed<zmax,则转移到层次B;
否则,增Sxy尺 寸,
若Sxy<Smax,则重复层次A;否则,输出zmed。
**层次B:**若zmin<zxy<zmax,则输出zxy;否则,输出zmed。
既然是中值滤波,那处理椒盐这类冲激噪声肯定比较合适,自适应中值滤波能在有效去除冲激噪声的基础上,平滑其他非冲激噪声,减少失真,保留图像细节,而对于同等大小的中值滤波器,则会损失较多的细节。原理性内容书中有详细的介绍~
运行环境:Python+anaconda
直接上代码(因为是逐个像素操作,所以运行有点慢)
# -*- coding:utf-8 -*-
"""
作者:YJH
日期:2021年10月19日
"""
import matplotlib.pyplot as plt
import cv2 as cv
import numpy as np
# from functools import reduce # 导入reduce,将一个函数作用在一个序列上,并且序列内容自动累计
# 显示汉字
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 定义坐标数字字体及大小
def label_def():
plt.xticks(fontproperties='Times New Roman', size=8)
plt.yticks(fontproperties='Times New Roman', size=8)
# 读取图片
img_saltpep = cv.imread('ckt_saltpep_prob_pt25.tif', 0) # 灰度图,噪声密度50%
def auto_median_filter(image, max_size):
origen = 3 # 初始窗口大小
board = origen//2 # 初始应扩充的边界
# max_board = max_size//2 # 最大可扩充的边界
copy = cv.copyMakeBorder(image, *[board]*4, borderType=cv.BORDER_DEFAULT) # 扩充边界
out_img = np.zeros(image.shape)
for i in range(image.shape[0]):
for j in range(image.shape[1]):
def sub_func(src, size): # 两个层次的子函数
kernel = src[i:i+size, j:j+size]
# print(kernel)
z_med = np.median(kernel)
z_max = np.max(kernel)
z_min = np.min(kernel)
if z_min < z_med < z_max: # 层次A
if z_min < image[i][j] < z_max: # 层次B
return image[i][j]
else:
return z_med
else:
next_size = cv.copyMakeBorder(src, *[1]*4, borderType=cv.BORDER_DEFAULT) # 增尺寸
size = size+2 # 奇数的核找中值才准确
if size <= max_size:
return sub_func(next_size, size) # 重复层次A
else:
return z_med
out_img[i][j] = sub_func(copy, origen)
return out_img
if __name__ == '__main__': # 运行当前函数
img_auto_filter = auto_median_filter(img_saltpep, 7)
img_median = cv.medianBlur(img_saltpep, 7)
# img_re_median = cv.medianBlur(img_auto_filter, 3) # 两次3x3的中值滤波效果才能差不多
plt.subplot(131), plt.imshow(img_saltpep, "gray"), plt.title('椒盐噪声密度50%', fontsize='small'), label_def()
plt.subplot(132), plt.imshow(img_auto_filter, "gray"), plt.title('自适应中值滤波', fontsize='small'), label_def()
plt.subplot(133), plt.imshow(img_median, "gray"), plt.title('中值滤波', fontsize='small'), label_def()
# plt.subplot(144), plt.imshow(img_re_median, "gray"), plt.title('再中值滤波', fontsize='small'), label_def()
plt.show()
效果还是挺好的
目前正在学习中,欢迎大家批评指正~
文章浏览阅读8.7k次,点赞3次,收藏39次。Docker 官方提供了一个搭建私有仓库的镜像 registry ,运行该镜像的容器并且对外暴露5000端口就ok了。_docker 私人仓库
文章浏览阅读1.6w次。在服务器上运行python安装包时候出现:distutils.errors.DistutilsError: Could not find suitable distribution for Requirement.parse(‘flake8’)解析google-apputils,找不到合适的分布需求解决方法:pip install google-apputils再次运行安装即可..._distutils.errors.distutilserror: could not find suitable distribution for re
文章浏览阅读667次。故障排查与调试:嵌入式系统通常运行在资源有限的环境中,故障排查和调试变得尤为复杂。日志系统可以记录系统在运行过程中的各种操作、状态和事件信息,方便开发人员追踪和定位问题所在。通过分析日志,可以快速找到故障源,并进行相应的修复和调试。系统性能优化:嵌入式系统的资源有限,因此性能优化尤为关键。日志系统可以记录系统运行过程中的性能指标,如任务执行时间、资源利用率等。通过分析这些日志,可以发现系统性能瓶颈,进行性能优化和资源管理,提高系统的响应速度和资源利用效率。_freertos日志
文章浏览阅读86次。笔记笔记笔记-待更新二维数组中查找题目在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数思路从最右一列往下查找,效率比直接遍历高代码# -*- coding:utf-8 -*-class Solution:# array 二维列表def Find(self, ..._res=[] for i in b: res.append(min_1(a,i)) tem = np.array(res).min() return t
文章浏览阅读2.9k次,点赞2次,收藏3次。首先看一下LinearLayout布局中Layout_weight属性的作用:它是用来分配属于空间的一个属性,你可以设置他的权重。很多人不知道剩余空间是个什么概念,下面我先来说说剩余空间。看下面代码:android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_par..._"android:layout_weight=\"1"
文章浏览阅读94次。JenkinsJenkins is a self-contained, open source automation server which can be used to automate all sorts of tasks related to building, testing, and delivering or deploying software.主要介绍使用Jenkins..._jenkins构建javaweb应用指定war包名
文章浏览阅读99次。在拿到一个 webshell 之后,大家首先会想到去把自己的权限提升到最高,windows 我们会提升到 SYSTEM 权限,而 Linux 我们会提升到 root 权限,拿在进行 Linux 提权的时候我们要进行哪些操作呢?需要了解哪些信息?使用什么样的命令?这些就是本文的重点。关于Linux权限提升,有下面几个步骤:信息收集:尽量收集更多的关于系统的信息。数据分析:通过把收集到的数..._执行提权命令的流量包有哪些内容
文章浏览阅读3.7k次,点赞19次,收藏20次。我们提出了 VLOGGER,这是一种从一个人的单个输入图像生成音频驱动的人类视频的方法,它建立在最近生成扩散模型的成功之上。我们的方法包括 1) 随机人到 3d 运动扩散模型,以及 2) 一种新颖的基于扩散的架构,该架构通过空间和时间控制来增强文本到图像模型。这支持生成可变长度的高质量视频,通过人脸和身体的高级表示轻松控制。与之前的工作相比,我们的方法不需要对每个人进行训练,不依赖于人脸检测和裁剪,生成完整的图像(而不仅仅是人脸或嘴唇),并考虑广泛的场景(例如可见的躯干或不同的主题身份),这对于正确合成交流_vlogger: multimodal diffusion for embodied avatar synthesis
文章浏览阅读936次,点赞4次,收藏6次。1 NAO机器人硬件1.1 红外线 红外线发射角度-60°~+60°,波长940nm.1.2 超声波(声纳) NAO能够探测前方0.25~2.55m内是否有障碍物,探测角度60°,超声波频率为49kHZ.1.3 传感器1.3.1 接触传感器 触摸、按压、划过接触传感器可以出发接触传感器产生电信号,进而完成向机器人输入信息. 头部:前中后三个触摸传感器。 手..._nao机器人原理
文章浏览阅读218次。前言IT系统经过长时间的运行,其作用越来越大,企业的各项运作都严重依赖于IT系统的正常运行;但由于IT系统越来越复杂、资料量越来越庞大、业务类型也越来越多样化,因此IT人员每天都必需面临着如下问题:如何确保系统的正常运行?如何确保业务的连续性和容灾保障?如何提高容灾系统可用性,分担源主产端的业务压力?如何实现硬件平台的开放、异构架构?RealSync复制系统定..._realsync
文章浏览阅读101次。1、环境安装Git最新版下载地址:https://gitforwindows.org/TortoiseGit,Git客户端,32/64位最新版及对应的语言包下载地址:https://tortoisegit.org/download/安装的方法,一直下一步就行,具体做法省略。2、配置 1、首先,请选定一个存放Git项目的目录,这样管理方便. 如:D:\te..._git.w
文章浏览阅读6.9k次,点赞4次,收藏7次。一、触发碰撞和刚体碰撞共性:碰撞双方都需要加碰撞器组件,至少有一个添加了刚体组件rigidbody;异同:触发碰撞需要在 碰撞器勾选is trigger选项,刚体碰撞需要使用物理动力模式(isKinematic 选项不能勾选)二、OnTriggerEnter事件执行特点;OnTriggerEnter事件不是每帧调用的,它是基于RigidBody物理碰撞后调用的,不管事件所在的脚本是..._ontriggerenter