python实现图像对比度增强算法
python实现直方图均衡化、自适应直方图均衡化、连接组件标记算法
- 1.直方图均衡化算法详解
- 算法步骤
- 公式
- Python 实现
- 详细解释
- 优缺点
- 2.自适应直方图均衡化算法详解
- 算法步骤
- 公式
- Python 实现
- 详细解释
- 优缺点
- 3.连接组件标记算法详解
- 算法步骤
- 8连通与4连通
- 公式
- Python 实现
- 详细解释
- 优缺点
1.直方图均衡化算法详解
直方图均衡化(Histogram Equalization)是一种用于增强图像对比度的技术。它通过调整图像的灰度值分布,使图像的灰度值更加均匀,从而提升图像的整体对比度。
算法步骤
- 计算原始图像的灰度直方图:统计图像中每个灰度值出现的次数。
- 计算累积分布函数(CDF):累积直方图。
- 应用均衡化公式:将原始图像中的每个灰度值映射到新的灰度值。
- 生成均衡化后的图像。
公式
Python 实现
以下是直方图均衡化算法的Python实现代码:
import numpy as np
from PIL import Image
import matplotlib.pyplot as pltdef histogram_equalization(image):# 将图像转换为灰度图像grayscale_image = image.convert("L")image_array = np.array(grayscale_image)# 计算灰度直方图hist, bins = np.histogram(image_array.flatten(), bins=256, range=[0, 256])# 计算累积分布函数(CDF)cdf = hist.cumsum()cdf_normalized = cdf * hist.max() / cdf.max() # 归一化# 使用累积分布函数(CDF)进行均衡化cdf_min = cdf.min()cdf_m = np.ma.masked_equal(cdf, 0)cdf_m = (cdf_m - cdf_min) * 255 / (cdf.max() - cdf_min)cdf = np.ma.filled(cdf_m, 0).astype('uint8')# 将均衡化后的灰度值映射到原始图像equalized_image_array = cdf[image_array]equalized_image = Image.fromarray(equalized_image_array)return equalized_image# 示例用法
if __name__ == "__main__":image = Image.open('example.jpg') # 打开原始图像equalized_image = histogram_equalization(image) # 调用直方图均衡化函数equalized_image.show() # 显示均衡化后的图像equalized_image.save('equalized_example.jpg') # 保存均衡化后的图像# 绘制原始图像和均衡化后的直方图plt.figure()plt.subplot(121)plt.title('Original Image Histogram')plt.hist(np.array(image.convert("L")).flatten(), bins=256, range=[0, 256], color='black')plt.subplot(122)plt.title('Equalized Image Histogram')plt.hist(np.array(equalized_image).flatten(), bins=256, range=[0, 256], color='black')plt.show()
详细解释
-
读取图像和转换为灰度图像:
image = Image.open('example.jpg') grayscale_image = image.convert("L")
-
计算灰度直方图:
image_array = np.array(grayscale_image) hist, bins = np.histogram(image_array.flatten(), bins=256, range=[0, 256])
-
计算累积分布函数(CDF):
cdf = hist.cumsum() cdf_normalized = cdf * hist.max() / cdf.max()
-
使用CDF进行均衡化:
cdf_min = cdf.min() cdf_m = np.ma.masked_equal(cdf, 0) cdf_m = (cdf_m - cdf_min) * 255 / (cdf.max() - cdf_min) cdf = np.ma.filled(cdf_m, 0).astype('uint8')
-
映射原始灰度值到新的灰度值:
equalized_image_array = cdf[image_array] equalized_image = Image.fromarray(equalized_image_array)
-
显示和保存均衡化后的图像:
equalized_image.show() equalized_image.save('equalized_example.jpg')
-
绘制直方图:
plt.subplot(121) plt.title('Original Image Histogram') plt.hist(np.array(image.convert("L")).flatten(), bins=256, range=[0, 256], color='black') plt.subplot(122) plt.title('Equalized Image Histogram') plt.hist(np.array(equalized_image).flatten(), bins=256, range=[0, 256], color='black') plt.show()
优缺点
优点:
- 增强对比度:提高图像的整体对比度,使细节更加清晰。
- 实现简单:算法简单,易于实现。
缺点:
- 可能引入噪声:在一些情况下,可能会引入不必要的噪声。
- 不适用于所有图像:对于已经具有良好对比度的图像,效果可能不明显。
直方图均衡化是一种简单且有效的图像增强技术,适用于提升图像对比度的应用场景。
2.自适应直方图均衡化算法详解
自适应直方图均衡化(Adaptive Histogram Equalization, AHE)是一种改进的直方图均衡化方法,它在局部区域内(即图像的子块)进行直方图均衡化,而不是对整个图像进行全局均衡化。这种方法可以更好地增强图像的局部对比度,但也可能会引入噪声。
对比度受限的自适应直方图均衡化(Contrast Limited Adaptive Histogram Equalization, CLAHE)是AHE的一种改进版本。CLAHE通过对每个子块中的直方图进行剪裁,限制对比度增强的程度,从而减少噪声的引入。
算法步骤
- 将图像划分为多个子块:将图像分成多个不重叠的子块。
- 对每个子块进行直方图均衡化:计算每个子块的直方图和累积分布函数(CDF),并应用均衡化公式。
- 对每个子块进行对比度限制(CLAHE):对直方图进行剪裁,限制增强的对比度。
- 插值重构图像:对每个子块的均衡化结果进行双线性插值,重构整个图像。
公式
Python 实现
以下是自适应直方图均衡化(CLAHE)的Python实现代码:
import cv2
import numpy as np
from PIL import Imagedef adaptive_histogram_equalization(image, clip_limit=2.0, grid_size=(8, 8)):"""自适应直方图均衡化 (CLAHE) 算法实现参数:image (PIL.Image): 输入图像clip_limit (float): 对比度限制grid_size (tuple): 网格大小返回:PIL.Image: 均衡化后的图像"""# 将图像转换为灰度图像grayscale_image = image.convert("L")image_array = np.array(grayscale_image)# 创建CLAHE对象clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=grid_size)# 应用CLAHE算法equalized_image_array = clahe.apply(image_array)# 将处理后的数组转换为图像equalized_image = Image.fromarray(equalized_image_array)return equalized_image# 示例用法
if __name__ == "__main__":image = Image.open('example.jpg') # 打开原始图像equalized_image = adaptive_histogram_equalization(image) # 调用自适应直方图均衡化函数equalized_image.show() # 显示均衡化后的图像equalized_image.save('equalized_example.jpg') # 保存均衡化后的图像
详细解释
-
读取图像和转换为灰度图像:
image = Image.open('example.jpg') grayscale_image = image.convert("L")
-
将灰度图像转换为NumPy数组:
image_array = np.array(grayscale_image)
-
创建CLAHE对象:
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
-
应用CLAHE算法:
equalized_image_array = clahe.apply(image_array)
-
将处理后的数组转换为图像:
equalized_image = Image.fromarray(equalized_image_array)
-
显示和保存均衡化后的图像:
equalized_image.show() equalized_image.save('equalized_example.jpg')
优缺点
优点:
- 增强局部对比度:能够有效增强图像的局部对比度,适用于对局部细节要求较高的图像。
- 减少噪声引入:相比传统的AHE,CLAHE通过对比度限制减少了噪声的引入。
缺点:
- 计算复杂度高:由于需要对每个子块进行处理,计算复杂度较高。
- 实现复杂:相比全局直方图均衡化,实现过程更复杂。
自适应直方图均衡化特别适用于那些需要增强局部对比度的应用场景,如医学影像、卫星图像等。CLAHE进一步改善了AHE的不足,使其在实际应用中更加实用。
3.连接组件标记算法详解
连接组件标记算法(Connected Component Labeling, CCL)是一种用于在二值图像中标识和分类不同连接组件的算法。连接组件是指图像中所有像素值相同且彼此相邻的像素组成的区域。CCL算法用于图像分割、物体检测和图像理解等任务中。
算法步骤
- 初始化标签:为每个像素初始化一个唯一的标签。
- 遍历图像:扫描图像的每个像素,根据邻域像素的标签更新当前像素的标签。
- 合并标签:在遍历过程中记录不同标签的合并关系,形成等价类。
- 第二次遍历:根据标签的合并关系,更新图像中的标签。
8连通与4连通
- 4连通:每个像素与上下左右四个像素相邻。
- 8连通:每个像素与周围八个像素相邻。
公式
Python 实现
以下是连接组件标记算法的Python实现代码:
import numpy as np
import cv2
from matplotlib import pyplot as pltdef connected_component_labeling(image):"""连接组件标记算法实现参数:image (numpy.ndarray): 二值图像返回:numpy.ndarray: 标记后的图像"""# 将图像转换为二值图像binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)[1]# 获取图像的行和列rows, cols = binary_image.shape# 初始化标签数组labels = np.zeros((rows, cols), dtype=int)label = 1 # 初始化标签# 记录等价类label_equivalence = {}# 遍历图像for i in range(rows):for j in range(cols):if binary_image[i, j] == 255: # 如果当前像素为前景像素# 获取邻域像素的标签neighbors = []if i > 0 and labels[i-1, j] > 0:neighbors.append(labels[i-1, j])if j > 0 and labels[i, j-1] > 0:neighbors.append(labels[i, j-1])if neighbors:min_label = min(neighbors)labels[i, j] = min_labelfor neighbor in neighbors:if neighbor != min_label:if neighbor in label_equivalence:label_equivalence[neighbor].add(min_label)else:label_equivalence[neighbor] = {min_label}if min_label in label_equivalence:label_equivalence[min_label].add(neighbor)else:label_equivalence[min_label] = {neighbor}else:labels[i, j] = labellabel += 1# 合并等价标签for i in range(rows):for j in range(cols):if labels[i, j] in label_equivalence:min_equivalent_label = min(label_equivalence[labels[i, j]])labels[i, j] = min_equivalent_labelreturn labels# 示例用法
if __name__ == "__main__":# 创建一个简单的二值图像binary_image = np.array([[0, 0, 0, 255, 255, 0, 0, 0],[0, 255, 255, 255, 255, 255, 0, 0],[0, 255, 255, 255, 255, 255, 255, 0],[0, 0, 0, 255, 255, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 255, 255, 0, 0, 0, 0],[0, 255, 255, 255, 255, 0, 0, 0],[0, 0, 0, 255, 0, 0, 0, 0]], dtype=np.uint8)labeled_image = connected_component_labeling(binary_image)# 显示结果plt.imshow(labeled_image, cmap='jet')plt.title('Connected Component Labeling')plt.colorbar()plt.show()
详细解释
-
读取图像并转换为二值图像:
binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)[1]
-
初始化标签数组:
labels = np.zeros((rows, cols), dtype=int) label = 1 # 初始化标签
-
遍历图像并更新标签:
for i in range(rows):for j in range(cols):if binary_image[i, j] == 255: # 如果当前像素为前景像素neighbors = []if i > 0 and labels[i-1, j] > 0:neighbors.append(labels[i-1, j])if j > 0 and labels[i, j-1] > 0:neighbors.append(labels[i, j-1])if neighbors:min_label = min(neighbors)labels[i, j] = min_labelfor neighbor in neighbors:if neighbor != min_label:if neighbor in label_equivalence:label_equivalence[neighbor].add(min_label)else:label_equivalence[neighbor] = {min_label}if min_label in label_equivalence:label_equivalence[min_label].add(neighbor)else:label_equivalence[min_label] = {neighbor}else:labels[i, j] = labellabel += 1
-
合并等价标签:
for i in range(rows):for j in range(cols):if labels[i, j] in label_equivalence:min_equivalent_label = min(label_equivalence[labels[i, j]])labels[i, j] = min_equivalent_label
-
显示结果:
plt.imshow(labeled_image, cmap='jet') plt.title('Connected Component Labeling') plt.colorbar() plt.show()
优缺点
优点:
- 简单易实现:基础的CCL算法实现简单,适合初学者学习。
- 有效分割前景和背景:能够有效分割图像中的不同连接组件。
缺点:
- 计算复杂度高:特别是在处理大图像时,计算复杂度较高。
- 内存消耗大:需要额外的内存来存储标签和等价类信息。
连接组件标记算法在图像分割和物体检测中具有广泛的应用,特别适用于需要识别和分类图像中不同区域的任务。通过对等价标签的合并,可以有效地解决图像中的连通区域标记问题。
相关文章:
python实现图像对比度增强算法
python实现直方图均衡化、自适应直方图均衡化、连接组件标记算法 1.直方图均衡化算法详解算法步骤公式Python 实现详细解释优缺点 2.自适应直方图均衡化算法详解算法步骤公式Python 实现详细解释优缺点 3.连接组件标记算法详解算法步骤8连通与4连通公式Python 实现详细解释优缺…...
【D3.js in Action 3 精译_020】2.6 用 D3 设置与修改元素样式 + 名人专访(Nadieh Bremer)+ 2.7 本章小结
当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可视化最佳实践(下)1.4 本章小结 第二章…...
GIT命令学习 二
📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 ☁️运维工程师的职责:监…...
LeetCode 150, 112, 130
文章目录 150. 逆波兰表达式求值题目链接标签思路代码 112. 路径总和题目链接标签思路代码 130. 被围绕的区域题目链接标签思路代码 150. 逆波兰表达式求值 题目链接 150. 逆波兰表达式求值 标签 栈 数组 数学 思路 本题很像 JVM 中的 操作数栈,当写出以下三行…...
c++应用网络编程之五Windows常用的网络IO模型
一、Windows的网络编程 其实对开发者而言,只有Windows和其它平台。做为一种普遍流行的图形OS,其一定会与类Linux的编程有着明显的区别,这点当然也会体现在网络编程上。Windows有着自己一套相对独立的上层Socket编程模型或者说框架࿰…...
PostgreSQL 中如何解决因大量并发删除和插入操作导致的索引抖动?
🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何解决因大量并发删除和插入操作导致的索引抖动一、理解索引抖动二、索引抖动的影响三…...
鑫创SSS1700USB音频桥芯片USB转IIS芯片
鑫创SSS1700支持IIC初始外部编(EEPROM选项),两线串行总线(I2C总线)用于外部MCU控制整个EEPROM空间可以通过MCU访问用于主机控制同步的USB HID外部串行EEPROM(24C02~24C16)接口,用于客户特定的USB视频、PID、…...
计算机视觉发展历程
文章目录 前言一、发展历程1)、萌芽期(1960s-1970s)2)、基础发展期(1980s)3)、系统开发期(1990s-2000s)4)、深度学习兴起期(2010s)5&a…...
从安装Node到TypeScript到VsCode的配置教程
从安装Node到TypeScript到VsCode的配置教程 1.下载Node安装包, 链接 2.双击安装包,选择安装路径,如下: 3.一直点击下一步,直至安装结束即可: 这个时候,node会默认配置好环境变量,并且…...
Jackson详解
文章目录 一、Jackson介绍二、基础序列化和反序列化1、快速入门2、序列化API3、反序列化API4、常用配置 三、常用注解1、JsonProperty2、JsonAlias3、JsonIgnore4、JsonIgnoreProperties5、JsonFormat6、JsonPropertyOrder 四、高级特性1、处理泛型1.1、反序列化List泛型1.2、反…...
【算法】字符串
快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、最长公共前缀二、最长回文子串三、二进制求和四、字符串相乘 引言 字符串题,大多数是模…...
Python酷库之旅-第三方库Pandas(037)
目录 一、用法精讲 116、pandas.Series.div方法 116-1、语法 116-2、参数 116-3、功能 116-4、返回值 116-5、说明 116-6、用法 116-6-1、数据准备 116-6-2、代码示例 116-6-3、结果输出 117、pandas.Series.truediv方法 117-1、语法 117-2、参数 117-3、功能 …...
iOS 左滑返回事件的控制
0x00 视图结构 1-根视图 1.1-控制器A 1.1.1-控制器B 1.1.1.1-控制器C 0x01 控制 通过设置 self.navigationController.interactivePopGestureRecognizer.enabled 为 YES 或 NO 来控制当面界面,是否能左滑返回 在 控制器B 的生命周期方法内,设置属性 s…...
= null 和 is null;SQL中关于NULL处理的4个陷阱;三值逻辑
一、概述 1、NULL参与的所有的比较和算术运算符(>,,<,<>,<,>,,-,*,/) 结果为unknown; 2、unknown的逻辑运算(AND、OR、NOT)遵循三值运算的真值表; 3、如果运算结果直接返回用户,使用NULL来标识unknown 4、如…...
拖拽上传(预览图片)
需求 点击上传图片,或直接拖拽图片到红色方框里面也可上传图片,上传后预览图片 效果 实现 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content&…...
Oracle 12c新特性 In-Memory Column Store
Oracle 12c引入了一项重要的特性——In-Memory Column Store(简称IM或In-Memory),这一特性极大地提升了数据库在处理分析型查询时的性能。以下是关于Oracle 12c In-Memory特性的详细介绍: 一、基本概念 In-Memory Column Store&…...
【数据结构】二叉树———Lesson2
Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…...
mongodb数据导出与导入
一、先去检查mongodump mongodump --version 如果报 mongodump version: built-without-version-string 或者其他的较老的版本,直接去下载最新的【传送门】 【以Ubuntu18.04为例】 安装工具 假设你下载的是 .tgz 文件(适用于 Linux 系统)&am…...
电路学习——经典运放电路之滞回比较器(施密特触发器)(2024.07.18)
参考链接1: 电子设计教程29:滞回比较器(施密特触发器) 参考链接2: 滞回比较器电路详细分析 参考链接3: 比较器精髓:施密特触发器,正反馈的妙用 参考链接4: 比较器反馈电阻选多大?理解滞后效应,轻…...
NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker)
NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker) 本文档详细介绍了在 Ubuntu Server 22.04 上使用 Docker 安装和配置 NVIDIA Container Toolkit 的过程。 概述 NVIDIA 容器工具包使用户能够构建和运行 GPU 加速容器。即可以在容器中使用NVIDIA显卡。 架构图如…...
JavaWeb day01-HTML入门
Web前端 课程安排 HTML、CSS简介 HTML快速入门 实现标题排版 新闻标题样式...
驱动框架——CMSIS第一部分 RTE驱动框架介绍
一、介绍CMISIS 什么是CMSIS(cortex microcontrol software interface standard一种软件标准接口),官网地址:https://arm-software.github.io/CMSIS_6/latest/General/index.html 包含的core、driver、RTOS、dsp、nn等部分&…...
Debezium日常分享系列之:Debezium2.7版本PostgreSQL数据库连接器
Debezium日常分享系列之:Debezium2.7版本PostgreSQL数据库连接器 一、概述二、连接器的工作原理安全快照初始快照的默认工作流程行为临时快照触发临时增量快照触发临时阻塞快照增量快照增量快照流程Debezium 如何解决具有相同主键的记录之间的冲突快照窗口触发增量快照具有附加…...
保障信息系统安全保护等级调整期间的安全性
保障信息系统安全保护等级调整期间的安全性: 策略与实践 在当今数字化时代,信息系统已成为企业和组织运营的核心支撑。为了适应不断变化的业务需求和安全威胁环境,信息系统安全保护等级的调整成为必要之举。然而,这一调整过程可能…...
实战:shell编程之全量命令练习
概叙 槽点~~~~~~~! 往期shell相关文章回顾,有兴趣的可以自行阅读和练习。 科普文:一文搞懂Vim-CSDN博客 科普文:jvm笔记-CSDN博客 科普文:一天学会shell编程-CSDN博客 科普文:Linux服务器巡检小结_lin…...
在 CentOS 7 上编译安装 Python 3.11
安装必要的依赖 首先,你需要安装一些开发工具和库,以便编译 Python 和 OpenSSL: yum -y groupinstall "Development tools" yum install -y wget gcc-c pcre pcre-devel zlib zlib-devel libffi-devel zlib1g-dev openssl-devel …...
Qt 4.8.7 + MSVC 中文乱码问题深入分析
此问题很常见,然而网上关于此问题的分析大多不够深刻,甚至有错误;加之Qt5又更改了一些编码策略,而很多文章并未提及版本问题,或是就算提了,读者也不重视。这些因素很容易让读者产生误导。今日我彻底研究透了…...
IDEA的常见代码模板的使用
《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试(Debug) 第七章 …...
arcgis怎么选取某个指定区域地方的数据,比如从全国乡镇数据选取长沙市乡镇数据
一共5个步骤,没一句废话,耐心看完。看完你就会在任何软件选取指定范围的数据了。 一、如图,先将数据加载到arcgis里面,我们要选取里面长沙市的范围数据。 二、选取长沙市的语句 “市” like ‘长沙%’ 切记,切记&…...
二、链表(1)
203.移除链表元素 创建一个虚拟哨兵头节点,就不用考虑原本头结点要不要删除 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def remove…...
哪个网站可以上传设计的作品/重庆百度
Flutter webview插件是用来在APP内部加载网页的,它跟Flutter url_launcher插件的不同之处在于:前者只是在app内部打开web网页,而url_launcher则是调用手机默认的功能做事情,例如调用默认的浏览器打开web网页(跳出app了)࿰…...
兰州市建设局网站/seo基础理论
1.创建用户名以及密码: 右键我的电脑 -》 管理-》本地用户和组-》右键用户-》新用户----设置用户名密码; 2.安装IIS 和FTP :控制面板-》程序-》打开或关闭windows功能-》勾选FTP WEB管理工具以及(TFCP我不知道这个有没有用) 3.建立FTP&#x…...
山西省建设厅网站首页6/seo内部优化具体做什么
如图:有2种自定义方法,一种是改源码,一种是初始化 初始化,如下代码: var ue UE.getEditor(XXXid,{//contextMenu:[{label:, cmdName:selectall},{label:,cmdName:cleardoc,exec:function () {this.execCommand( clear…...
简单房地产网站/免费技能培训在哪里报名
手头有 109 张头部 CT 的断层扫描图片,我打算用这些图片尝试头部的三维重建。基础工作之一,就是要把这些图片数据读出来,组织成一个三维的数据结构(实际上是四维的,因为每个像素有 RGBA 四个通道)。 这个数据结构,自然…...
蓝色系 网站/seo北京优化
实验环境 第一台centos7源码安装apache2.4.38 IP 192.169.1.13 关闭防火墙 一.rewrite跳转 Rewrite主要的功能就是实现URL的重写。它的正则表达式是基于Perl语言,入站的规则用于修改 HTTP 请求 Url。这些规则可以为以下几个目的,如演示对用户更加友好…...
英文 科技网站/长沙专业竞价优化公司
路线:xx.pth -> xx.onnx -> xx.trt 实验版本:torch 1.10.0;tensorrt 7.2.3.4; onnx 1.8.1 1. pth2onnx.py # 将pytorch训练的模型xx.pth转为xx.onnx。 import torch from model import resnet50 # 导入模型结构 impo…...