彩色图像处理之彩色图像直方图处理的python实现——数字图像处理

news2025/1/11 18:42:37

彩色图像的直方图处理是一种重要的图像处理技术,用于改善图像的视觉效果,增强图像的对比度,或为后续的图像处理任务(如图像分割、特征提取)做准备。彩色图像通常由红色(R)、绿色(G)、蓝色(B)三个颜色通道组成,因此彩色图像的直方图处理相比单色图像更为复杂。

直方图的构建:

首先,对于彩色图像的每个颜色通道(R、G、B),分别计算其直方图。直方图是一个图表,显示了每个像素强度值(通常是0-255)在图像中出现的频率。
对于每个通道,直方图将有256个可能的强度值(或“桶”),每个桶的高度表示该强度值在相应通道中出现的次数。
直方图均衡化:

直方图均衡化是一种常见的彩色图像直方图处理方法,目的是增强图像的全局对比度。
在这个过程中,对每个颜色通道的直方图进行变换,使得最终的输出图像的直方图具有大致均匀的分布。这意味着在调整后的图像中,每个强度值的像素大致相同。
这种方法特别适用于图像的背景和前景都很暗或者都很亮的情况。
直方图规定化(匹配):

直方图规定化是另一种方法,它涉及修改一个图像的直方图以匹配另一个特定图像的直方图。
这通常用于标准化不同图像的光照条件,或者在特定应用中使图像风格一致。
局部直方图处理:

除了对整个图像进行直方图处理,还可以对图像的局部区域进行处理,以增强局部对比度或特定区域的细节。
颜色空间转换:

在进行直方图处理之前,有时会将图像从RGB颜色空间转换到其他颜色空间,如HSV(色相、饱和度、亮度)或YCbCr,因为在这些颜色空间中进行处理有时会得到更好的视觉效果或更符合特定应用的需求。
彩色图像直方图处理的关键在于理解和操作图像的颜色分布,以及如何通过调整这些分布来改善图像的整体或局部视觉质量。正确应用这些技术可以显著提升图像的视觉效果和适用性。

代码实现下图

在这里插入图片描述

提示

结果图显示了分别对R、G、B分量进行直方图均衡和将原图转换到HSI空间后保留H、S不变,只对I分量进行直方图均衡的结果。
图像分量的分离和合并可以用cv2.split和cv2.merge函数实现,直方图均衡仍然用cv2.equalizeHist函数实现。
由于cv2.equalizeHist规定参数必须是uint8类型的,所以得到[0,1]范围内的I分量后还需将其转换到[0,255]范围内并进行类型转换I_uint8 = (I*255).astype(np.uint8)后再进行直方图均衡。最后,将未改变的H、S分量和均衡后的I分量合并并转换为R、G、B分量。

python代码

import cv2
import numpy as np
import math
from matplotlib import pyplot as plt

# RGB转HSI,输入的三分量值域范围为[0,255],输出均在[0,1]之间
def RGB2HSI(r, g, b):
    r = r / 255
    g = g / 255
    b = b / 255

    num = 0.5 * ((r-g) + (r-b))
    den = ((r-g) ** 2 + (r-b) * (g-b)) ** 0.5
    h = math.acos(num / (den+1e-10))
    if b > g:
        h = 2*np.pi - h

    s = 1 - 3*min(r, g, b) / (r+g+b+1e-10)
    i = (r+g+b) / 3

    h = h / (2*np.pi)
    return h, s, i

# HSI转RGB,输入和输出的值域范围均为[0,1]
def HSI2RGB(h, s, i):
    h = h * 2 * np.pi

    if h < 2*np.pi/3:
        b = i * (1 - s)
        r = i * (1 + s * math.cos(h) / math.cos(np.pi/3 - h))
        g = 3*i - (b+r)
    elif h < 4*np.pi/3:
        r = i * (1 - s)
        g = i * (1 + s * math.cos(h - 2*np.pi/3) / math.cos(np.pi - h))
        b = 3 * i - (r + g)
    else:
        g = i * (1 - s)
        b = i * (1 + s * math.cos(h - 4*np.pi/3) / math.cos(5*np.pi/3 - h))
        r = 3 * i - (g + b)

    return r, g, b

img = cv2.imread('Fig0637.tif')

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
rows = img.shape[0]
cols = img.shape[1]

# 分别对R,G,B三个分量执行直方图均衡
(R, G, B) = cv2.split(img)
R_equ = cv2.equalizeHist(R)
G_equ = cv2.equalizeHist(G)
B_equ = cv2.equalizeHist(B)
img1 = cv2.merge([R_equ, G_equ, B_equ])

# RGB空间转换到HSI空间
H = np.zeros((rows, cols))
S = np.zeros((rows, cols))
I = np.zeros((rows, cols))

for x in range(rows):
    for y in range(cols):
        r, g, b = img[x, y, :]
        H[x, y], S[x, y], I[x, y] = RGB2HSI(r, g, b)

# 将强度分量I转换到[0,255]范围内再进行直方图均衡
I_uint8 = (I*255).astype(np.uint8)
# hist = cv2.calcHist([I_uint8], [0], None, [256], [0, 256])
# plt.subplot(1,2,1)
# plt.plot(hist)
I_equ = cv2.equalizeHist(I_uint8)
# hist_equ = cv2.calcHist([I_equ], [0], None, [256], [0, 256])
I_equ = I_equ / 255
# plt.subplot(1,2,2)
# plt.plot(hist_equ)
# plt.show()

# 保持色调H和饱和度S不变,结合均衡化后的强度I,转回RGB空间
R_new = np.zeros((rows, cols))
G_new = np.zeros((rows, cols))
B_new = np.zeros((rows, cols))

for x in range(rows):
    for y in range(cols):
        h = H[x, y]
        s = S[x, y]
        i = I_equ[x, y]
        # i = I[x, y]
        R_new[x, y], G_new[x, y], B_new[x, y] = HSI2RGB(h, s, i)

#R_new = (255*(R_new-R_new.min())/(R_new.max()-R_new.min())).astype(np.uint8)
#G_new = (255*(G_new-G_new.min())/(G_new.max()-G_new.min())).astype(np.uint8)
#B_new = (255*(B_new-B_new.min())/(B_new.max()-B_new.min())).astype(np.uint8)
img2 = cv2.merge([R_new, G_new, B_new])
img2 = np.clip(img2, 0, 1)

plt.subplot(1, 3, 1)
plt.imshow(img)
plt.axis('off')
plt.title('orig zzinal')

plt.subplot(1, 3, 2)
plt.imshow(img1)
plt.axis('off')
plt.title('RGB_hist_equ')

plt.subplot(1, 3, 3)
plt.imshow(img2)
plt.axis('off')
plt.title('I_hist_equ')

plt.show()

结果展示

在这里插入图片描述

总结

在灰度图像处理中,直方图均衡化自动地确定一种变换,改变换试图产生具有均匀灰度的直方图。由于彩色图像是由多个分量组成的,所以必须考了适应多于一个分量的直方图的灰度级技术。独立地进行彩色图像分量的直方图均衡通常是不可取的,这将产生不正确的彩色。一个更符合逻辑的方法是均匀地扩展彩色强度,而保留彩色本身。
图像直方图是反映一个图像像素分布的统计表,其横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。直方图的显示方式是左暗又亮,左边用于描述图像的暗度,右边用于描述图像的亮度。

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

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

相关文章

2023年12月 Scratch 图形化(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 观察下列每个圆形中的四个数,找出规律,在括号里填上适当的数?( ) A:9 B:17 C:21 D:5 答案:C 左上角的数=下面两个数的和+右上角的数

【UEFI基础】EDK网络框架(UDP4)

UDP4 UDP4协议说明 UDP的全称是User Datagram Protocol&#xff0c;它不提供复杂的控制机制&#xff0c;仅利用IP提供面向无连接的通信服务。它将上层应用程序发来的数据在收到的那一刻&#xff0c;立即按照原样发送到网络。 UDP报文格式&#xff1a; 各个参数说明如下&…

Tomcat Notes: Web Security

This is a personal study notes of Apache Tomcat. Below are main reference material. - YouTube Apache Tomcat Full Tutorial&#xff0c;owed by Alpha Brains Courses. https://www.youtube.com/watch?vrElJIPRw5iM&t801s 1、Overview2、Two Levels Of Web Securi…

跨部门算法迭代需求,从提出到上线的全流程实践

文章目录 引言需求评审技术方案评审模块开发系统联调QA测试产品验收经验教训 引言 最近工作中有一个算法迭代的需求&#xff0c;我在其中作为技术侧负责人&#xff08;技术主R&#xff09;推动需求完成上线。 需求涉及多个部门&#xff0c;前后耗时接近1个月。 我第一次在这…

transdata笔记:手机数据处理

1 mobile_stay_duration 每个停留点白天和夜间的持续时间 transbigdata.mobile_stay_duration(staydata, col[stime, etime], start_hour8, end_hour20) 1.1 主要参数 staydata停留数据&#xff08;每一行是一条数据&#xff09;col 列名&#xff0c;顺序为[‘starttime’,…

Istio

1、Istio介绍 Istio 是由 Google、IBM 和 Lyft 开源的微服务管理、保护和监控框架。 官网&#xff1a;https://istio.io/latest/zh/ 官方文档&#xff1a;https://istio.io/docs/ 中文官方文档&#xff1a;https://istio.io/zh/docs Github地址&#xff1a;https://github.com…

System.Data.SqlClient.SqlException:“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误

目录 背景: 过程: SQL Express的认识: 背景: 正在运行程序的时候&#xff0c;我遇到一个错误提示&#xff0c;错误信息如下&#xff0c;当我将错误信息仔细阅读了一番&#xff0c;信息提示的很明显&#xff0c;错误出现的来源就是连接数据库代码这块string connStr "s…

编写servlet

编写servlet 上述代码中的HTML页面将雇员ID发送给servlet。要创建servlet读取客户机发送的雇员ID并检索雇员的详细信息,需要执行以下步骤: 在“项目”选项卡中右击“Employee”节点,然后选择“新建”→Servlet。将显示“新建Servlet”对话框。在“类名”文本框中输入Employ…

【Kaggle】泰坦尼克号生存预测 Titanic

文章目录 前言案例背景数据集介绍加载数据集探索性数据分析&#xff08;EDA&#xff09;可视化特征和目标值之间关系缺失值分析 数据预处理数据清洗缺失值处理去除噪声并且规范化文本内容 数据转换 数据划分建模逻辑回归模型决策分类树模型随机森林模型梯度提升树模型 预测LR 完…

C++笔记之bool类型的隐式转换现象与应用

C++笔记之bool类型的隐式转换现象与应用 —— 《C++ Primer Plus》 文章目录 C++笔记之bool类型的隐式转换现象与应用1.C++中,有几种类型和表达式可以隐式转换为bool类型2.使用explicit关键字来声明显示转换运算符,这样只有在使用static_cast<bool>时才能将对象转换为…

SpringCloud之OpenFeign的学习、快速上手

1、什么是OpenFeign OpenFeign简化了Http的开发。在RestTemplate的基础上做了封装&#xff0c;在微服务中的服务调用发送网络请求起到了重要的作用&#xff0c;简化了开发&#xff0c;可以让我们跟写接口一样调其他服务。 并且OpenFeign内置了Ribbon实现负载均衡。 官方文档…

GEE:最小距离分类器(minimumDistance)分类教程(样本制作、特征添加、训练、精度、最优参数、统计面积)

作者:CSDN @ _养乐多_ 本文将介绍在Google Earth Engine (GEE)平台上进行最小距离分类(minimumDistance)的方法和代码,其中包括制作样本点教程(本地、在线和本地在线混合制作样本点,合并样本点等),加入特征变量(各种指数、纹理特征、时间序列特征、物候特征等),运行…

中仕教育:国考调剂和补录的区别是什么?

国考笔试成绩和进面名单公布之后&#xff0c;考生们就需要关注调剂和补录了&#xff0c;针对二者之间的区别很多考生不太了解&#xff0c;本文为大家解答一下关于国考调剂和补录的区别。 1.补录 补录是在公式环节之后进行的&#xff0c;主要原因是经过面试、体检和考察&#…

高速CAN总线 m 个节点竞争总线时 电压分析(共 n 个节点)

电路的串并联关系参考<<高速CAN总线 A C节点竞争总线时 电压分析(共ABC三个节点)>> M个节点同时发送显性电平 如下图: 由上图可以看出,上下并联的M组30Ω的等效电阻R0 &#xff08;30/m&#xff09; Ω 中间并联的电阻R1 由公式&#xff1a; 1/R1 1/120 1/120…

LV.19 D1 C++简介 学习笔记

一、C概述 1.1 C的前世今生 C是一种被广泛使用的计算机程序设计语言。它是一种通用程序设计语言&#xff0c;支持多重编程范式&#xff0c;例如过程化程序设计、面向对象程序设计、泛型程序设计和函数式程序设计等。 C的发展&#xff1a; 1.2 C的主要应用领域 C是一门运用很广…

海外抖音TikTok、正在内测 AI 生成歌曲功能,依靠大语言模型 Bloom 进行文本生成歌曲

近日&#xff0c;据外媒The Verge报道&#xff0c;TikTok正在测试一项新功能&#xff0c;利用大语言模型Bloom的AI能力&#xff0c;允许用户上传歌词文本&#xff0c;并使用AI为其添加声音。这一创新旨在为用户提供更多创作音乐的工具和选项。 Bloom 是由AI初创公司Hugging Fac…

AtCoder Regular Contest 170(A~B)

A - Yet Another AB Problem 给你两个字符串S和T&#xff0c;你可以对S执行操作&#xff0c;选择两个字符&#xff0c;将前面的改为A&#xff0c;后面的改为B&#xff0c;最少操作几次可以把S改成T。如果改不成就输出-1。 从左往右一个一个改过去&#xff0c;分类讨论&#x…

html 会跳舞的时间动画特效

下面是是代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta h…

php基础学习之代码框架

一&#xff0c;标记 脚本标记&#xff08;已弃用&#xff09;&#xff1a;<script language"php"> php代码 </script> 标准标记&#xff1a;<?php php代码 ?> 二&#xff0c;基础输出语句 不是函数&#xff0c;…

基于yolov5-master和pyqt5的森林火灾监测软件

文章目录 项目背景效果演示一、实现思路① 算法原理② 程序流程图 二、系统设计与实现三、模型评估与优化 项目背景 火灾作为威胁人类生命生产安全的隐患之一&#xff0c;一直是人们关注的重点。传统的火灾监测装置根据温度来检测火灾&#xff0c;不仅灵敏度差&#xff0c;而且…