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

在计算机视觉领域,图像平滑处理是一个重要的任务,用于降低噪声,提高图像质量。常见的图像平滑算法有均值滤波、中值滤波、高斯滤波等。本文将介绍这些算法的原理,并分别给出使用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.mfbz.cn/a/29801.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是微软的 Application Framework?

我是荔园微风,作为一名在IT界整整25年的老兵,今天来看一下什么是微软的 Application Framework? 到底什么是 Application Framework? 我当年学习这个的时候也困惑了好久,于是一直在搜索这个概念有没有好的解释&#…

ChatGPT时代:ChatGPT全能应用一本通

引言 随着人工智能技术的不断发展和进步,我们进入了ChatGPT时代。ChatGPT是基于GPT架构的大型语言模型,它具备强大的自然语言处理和生成能力,使得我们能够进行更加自由、流畅的对话。作为ChatGPT的全能应用,它可以被视为一本通&a…

【性能优化】性能优化

❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录 性能优化运行效率加载效率减少HTTP请求数量使用CDN缓存压缩文件、混淆样式表放在顶部、js代码放…

广告数仓:采集通道创建

系列文章目录 广告数仓:采集通道创建 文章目录 系列文章目录前言一、环境和模拟数据准备1.hadoop集群2.mysql安装3.生成曝光测试数据 二、广告管理平台数据采集1.安装DataX2.上传脚本生成器3.生成传输脚本4.编写全量传输脚本 三、曝光点击检测数据采集1.安装Zookee…

大数据周会-本周学习内容总结018

开会时间:2023.06.18 15:00 线下会议 01【调研-数据分析(质量、ETL、可视化)】 ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform…

开源游戏区块链项目分享:Unity开发的独立区块链

Arouse Blockchain [Unity独立区块链] ❗️千万别被误导,上图内容虽然都在项目中可寻,但与目前区块链的业务代码关联不大,仅供宣传作用(总得放些图看着好看)。之所以有以上内容是项目有个目标功能是希望每个用户在区块链上都有一个独一无二的…

如何看待 Facebook 上线支付功能?

随着科技的不断进步,电子支付在我们的生活中变得越来越普遍。最近,Facebook宣布推出自己的支付功能,这引起了广泛的关注和讨论。作为世界上最大的社交媒体平台之一,Facebook进入支付领域的举措无疑具有重要意义。那么,…

13年测试老鸟,带你详探服务端的接口测试,测试内卷之路...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 服务器的接口测试…

数据库第三章(SQL)

目录 1.SQL语言 索引 1.SQL语言 sql语言是个非过程性语言 sql的特点 1.综合统一,把增删查改都统一了起来 2.高度非过程化,不关心过程 3.面向集合的操作方式 sql基本语法 drop是删除表 delete是删除表的某个元组 安全方面:grant授权 revo…

EXCEL函数笔记1(数学函数、文本函数、日期函数)

数学函数 取整:INT(number) 取余:MOD(number,除数) 四舍五入:ROUND(number,保留几位小数) 取绝对值:ABS(number) 根号处理:SQRT(number) 0到1随机数:RAND(&am…

【机器学习】十大算法之一 “朴素贝叶斯”

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

【LeetCode】每日一题 -- 1171. 从链表中删去总和值为零的连续节点 -- Java Version

题目链接:https://leetcode.cn/problems/remove-zero-sum-consecutive-nodes-from-linked-list/ 1. 题解(1171. 从链表中删去总和值为零的连续节点) 2021年字节二面真题 1.1 暴力解法:穷举 时间复杂度 O(n2),空间复杂…

【论文】attention is all you need

重点在第三节 attention is all you need摘要1. 绪论2. 背景3. 模型架构3.1 编码器和解码器堆叠 3.2 注意力3.2.1 缩放点积注意力(Scaled Dot-Product Attention)3.2.2 多头注意力机制3.2.3 模型中注意力的应用 3.3 职位感知前馈网络(Positio…

前端中间件Midway的使用

一、 关于midway1. 解决什么痛点2. 期望达到什么效果 二、创建应用并使用1. 创建midway应用2. 认识Midway2.1 目录结构2.2 Controller2.3 路由2.4 获取请求参数2.5 Web中间件2.6 组件使用2.7 服务(service) 三、写到最后 一、 关于midway Midway 是阿里巴巴 - 淘宝前端架构团队…

基于深度学习的高精度安全背心检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度安全背心检测识别系统可用于日常生活中或野外来检测与定位安全背心目标,利用深度学习算法可实现图片、视频、摄像头等方式的安全背心目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

微服务: 01-rabbitmq的应用场景及安装(docker)

目录 1. rabbitmq前言简介: 1.1 RabbitMQ的几个重要作用: -> 1.1.1 解耦: -> 1.1.2 异步通信: -> 1.1.3 流量削峰: -> 1.1.4 消息传递的可靠性和持久性: 2. rabbitmq的安装(docker版) -> 2.1 …

SpringMVC 学习整理

文章目录 一、SpringMVC 简介1.1 什么是MVC1.2 什么是Spring MVC1.3 Spring MVC的特点 二、SpringMVC 快速入门三、RequestMapping注解说明四、SpringMVC获取请求参数4.1 通过ServletAPI获取请求参数4.2 通过控制器方法的形参获取请求参数4.3 通过RequestParam接收请求参数4.4 …

Rust语言从入门到入坑——(2)Rust在windows上搭建开发环境

文章目录 0 引入1、搭建 Visual Studio Code 开发环境1.1、安装 Rust 编译工具1.2 、VS Code安装 2、官网在线3、总结4、引用 0 引入 开始搭建一个适合在windows上运行的Rust环境。 Rust支持的程序语言很多:可详见官网介绍 1、搭建 Visual Studio Code 开发环境 …

[架构之路-211]- 需求- 软架构前的需求理解:ADMEMS标准化、有序化、结构化、层次化需求矩阵 =》需求框架

目录 前言: 一、什么是ADMES: 首先,需求是分层次的: 其次,需求是有结构的,有维度的 再次,不同层次需求、不同维度需求之间可以相互转化(难点、经验积累) 最终,标准…

【雕爷学编程】Arduino动手做(114)---US-015高分辨超声波模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…