机器视觉初步5-1:图像平滑专题

news2024/10/6 20:27:07

在计算机视觉领域,图像平滑处理是一个重要的任务,用于降低噪声,提高图像质量。常见的图像平滑算法有均值滤波、中值滤波、高斯滤波等。本文将介绍这些算法的原理,并分别给出使用Python与Halcon实现的代码。(当前版本:python3.9、halcon19)

本章目录

  • 1. 均值滤波
  • 2.中值滤波
  • 3.高斯滤波
  • 4.双边滤波

1. 均值滤波

均值滤波是最简单的图像平滑方法,将每个像素替换为其周围像素的平均值。
中值滤波是一种非线性滤波,在处理脉冲噪声以及椒盐噪声时效果极佳,能够有效的保护好图像的边缘信息。

均值滤波,也就是计算每一个像素点周围像素点(包括该点)的平均值,作为该像素点滤波之后的值,通常取以该像素点为中心的矩形窗口内的所有像素点来计算平均值,矩形窗口的大小一般为33,55,99,…,(2n+1)(2n+1)。
窗口越大,滤波效果越好,但是图像也变得更加模糊,所以需要根据实际情况设置矩形窗口的大小。比如3*3窗口的均值滤波如下图所示,点(x,y)的滤波值由其周围9个点(包括其自身)计算平均值得到。在这里插入图片描述
在这里插入图片描述

在Python中,可以使用NumPy库实现均值滤波。以下是Python代码示例:

import numpy as np
import cv2
def blur(image):
    return np.mean(image, axis=0)

# 读取图像
image = cv2.imread('path/to/your/image.jpg')

# 应用均值滤波
blurred_image = blur(image)

# 显示原始图像与均值滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在Halcon中,可以使用mean_image算子实现均值滤波。以下是Halcon代码示例:

* 定义图像
read_image (Image, 'path/to/your/image.jpg')

* 转换为灰度图像
rgb1_to_gray (Image, GrayImage)

* 应用均值滤波
mean_image (GrayImage, Image, 6,6)

* 显示原图像与均值滤波后的图像
dev_display (Image)
dev_display (Image)

2.中值滤波

中值滤波是一种非线性滤波方法,将每个像素替换为其邻域内像素值的中值,如下图,红色方块中央是方块内9个字排序后的中值。
在这里插入图片描述

在Python中,可以使用NumPy库实现中值滤波。以下是Python代码示例:

import numpy as np
import cv2

def median_filter(image, kernel_size):
    return np.median(image, axis=0)

# 读取图像
image = cv2.imread('yourpic.jpg')

# 应用中值滤波
median_filtered_image = median_filter(image, kernel_size=(3, 3))

# 显示原始图像与中值滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Median Filtered Image', median_filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在Halcon中,可以使用MedianBlur算子实现中值滤波。以下是Halcon代码示例:

* 定义图像
read_image(Image,'youimage.jpg')

* 转换为灰度图像
rgb1_to_gray (Image, GrayImage)

* 应用中值滤波
median_image(Image,ImageMedian,'square',3,3)
* 显示原图像与中值滤波后的图像
dev_display (Image)
dev_display (Image)

3.高斯滤波

高斯滤波是一种线性滤波方法,将每个像素替换为其邻域内像素值的加权平均。
要模糊一张图像,可以这么做:对于每个像素点,以它为中心,取其3x3区域内所有像素灰度值的平均作为中心点的灰度值。可是,如果仅使用简单平均,显然不是很合理,因为图像都是连续的,越靠近的点关系越密切,越远离的点关系越疏远。

因此,加权平均更合理,距离越近的点权重越大,距离越远的点权重越小。而正态分布显然是一种可取的权重分配模式。由于图像是二维的,所以需要使用二维的高斯函数。
高斯模糊本质上就是利用 高斯函数 生成的 高斯核(高斯模板) 对图像进行卷积操作。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将这9个值加起来,就是中心点25进行高斯滤波后的值。对所有点重复这个过程,就得到了高斯模糊后的图像。

在Python中,可以使用NumPy库实现高斯滤波。以下是Python代码示例:

import numpy as np

def gaussian_filter(image, sigma):
    filtered_image = np.gaussian_filter(image, sigma=sigma, axis=0)
    return filtered_image

# 读取图像
image = cv2.imread('path/to/your/image.jpg')

# 应用高斯滤波
gaussian_filtered_image = gaussian_filter(image, sigma=3)

# 显示原始图像与高斯滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Gaussian Filtered Image', gaussian_filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在Halcon中,可以使用gauss_filter算子实现高斯滤波。以下是Halcon代码示例:

* 定义图像
read_image (Image, 'path/to/your/image.jpg')

* 转换为灰度图像
rgb1_to_gray (Image, GrayImage)

* 应用高斯滤波
gauss_filter(Image,ImageGauss,3)

* 显示原图像与高斯滤波后的图像
dev_display (Image)
dev_display (Image)

这些基本的图像平滑算法在实际应用中非常有用。根据特定需求,还可以使用其他高级滤波方法,如双边滤波、Sobel算子等。

4.双边滤波

双边滤波结合了空间滤波(比如均值滤波)和高斯滤波的优点,同时考虑了像素之间的空间距离和像素值的相似性。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在Python中,可以使用NumPy库实现双边滤波。以下是Python代码示例:

import numpy as np

def bilateral_filter(image, sigma_r, sigma_g, sigma_b, filter_size):
    """
    bilateral_filter(image, sigma_r, sigma_g, sigma_b, filter_size)
    :param image: 要进行滤波的图像
    :param sigma_r: 半径为 r 的邻域内像素值的方差
    :param sigma_g: 半径为 g 的邻域内像素值的方差
    :param sigma_b: 半径为 b 的邻域内像素值的方差
    :param filter_size: 滤波核大小
    :return: 处理后的图像
    """
    filtered_image = np.zeros((image.shape[0], image.shape[1], 3), np.uint8)

    for r in range(filter_size - 1):
        for g in range(filter_size - 1):
            for b in range(filter_size - 1):
                # 计算加权系数
                weights = np.exp(np.log(sigma_r) * (r - filter_size / 2)) * np.exp(np.log(sigma_g) * (g - filter_size / 2)) * np.exp(np.log(sigma_b) * (b - filter_size / 2))
                # 应用双边滤波
                filtered_image[r + (filter_size - 1) * (r + g + b):r + (filter_size - 1) * (r + g + b) + image.shape[0],
                               g + (filter_size - 1) * (r + g + b):g + (filter_size - 1) * (r + g + b) + image.shape[1],
                               b + (filter_size - 1) * (r + g + b):b + (filter_size - 1) * (r + g + b) + image.shape[1],
                               cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP] + image[r + (filter_size - 1) * (r + g + b):r + (filter_size - 1) * (r + g + b) + image.shape[0],
                                                                       g + (filter_size - 1) * (r + g + b):g + (filter_size - 1) * (r + g + b) + image.shape[1],
                                                                       b + (filter_size - 1) * (r + g + b):b + (filter_size - 1) * (r + g + b) + image.shape[1],
                                                                       cv2.INTER_LINEAR + weights]
    return filtered_image

# 读取图像
image = cv2.imread('path/to/your/image.jpg')

# 应用双边滤波
bilateral_filtered_image = bilateral_filter(image, 5, 5, 5, (5, 5))

# 显示原图像与双边滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Bilateral Filtered Image', bilateral_filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在Halcon中,可以使用bilateral_filter算子实现双边滤波。以下是Halcon代码示例:

* 图像双边滤波

* 读取图像
read_image(src,'fabrik')

* 添加噪声
add_noise_white(src,src_noise,20)

* 双边滤波
bilateral_filter(src_noise,src_noise,result,5,20,[],[])

dev_display(result)

本章讲述了图像平滑的四种常见处理方式,下一章节,我们将对图像增强的常见算法做深入探究。
喜欢的朋友就点个赞、收藏一下哈,再会!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/660602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

libface 人脸检测

于老师的项目地址GitHub - ShiqiYu/libfacedetection: An open source library for face detection in images. The face detection speed can reach 1000FPS. 关于如何使用,于老师写得很清楚: 测试代码 CMakeList.txt 和 三个face开头的cpp文件都是于老…

有趣的数学 数学建模入门一 从几个简单的示例入手

一、“变量”的概念 一个代数表达式(通常只有一个字母:x,y,z…,如果它取代了一个未知值(物理、经济、时间等),则称为“变量”。 变量的作用是占据一个值所在的位置,如果该…

设计模式之工厂方法模式笔记

设计模式之工厂方法模式笔记 说明Factory Method(工厂方法)目录UML抽象工厂示例类图咖啡抽象类美式咖啡类拿铁咖啡类 咖啡工厂接口美式咖啡工厂类拿铁咖啡工厂类 咖啡店类测试类 说明 记录下学习设计模式-工厂方法模式的写法。 Factory Method(工厂方法) 意图:定义一个用于创…

深度学习图像分类、目标检测、图像分割源码小项目

​demo仓库和视频演示: 银色子弹zg的个人空间-银色子弹zg个人主页-哔哩哔哩视频 卷积网路CNN分类的模型一般使用包括alexnet、DenseNet、DLA、GoogleNet、Mobilenet、ResNet、ResNeXt、ShuffleNet、VGG、EfficientNet和Swin transformer等10多种模型 目标检测包括…

Sourcetree 打开闪退怎么处理

问题描述:Sourcetree打开闪退,已管理员身份运行仍然闪退 解决方法; 在Sourcetree图标上右键,然后打开文件所在位置: 找到目录 xxxx\AppData\Local\Atlassian 删除箭头所指向文件即可。

2023年怎么移除微博粉丝 微博怎么批量移除粉丝方法

2023最新微博批量粉丝移除_手机微博粉丝怎么批量删除 使用微博粉丝移除工具:可以帮助用户快速批量移除粉丝。在微博管理工具中,用户可以根据自己的需要设置移除粉丝的数量,可以一键批量移除多个粉丝。此外,管理工具还提供了粉丝管…

Linux下使用Samba做域控

AI画妹子的工作先暂告一段落。毕竟戗行也是要有门槛的。 企业中使用Windows Server使用活动目录集中管理PC、服务器是很成熟的方案。突然想到,如果有一天出于某种原因不再使用微软方案了,AD该如何替代?问了一下chatGPT,它说&…

[Qt 教程之Widgets模块] —— QComboBox 组合框

Qt系列教程总目录 文章目录 一、创建QComboBox二、数据结构三、成员函数1. 添加选项2. 插入选项3. 删除选项4. 选项属性5. 当前选择的item6. 用户是否可编辑组合框7. 设置显示item的个数8. 组合框的item个数9. 添加重复的item10. 是否绘制边框11. 查找item12. 插入策略13. 大小…

NodeJS LocalDomainName⑩④

文章目录 ✨文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹支持😘前言 L o c a l D o m a i n N a m e LocalDomainName LocalDomainName 本地域名 O p e r a t i o n P r o c e d u r e OperationProcedure OperationProced…

【MySQL】一文带你了解过滤数据

🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指…

LAMP架构搭建

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、Apache服务1.apache概述2.apache的特点3.apache的软件版本4.编译安装优点5.安装步骤 二、LAMP简介与概述1.LAMP平台概述2.构建LAMP平台顺序3.各组件的主要作用 …

KafKa 3.x(一、入门)

前置:熟悉javase,熟悉linux,熟悉idea,熟悉hadoop 1. KafKa 1.1 KafKa定义 前端埋点记录用户(浏览,点赞,收藏,评论)到日志服务器,然后通过Flume&#xff08…

k8s Service服务详解

1. Service 的概念: k8s中Service定义了这样一种抽象:一个pod的逻辑分组,一种可以访问他们的策略—通常称为微服务。这一组pod能够被Service访问到,通常是通过Label Selector Service能够提供负载均衡的能力,但是在使…

第二章 逻辑代数基础--数电(期末复习笔记)

第二章 逻辑代数基础 2.1 概述 逻辑:事物间的因果关系。 逻辑运算:逻辑状态按照指定的某种因果关系进行推理的过程。 逻辑变量:用字母表示,取值只有0和1。此时,0和1不再表示数量的大小,只代表两种不同的状…

人工智能期末复习(简答)

第1章 人工智能概述 1.什么是人工智能? 人工智能(Artificial Intelligence, AI),又称机器智能(MI,Machine Intelligence), 主要研究用人工的方法和技术开发智能机器或智能系统,以模…

交换机配置DHCP服务(华为交换机)

#三层交换机互联互通 配置 #进入系统视图 <Huawei>system-view #关闭系统提示信息 [Huawei]undo info-center enable #启动DHCP功能 [Huawei]dhcp enable #创建vlan 10 并配置 vlanif 地址 [Huawei]vlan 10 [Huawei-vlan10]int vlanif 10 [Huawei-Vlanif10]ip addr…

软考A计划-网络工程师-专业英语

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

初识轻量级分布式任务调度平台 xxl-job

文章目录 前言xxl-job的目录结构项目依赖 (父 pom.xml)xxl-job-admin 启动xxl-job-executor-sample (项目使用示例)xxl-job-executor-sample-frameless : 不使用框架的接入方式案例xxl-job-executor-sample-springboot : springboot接入方案案例 xxl-job执行器器启动流程分析调…

python高效使用方法03_pandas中的rolling.mean滚动求均值效率究竟如何?

先上图来说明pandas.rolling(n).mean()滚动求均值的方法效率其实并不是最高的&#xff0c;我自己尝试使用cython把滚动求均值的方法重新编译了一下&#xff0c;发现效率总体上是pandas的三倍以上。 总结&#xff1a;pandas比较合适用于普通的研究分析工作&#xff0c;如果用到追…

AcWing802:详解

原题引出 题解分析 首先毫无置疑的是本体需要用到离散化的知识&#xff0c;将输入的索引下标放到一个vector当中存起来&#xff0c;在该vector当中&#xff0c;利用其本身的索引我们对称构造两个数组a和s&#xff08;用于求前缀和&#xff09;。那么最关键的一个问题就是如何通…