三、直方图均衡化

1. 普通直方图均衡化

直方图均衡化的原理是将图像的灰度直方图展平,使得每个灰度级都有更多的像素分布,从而增强图像的对比度。具体步骤如下:

  • 计算灰度直方图:统计图像中每个灰度级的像素数量。
  • 计算累积分布函数(CDF):计算每个灰度级的累积概率。
  • 映射灰度值:将原始图像中的每个灰度值映射到新的灰度值,使得新的灰度分布更加均匀。
  • 生成均衡化后的图像:使用映射后的灰度值生成新的图像。
    在这里插入图片描述
    在这里插入图片描述
import cv2
import numpy as np
import matplotlib.pyplot as pltdef histogram_equalization(image):"""直方图均衡化:param image: 输入图像(灰度图像):return: 处理后的图像"""if len(image.shape) == 3:image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)equalized_image = cv2.equalizeHist(image)return equalized_imagedef main():# 读取图像image = cv2.imread('demo.jpg')if image is None:print("Error: Could not read image.")return# 直方图均衡化equalized_image = histogram_equalization(image)# 显示原始图像和处理后的图像plt.figure(figsize=(8, 4))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(equalized_image, cmap='gray')plt.title('Histogram Equalized Image')plt.axis('off')plt.tight_layout()plt.show()# 显示直方图plt.figure(figsize=(12, 6))plt.subplot(1, 2, 1)plt.hist(image.ravel(), 256, [0, 256], color='gray', alpha=0.7)plt.title('Histogram of Original Image')plt.xlabel('Pixel Value')plt.ylabel('Frequency')plt.subplot(1, 2, 2)plt.hist(equalized_image.ravel(), 256, [0, 256], color='gray', alpha=0.7)plt.title('Histogram of Equalized Image')plt.xlabel('Pixel Value')plt.ylabel('Frequency')plt.tight_layout()plt.show()if __name__ == "__main__":

2. 限制对比度自适应直方图均衡化(Contrast Limited Adaptive Histogram Equalization, CLAHE)

限制对比度自适应直方图均衡化在直方图均衡化的基础上进行了改进,通过限制对比度和局部均衡化来避免过度增强图像的对比度,从而减少噪声和不自然的效果。基本原理如下:

  • 图像分割:将图像分割成若干个小块(称为“tiles”),每个小块的大小由 tileGridSize 参数指定。
  • 局部均衡化:对每个小块分别进行直方图均衡化。为了限制对比度,使用 clipLimit 参数来限制每个小块的直方图中像素值的最大数量。
  • 插值平滑:将每个小块均衡化后的结果通过插值技术合并,以避免明显的边界和不连续性。

在这里插入图片描述

import cv2
import numpy as np
import matplotlib.pyplot as pltdef clahe_equalization(image, clipLimit=2.0, tileGridSize=(8, 8)):"""CLAHE均衡化:param image: 输入图像(灰度图像):param clipLimit: 对比度限制阈值:param tileGridSize: 小块大小:return: 处理后的图像"""if len(image.shape) == 3:image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)clahe = cv2.createCLAHE(clipLimit=clipLimit, tileGridSize=tileGridSize)clahe_image = clahe.apply(image)return clahe_imagedef main():# 读取图像image = cv2.imread('demo.jpg')if image is None:print("Error: Could not read image.")return# CLAHE均衡化clahe_image = clahe_equalization(image, clipLimit=2.0, tileGridSize=(8, 8))# 显示原始图像和处理后的图像plt.figure(figsize=(8, 4))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(clahe_image, cmap='gray')plt.title('CLAHE Equalized Image')plt.axis('off')plt.tight_layout()plt.show()# 显示直方图plt.figure(figsize=(12, 6))plt.subplot(1, 2, 1)plt.hist(image.ravel(), 256, [0, 256], color='gray', alpha=0.7)plt.title('Histogram of Original Image')plt.xlabel('Pixel Value')plt.ylabel('Frequency')plt.subplot(1, 2, 2)plt.hist(clahe_image.ravel(), 256, [0, 256], color='gray', alpha=0.7)plt.title('Histogram of CLAHE Equalized Image')plt.xlabel('Pixel Value')plt.ylabel('Frequency')plt.tight_layout()plt.show()if __name__ == "__main__":main()

四、空间域(增强)

空间域增强方法直接操作图像的像素值,常用于提高图像的可视性和特征表现。空间域增强方法可以分为线性滤波和非线性滤波两大类。此外,边缘检测也是一种重要的空间域增强技术,用于突出图像中的边缘和细节。

1. 线性滤波

线性滤波通过卷积操作对图像进行处理,常用的线性滤波器包括方框滤波、均值滤波器、高斯滤波器和锐化滤波器等。

(1) 方框滤波(Box Filtering)

方框滤波是一种简单的均值滤波,通过计算每个像素邻域内的平均值来平滑图像。具体来说,对于每个像素,取其邻域内的所有像素值的平均值作为该像素的新值。
在这里插入图片描述

import cv2
import numpy as np
import matplotlib.pyplot as pltdef box_filter(image, kernel_size=(3, 3)):"""方框滤波:param image: 输入图像:param kernel_size: 滤波器大小:return: 处理后的图像"""filtered_image = cv2.boxFilter(image, -1, kernel_size)return filtered_imagedef main():# 读取图像image = cv2.imread('demo.jpg')if image is None:print("Error: Could not read image.")return# 方框滤波box_filtered_image = box_filter(image, kernel_size=(5, 5))# 显示原始图像和处理后的图像plt.figure(figsize=(8, 4))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(cv2.cvtColor(box_filtered_image, cv2.COLOR_BGR2RGB))plt.title('Box Filtered Image')plt.axis('off')plt.tight_layout()plt.show()if __name__ == "__main__":main()

(2) 均值滤波器(Mean Filter)

均值滤波器通过计算每个像素邻域内的平均值来平滑图像。具体来说,对于每个像素,取其邻域内的所有像素值的平均值作为该像素的新值。
在这里插入图片描述

import cv2
import numpy as np
import matplotlib.pyplot as pltdef mean_filter(image, kernel_size=(3, 3)):"""均值滤波:param image: 输入图像:param kernel_size: 滤波器大小:return: 处理后的图像"""filtered_image = cv2.blur(image, kernel_size)return filtered_imagedef main():# 读取图像image = cv2.imread('demo.jpg')if image is None:print("Error: Could not read image.")return# 均值滤波mean_filtered_image = mean_filter(image, kernel_size=(5, 5))# 显示原始图像和处理后的图像plt.figure(figsize=(8, 4))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(cv2.cvtColor(mean_filtered_image, cv2.COLOR_BGR2RGB))plt.title('Mean Filtered Image')plt.axis('off')plt.tight_layout()plt.show()if __name__ == "__main__":main()

(3) 高斯滤波器(Gaussian Filter)

高斯滤波器通过高斯核对图像进行卷积操作,以平滑图像并减少噪声。高斯核的权重分布符合高斯分布,中心权重最大,边缘权重逐渐减小。
在这里插入图片描述

import cv2
import numpy as np
import matplotlib.pyplot as pltdef gaussian_filter(image, kernel_size=(5, 5), sigmaX=0):"""高斯滤波:param image: 输入图像:param kernel_size: 滤波器大小:param sigmaX: 高斯核的标准差:return: 处理后的图像"""filtered_image = cv2.GaussianBlur(image, kernel_size, sigmaX)return filtered_imagedef main():# 读取图像image = cv2.imread('demo.jpg')if image is None:print("Error: Could not read image.")return# 高斯滤波gaussian_filtered_image = gaussian_filter(image, kernel_size=(5, 5), sigmaX=0)# 显示原始图像和处理后的图像plt.figure(figsize=(8, 4))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(cv2.cvtColor(gaussian_filtered_image, cv2.COLOR_BGR2RGB))plt.title('Gaussian Filtered Image')plt.axis('off')plt.tight_layout()plt.show()if __name__ == "__main__":main()

(4) 锐化滤波器(Sharpening Filter)

锐化滤波器通过增强图像的边缘和细节来提高图像的清晰度。常用的锐化滤波器包括拉普拉斯算子和高通滤波器。
在这里插入图片描述

import cv2
import numpy as np
import matplotlib.pyplot as pltdef sharpen_filter(image, kernel_size=(3, 3), alpha=1.5):"""锐化滤波:param image: 输入图像:param kernel_size: 滤波器大小:param alpha: 锐化因子:return: 处理后的图像"""# 创建锐化滤波器kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT——信号与槽/自定义信号与槽

1 信号与槽基本介绍 提出疑问,界面上已经有按键了,怎么操作才能让用户按下按键后有操作上的反应呢? 在 Qt 中,信号和槽机制是一种非常强大的事件通信机制。这是一个重要的概念,特别是对于初学者来说,理解它…

Spring原理揭秘--Spring的AOP

在这之前我们已经介绍了AOP的基本功能和概念,那么当AOP集成到spring则会发生改变。Spring AOP 中的Joinpoint:之前提高了很多Joinpoint的类型,但是在spring中则只会有方法级别的Joinpoint,像构造方法,字段的调用都没适…

C++学习笔记五

C继承//基类 class Animal{};//派生类 class Dog : public Animal{};#include<iostearm> using namespace std;//基类 class Shape{public:void setwidth(int w){width w;}void setheight(int h){height h;}protected:int width;int height;}//派生类 class Rectangle …

AndroidStudio环境搭建

一、AndroidStudio下载 正常百度出来的站会自动翻译成中文&#xff0c;导致历史版本的界面总是显示不出可下载的地方&#xff0c;点击成切回英文&#xff0c;就能看出了。 历史版本&#xff1a;https://developer.android.google.cn/studio/archive

Java大厂面试实录:从Spring Boot到AI大模型的深度技术拷问

场景&#xff1a;互联网大厂Java后端面试 面试官&#xff08;严肃&#xff09;&#xff1a;小曾&#xff0c;请坐。今天主要考察Java后端技术栈&#xff0c;包括微服务、大数据、AI等。我们先从简单问题开始。 小曾&#xff08;搓手&#xff09;&#xff1a;好嘞&#xff01;面…

深入解析Hadoop中的HDFS架构设计

HDFS概述与核心设计原则作为Hadoop生态系统的基石&#xff0c;HDFS&#xff08;Hadoop Distributed File System&#xff09;是一种专为大规模数据处理而设计的分布式文件系统。它的核心设计理念源于对互联网时代数据特征的深刻洞察——数据规模呈指数级增长&#xff0c;而硬件…

ota之.加密算法,mcu加密方式

一、ota之.加密算法&#xff0c;mcu加密方式 前面一篇文章&#xff0c;讲了soc的加密方式&#xff0c;但是soc资源充足&#xff0c;mcu没有&#xff0c;所以不会用openss生成公私钥 切计算哈希用rsa256位。 ECC&#xff08;椭圆曲线加密&#xff09; 是一种非对称加密算法&…

LangChain面试内容整理-知识点23:实战案例:检索增强生成(RAG)系统

检索增强生成(Retrieval-Augmented Generation, RAG)是一种将LLM与外部知识库结合的方法,通过实时检索相关信息来辅助生成答案。这极大缓解了LLM“封闭知识”过期或不足的问题。LangChain非常适合构建RAG系统,因为它提供了文档加载、向量存储、检索接口、LLM组合的一站式方…

探索阿里云ESA:开启边缘安全加速新时代

阿里云 ESA 是什么&#xff1f;阿里云 ESA&#xff0c;全称边缘安全加速&#xff08;Edge Security Acceleration&#xff09; &#xff0c;其前身为全站加速 DCDN&#xff08;Dynamic Content Delivery Network&#xff09;。在 2024 年 9 月 30 日&#xff0c;阿里云完成了这…

醋酸铈:赋能科技创新的稀土之力

一、什么是醋酸铈醋酸铈是铈元素与醋酸根离子形成的化合物。铈作为稀土元素中的重要一员&#xff0c;广泛应用于材料科学、催化剂、电子产品等领域。醋酸铈以无色结晶或浅黄色结晶的形式存在&#xff0c;是铈的有机盐之一。它不仅具有稳定的化学性质&#xff0c;而且在某些特定…

数据结构之普利姆算法

前言&#xff1a;Prim算法是图论中的算法&#xff0c;用来生成图的最小生成树。本篇文章介绍算法的流程&#xff0c;实现思想&#xff0c;和具体代码实现&#xff0c;使用c语言。学习需要输出才能理解的更透彻&#xff0c;所以说坚持写文章&#xff0c;希望可以用自己的方式把一…

构建强大的物联网架构所需了解的一切

数据正驱动着当今的商业发展&#xff0c;而物联网&#xff08;IoT&#xff09;则有助于为企业的增长和创新开辟新的机遇。麦肯锡的研究表明&#xff0c;全球数据在四年内实现了惊人的 7 倍增长。随着越来越多的物联网设备进入市场&#xff0c;更多企业开始需要强大的物联网架构…

java之json转excel生成

背景 业务为实现自定义样式excel的导出&#xff0c;常规的做法就是根据数据在代码中进行类似模版的配置&#xff1b;这样的体验不是很好&#xff0c;只要用户改变下样式的设置不用代码改动就能实现自定义excel的导出更加灵活。 以下是具体实现 pom依赖 <dependency><g…

新版本Cursor中配置自定义MCP服务器教程,附MCP工具开发实战源码

在 Cursor 中配置自定义 MCP 服务器&#xff1a;打造你的 AI 开发工具链 引言 随着 AI 编程助手的普及&#xff0c;开发者们越来越希望能够定制化自己的开发环境。Cursor 作为一款强大的 AI 编程编辑器&#xff0c;提供了 Model Context Protocol (MCP) 支持&#xff0c;新版本…

前端面试十二之vue3基础

一、ref和reactive在 Vue 3 中&#xff0c;ref 和 reactive 是两种主要的响应式数据创建方式&#xff0c;它们各有特点和适用场景。1.refref 主要用于创建单个值的响应式引用&#xff0c;通常用于基本类型数据&#xff0c;如数字、字符串等。使用 ref 创建的引用对象可以通过 .…

设计模式四:装饰模式(Decorator Pattern)

装饰模式是一种结构型设计模式&#xff0c;它允许你动态地给一个对象添加额外的职责&#xff0c;相比继承更加灵活。1. 模式定义装饰模式&#xff1a;动态地给一个对象添加一些额外的职责。就增加功能来说&#xff0c;装饰模式相比生成子类更为灵活。2. 模式结构主要角色&#…

神经网络常见激活函数 14-Mish函数

文章目录Mish函数导函数函数和导函数图像优缺点PyTorch 中的 Mish 函数TensorFlow 中的 Mish 函数Mish 论文 https://arxiv.org/pdf/1908.08681 函数导函数 Mish函数 Mish(x)x⋅tanh⁡⁣(softplus(x))x⋅tanh⁡⁣(ln⁡⁣(1ex))\begin{aligned} \text{Mish}(x) & x \cdot \t…

LAMP迁移LNMP Nginx多站点配置全流程

文章目录前言备份与停止服务nginx安装与配置nginx 编译安装配置服务php-fpm多站点配置phf-fpm介绍多站点配置nginx 多站点配置nginx ssl 配置参考前言 之前服务器使用的是 LAMP环境&#xff0c;想充分利用服务器资源&#xff0c;再运行另外一个站点 在LAMP环境下应该是也可以…

Nginx屏蔽国外IP访问

下载IP列表 # 下载到文件 wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest # 直接输出到终端 curl -sSL https://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest得到一份国内IP配置 # 原始IP列表格式&#xff1a;apnic|CN|ipv4|218.78.0.0|1310…

stl-string模拟

1.介绍主要进行cpp中string的模拟&#xff0c;方便我们更好的对stl进行使用&#xff0c;string没有模板&#xff0c;我们将头文件和函数写在两个不同的文件2.头文件3.cpp文件如有问题&#xff0c;欢迎纠正&#xff01;