数字图像处理-空间滤波

news2024/11/26 0:50:44

请添加图片描述

空间滤波

    1. 空域滤波基础
      – 离散卷积的边缘效应
      在这里插入图片描述在这里插入图片描述在这里插入图片描述
    1. 平滑空间滤波器
      在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
# -*- coding: utf-8 -*-
# Author: Huazhong Yang
# Email: cjdxyhz@163.com
# @Time : 2024/3/7 20:26


import cv2
import numpy as np

# 读取图像
image = cv2.imread('a1.png')

# 应用高斯滤波
# 第二个参数是高斯核的大小,(0, 0) 让OpenCV自动选择,但它必须是正数和奇数。
# 第三个参数是X方向的标准差,第四个参数是Y方向的标准差。
# 如果只指定X方向的标准差,Y方向也会使用相同的值。如果两者都是0,那么它们将从内核大小计算得出。
gaussian_blurred = cv2.GaussianBlur(image, (1, 1), 0)

# 保存结果
cv2.imwrite('gaussian_blurred.jpg', gaussian_blurred)

# 显示原始和处理后的图像
cv2.imshow('Original', image)
cv2.imshow('Gaussian Blurred', gaussian_blurred)
cv2.waitKey(0)
cv2.destroyAllWindows()

  • 阈值处理
# -*- coding: utf-8 -*-
# Author: Huazhong Yang
# Email: cjdxyhz@163.com
# @Time : 2024/3/8 10:10

import cv2
import numpy as np

# 读取图像
image = cv2.imread('a2.png')

# 应用高斯滤波

gaussian_blurred = cv2.GaussianBlur(image, (3, 3), 0)
# 将图像转换为灰度图
gray_image = cv2.cvtColor(gaussian_blurred, cv2.COLOR_BGR2GRAY)
print(gray_image)
# 将图像强度缩放到[0,1]范围
normalized_image = gray_image / 255.0

# 应用阈值处理
# 设置阈值
threshold = 0.6  # 这个阈值是在[0, 1]范围内
_, thresholded_image = cv2.threshold(normalized_image, threshold, 5, cv2.THRESH_BINARY)

# 显示结果
# 注意: 为了使用cv2.imshow显示归一化的图像,我们需要将其转换回[0, 255]范围并转换为uint8
display_image = np.uint8(thresholded_image * 255)
cv2.imshow('Thresholded Image', display_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 如果需要,可以保存结果图像
cv2.imwrite('thresholded_image.jpg', display_image)

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
# Author: Huazhong Yang
# Email: cjdxyhz@163.com
# @Time : 2024/3/8 10:23
import cv2
import numpy as np


def add_salt_and_pepper_noise(image, salt_pepper_ratio=0.5, amount=0.02):
    """
    向图像添加盐和胡椒噪声
    :param image: 原始图像
    :param salt_pepper_ratio: 盐与胡椒的比例
    :param amount: 噪声比例
    :return: 添加噪声后的图像
    """
    noisy_image = np.copy(image)
    num_salt = np.ceil(amount * image.size * salt_pepper_ratio)
    num_pepper = np.ceil(amount * image.size * (1.0 - salt_pepper_ratio))

    # 添加盐噪声
    coords = [np.random.randint(0, i - 1, int(num_salt))
              for i in image.shape]
    noisy_image[coords[0], coords[1]] = 1

    # 添加胡椒噪声
    coords = [np.random.randint(0, i - 1, int(num_pepper))
              for i in image.shape]
    noisy_image[coords[0], coords[1]] = 0
    return noisy_image


def gaussian_lowpass_filter(image, kernel_size=(5, 5), sigma=3):
    """
    使用高斯低通滤波器进行噪声降低
    :param image: 输入图像
    :param kernel_size: 高斯核的大小
    :param sigma: 高斯核的标准差
    :return: 滤波后的图像
    """
    return cv2.GaussianBlur(image, kernel_size, sigma)


def median_filter(image, kernel_size=7):
    """
    使用中值滤波器进行噪声降低
    :param image: 输入图像
    :param kernel_size: 核的大小
    :return: 滤波后的图像
    """
    return cv2.medianBlur(image, kernel_size)


# 读取图像
original_image = cv2.imread('img_1.png', cv2.IMREAD_GRAYSCALE)

# 向图像添加盐和胡椒噪声
noisy_image = add_salt_and_pepper_noise(original_image)

# 使用高斯滤波器降噪
gaussian_filtered_image = gaussian_lowpass_filter(noisy_image)

# 使用中值滤波器降噪
median_filtered_image = median_filter(noisy_image)

# 显示结果
cv2.imshow('Original Image', original_image)
cv2.imshow('Noisy Image', noisy_image)
cv2.imshow('Gaussian Filtered Image', gaussian_filtered_image)
cv2.imshow('Median Filtered Image', median_filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

    1. 锐化空间滤波器
      在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
      在这里插入图片描述
import cv2
import numpy as np

# 读取原始图像
original_image = cv2.imread('path_to_your_image.jpg')

# 确保图像大小为 600x259
original_image = cv2.resize(original_image, (600, 259))

# (b) 使用 31x31 的高斯低通滤波器应用高斯模糊,σ = 5
blurred_image = cv2.GaussianBlur(original_image, (31, 31), 5)

# (c) 计算掩码:原始图像 - 模糊图像
mask = cv2.subtract(original_image, blurred_image)

# (d) 锐化掩蔽:原始图像 + 掩码 (k=1)
unsharp_masking = cv2.add(original_image, mask)

# (e) 高提升滤波:原始图像 + k * 掩码 (k=4.5)
k = 4.5
highboost_filtering = cv2.add(original_image, (mask * k).astype(np.uint8))

# 显示结果或保存结果
cv2.imshow('Original Image', original_image)
cv2.imshow('Blurred Image', blurred_image)
cv2.imshow('Mask', mask)
cv2.imshow('Unsharp Masking', unsharp_masking)
cv2.imshow('Highboost Filtering', highboost_filtering)

cv2.waitKey(0)
cv2.destroyAllWindows()

# 如果需要保存图片
# cv2.imwrite('blurred_image.jpg', blurred_image)
# cv2.imwrite('mask.jpg', mask)
# cv2.imwrite('unsharp_masking.jpg', unsharp_masking)
# cv2.imwrite('highboost_filtering.jpg', highboost_filtering)

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

import cv2
import numpy as np

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

# 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 计算X方向上的Sobel梯度
grad_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)

# 计算Y方向上的Sobel梯度
grad_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)

# 计算合成梯度的绝对值
abs_grad_x = cv2.convertScaleAbs(grad_x)
abs_grad_y = cv2.convertScaleAbs(grad_y)

# 合成最终的梯度
gradient = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)

# 显示结果
cv2.imshow('Original', image)
cv2.imshow('Gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 保存结果图像
cv2.imwrite('edge_enhancement.jpg', gradient)

在这里插入图片描述在这里插入图片描述

# -*- coding: utf-8 -*-
# Author: Huazhong Yang
# Email: cjdxyhz@163.com
# @Time : 2024/3/8 11:12
import cv2
import numpy as np

def apply_dft(image_path):
    # 读取图像并转换为灰度图
    img = cv2.imread(image_path, 0)
    dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
    dft_shift = np.fft.fftshift(dft)

    # 获取图像中心
    rows, cols = img.shape
    crow, ccol = rows // 2, cols // 2

    # (a) 实现低通滤波器
    mask_low = np.zeros((rows, cols, 2), np.uint8)
    mask_low[crow-30:crow+30, ccol-30:ccol+30] = 1

    # (b) 实现高通滤波器
    mask_high = np.ones((rows, cols, 2), np.uint8)
    mask_high[crow-30:crow+30, ccol-30:ccol+30] = 0

    # (c) 实现带阻滤波器
    mask_bandreject = np.ones((rows, cols, 2), np.uint8)
    mask_bandreject[crow-60:crow-30, ccol-60:ccol-30] = 0
    mask_bandreject[crow+30:crow+60, ccol+30:ccol+60] = 0

    # (d) 实现带通滤波器
    mask_bandpass = np.zeros((rows, cols, 2), np.uint8)
    mask_bandpass[crow-60:crow-30, ccol-60:ccol-30] = 1
    mask_bandpass[crow+30:crow+60, ccol+30:ccol+60] = 1

    # 应用滤波器
    fshift_low = dft_shift * mask_low
    fshift_high = dft_shift * mask_high
    fshift_bandreject = dft_shift * mask_bandreject
    fshift_bandpass = dft_shift * mask_bandpass

    # 逆DFT
    img_back_low = cv2.idft(np.fft.ifftshift(fshift_low))
    img_back_low = cv2.magnitude(img_back_low[:, :, 0], img_back_low[:, :, 1])

    img_back_high = cv2.idft(np.fft.ifftshift(fshift_high))
    img_back_high = cv2.magnitude(img_back_high[:, :, 0], img_back_high[:, :, 1])

    img_back_bandreject = cv2.idft(np.fft.ifftshift(fshift_bandreject))
    img_back_bandreject = cv2.magnitude(img_back_bandreject[:, :, 0], img_back_bandreject[:, :, 1])

    img_back_bandpass = cv2.idft(np.fft.ifftshift(fshift_bandpass))
    img_back_bandpass = cv2.magnitude(img_back_bandpass[:, :, 0], img_back_bandpass[:, :, 1])

    # 结果
    cv2.imshow("Original", img)
    cv2.imshow("Low Pass", img_back_low)
    cv2.imshow("High Pass", img_back_high)
    cv2.imshow("Band Reject", img_back_bandreject)
    cv2.imshow("Band Pass", img_back_bandpass)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 应用DFT和滤波器
apply_dft('a1.png')

在这里插入图片描述

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

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

相关文章

微信小程序开发系列(三十)·小程序本地存储API·同步和异步的区别

目录 1. 同步API 1.1 getStorageSync存储API 1.2 removeStorageSync获取数据API 1.3 removeStorageSync删除 1.4 clearStorageSync清空 2. 异步API 2.1 setStorage存储API 2.2 getStorage获取数据API 2.3 removeStorage删除API 2.4 clearStorage清空 3. …

qt vs 编程 字符编码 程序从源码到编译到显示过程中存在的字符编码

理解字符编码,请参考:unicode ucs2 utf16 utf8 ansi GBK GB2312 CSDN博客 汉字(或者说多字节字符)的存放需求,是计算机中各种编码问题的最直接原因。如果程序不直接使用汉字,或间接在所有操作步骤中统一使…

Hilt

1.使用Hilt实现快速依赖注入 1.1 导入依赖 //hilt依赖//Hiltimplementation("com.google.dagger:hilt-android:2.44")annotationProcessor("com.google.dagger:hilt-android-compiler:2.44")1.2 在build.gradle(app)中加入插件 plugins {id("com.an…

大规模自动化重构框架--OpenRewrite浅析

目录 1. OpenRewrite是什么?定位? 2. OpenWrite具体如何做? 3. 核心概念释义 3.1 Lossless Semantic Trees (LST) 无损语义树 3.2 访问器(Visitors) 3.3 配方(Recipes) 4. 参考链接 Open…

SpringBlade error/list SQL 注入漏洞复现

0x01 产品简介 SpringBlade 是一个由商业级项目升级优化而来的 SpringCloud 分布式微服务架构、SpringBoot 单体式微服务架构并存的综合型项目。 0x02 漏洞概述 SpringBlade 框架后台 /api/blade-log/error/list路径存在SQL注入漏洞,攻击者除了可以利用 SQL 注入漏洞获取数…

Redis应用缓存

目录 前言 关于“二八定律” 使用Redis作为缓存 为什么关系型数据库性能不高 为什么并发量高了就容易宕机 Redis就是一个用来作为数据库缓存的常见方案 缓存更新策略 定期生成 搜索引擎为例 实时生成 淘汰策略 FIFO(First In First Out) 先进先出 lRU(Least …

106. Dockerfile通过多阶段构建减小Golang镜像的大小

我们如何通过引入具有多阶段构建过程的Dockerfiles来减小Golang镜像的大小? 让我们从一个通用的Dockerfile开始,它负责处理基本的事务,如依赖项、构建二进制文件、声明暴露的端口等,以便为Go中的一个非常基础的REST API提供服务。…

YoloV8实战:YoloV8-World应用实战案例

摘要 YOLO-World模型确实是一个突破性的创新,它结合了YOLOv8框架的实时性能与开放式词汇检测的能力,为众多视觉应用提供了前所未有的解决方案。以下是对YOLO-World模型的进一步解读: 模型架构与功能 YOLO-World模型充分利用了YOLOv8框架的…

剑指offer面试题34:在二叉树中和为某一值的路径

面试题34:在二叉树中和为某一值的路径 题目: LCR 153. 二叉树中和为目标值的路径 - 力扣(LeetCode) 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路…

C语言 - 各种自定义数据类型

1.结构体 把不同类型的数据组合成一个整体 所占内存长度是各成员所占内存的总和 typedef struct XXX { int a; char b; }txxx; txxx data; typedef struct XXX { int a:1; int b:1; …

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:RichText)

富文本组件,解析并显示HTML格式文本。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。该组件无法根据内容自适应设置宽高属性,需要开发者设置显示布局。 子组件 不包含子组…

封装的echarts子组件使用watch监听option失效的问题

项目场景: 我在项目里面封装了一个echarts组件,组件接收一个来自外部的option,然后我用了一个watch函数去监听这个option的变化,option变化之后,销毁,然后再新建一个charts表 碎碎念 问题如标题所示,这篇…

ubuntu 安装 infiniband 和 RoCE 驱动

下载驱动程序 驱动程序地址 https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/ 安装 安装参考文档 https://docs.nvidia.com/networking/display/mlnxofedv24010331/installing+mlnx_ofed#src-2571322208_InstallingMLNX_OFED-InstallationProced…

十五、计算机视觉-sobel算子

文章目录 前言一、sobel算子的概念二、sobel算子的计算方式三、具体实现 前言 上节课我们学习了梯度的知识,学习了如何去计算梯度,本节我们继续学习计算梯度的方法,本节我们学习使用Sobel算子计算梯度,这与上节课梯度计算方法有所…

Java客户端调用elasticsearch进行深度分页查询 (search_after)

Java客户端调用elasticsearch进行深度分页查询 (search_after) 一. 代码二. 测试结果 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 具体的Search_after解…

科技回顾,飞凌嵌入式受邀亮相第八届瑞芯微开发者大会「RKDC2024」

2024年3月7日~8日,第八届瑞芯微开发者大会(RKDC2024)在福州举行,本届大会以“AI芯片AI应用AloT”为主题,邀请各行业的开发者共启数智化未来。 本届大会亮点颇多,不仅有13大芯片应用展示、9场产品和技术论坛…

28 批量归一化【李沐动手学深度学习v2课程笔记】(备注:这一节讲的很迷惑,很乱)

目录 1.批量归一化 1.1训练神经网络时出现的挑战 1.2核心思想 1.3原理 2.批量规范化层 2.1 全连接层 2.2 卷积层 2.3 总结 3. 代码实现 4. 使用批量规范化层的LeNet 5. 简明实现 1.批量归一化 现在主流的卷积神经网络几乎都使用了批量归一化 批量归一化是一种流行且…

面向对象【static关键字】

文章目录 Java中的static关键字1. 静态变量2. 静态方法的特点3. 静态块4. 静态导入5. 单例模式中的应用 Java中的static关键字 在Java中,static是一个关键字,用于定义类级别的成员,这些成员与类的实例无关。static成员属于类而不是类的实例&…

怎么查看电脑是不是固态硬盘?简单几个步骤判断

随着科技的发展,固态硬盘(Solid State Drive,简称SSD)已成为现代电脑的标配。相较于传统的机械硬盘,固态硬盘在读写速度、稳定性和耐用性等方面都有显著优势。但是,对于不熟悉电脑硬件的用户来说&#xff0…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水下目标检测系统(深度学习模型+UI界面+训练数据集)

摘要:本研究详述了一种采用深度学习技术的水下目标检测系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别水…