OpenCV—python 颜色直方图与直方图均衡化

article/2025/9/28 12:03:05

文章目录

      • 一、颜色直方图
          • 1.1 使用opencv展示直方图
          • 1.2 使用matplotlib绘制
      • 二、直方图均衡化
          • 2.1 全局直方图均衡化与自适应均衡化
          • 2.2 使用查找表来拉伸直方图
          • 2.3 直方图均衡化—RGB2YCrCb
          • 2.4 直方图均衡化—RGB2YUV

一、颜色直方图

1.1 使用opencv展示直方图
函数 cv2.calcHist(image,channels,mask,histSize,ranges) -> list

image: array为待计算直方图的图像
channels:list 通道,RGB图像可以指定[0,1,2],灰度图像只有[0],
mask 掩码,可以指定图像的范围,如果是全图,默认为none
hitsize 为直方图的灰度级数,例如[0,255]一共256级
range 为像素值范围,为[0,255]

下面三个函数功能在RGB图像处理下差不多,请自行查阅资料
np.histogram()
np.bincount()
cv2.calcHist()

import cv2    
import numpy as npdef calcAndDrawHist(image, color):  hist= cv2.calcHist([image], [0], None, [256], [0.0,255.0])  minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(hist)  histImg = np.zeros([256,256,3], np.uint8)  hpt = int(0.9* 256);  for h in range(256):  intensity = int(hist[h]*hpt/maxVal)  cv2.line(histImg,(h,256), (h,256-intensity), color)  return histImgif __name__ == '__main__':  original_img = cv2.imread("666.png")b, g, r = cv2.split(img)  histImgB = calcAndDrawHist(b, [255, 0, 0])  histImgG = calcAndDrawHist(g, [0, 255, 0])  histImgR = calcAndDrawHist(r, [0, 0, 255])  cv2.imshow("histImgB", histImgB)  cv2.imshow("histImgG", histImgG)  cv2.imshow("histImgR", histImgR)  cv2.imshow("Img", img)  cv2.waitKey(0)  cv2.destroyAllWindows() 

在这里插入图片描述

1.2 使用matplotlib绘制

matplotlib.pyplot.plot(hist,color)进行绘制

plt.hist(img.ravel(),hitsizes,ranges,color=)
img.ravel()将原图像的array数组转成一维的数组
hitsizes为直方图的灰度级数
ranges为灰度范围[0,255]
color使用color=’'来指定颜色
展示方法:
hist = cv2.calcHist([res],[0],None,[256],[0,255])
plt.plot(hist,'r')
plt.show()
=======================================================
plt.hist(res.ravel(), 256, [0, 256],color='r')
plt.show()

二、直方图均衡化

为什么要进行直方图均衡化呢?我们日常拍照时,背对太阳时或晚上出现图像欠曝,面对太阳拍照会出现过曝,图像均衡可以通过图像直方图均衡来调整图像,也可以通过 γ \gamma γ 校正,来校正图片。

图像的直方图是对图像对比度效果上的一种处理,旨在使得图像整体效果均匀,黑与白之间的各个像素级之间的点更均匀一点。亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。(直接效果展示)
在这里插入图片描述
cv2.equalizeHist(img) 均衡化的原图像【输入img:单通道图像】则返回值即为均衡化后的图像。

2.1 全局直方图均衡化与自适应均衡化
import cv2
import numpy as npimg = cv2.imread('0002.jpg',0)img1 = cv2.equalizeHist(img)                               # 全局直方图均衡化
clahe = cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))  # 自适应直方图均衡化
cll = clahe.apply(img)res = np.hstack((img,img1,cll))
cv2.imwrite("res.jpg",res)

显然全局直方图均衡化效果不好,造成部分过曝,部分细节消失。
如下图:依次是原图;全局直方图均衡化;自适应直方图均衡化
在这里插入图片描述

2.2 使用查找表来拉伸直方图

在图像处理中,直方图均衡化一般用来均衡图像的强度,或增加图像的对比度。
观察上图中原始图像的直方图,很容易发现大部分强度值范围都没有用到。
因此先检测图像非0的最低(imin)强度值和最高(imax)强度值。
将最低值imin设为0,最高值imax设为255。中间的按255.0*(i-imin)/(imax-imin)+0.5)的形式设置。

import cv2
import numpy as npimage = cv2.imread("ABC.png", 0)
lut = np.zeros(256, dtype = image.dtype )                  #创建空的查找表hist,bins = np.histogram(image.flatten(),256,[0,256]) 
cdf = hist.cumsum()                                        #计算累积直方图
cdf_m = np.ma.masked_equal(cdf,0)                          #除去直方图中的0值
cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min())#等同于前面介绍的lut[i] = int(255.0 *p[i])公式
cdf = np.ma.filled(cdf_m,0).astype('uint8')                #将掩模处理掉的元素补为0#计算
result2 = cdf[image]
result = cv2.LUT(image, cdf)cv2.imshow("OpenCVLUT", result)
cv2.imshow("NumPyLUT", result2)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

import cv2
import numpy as npimage = cv2.imread("ABC.png", 0)
lut = np.zeros(256, dtype = image.dtype )  # 创建空的查找表
hist= cv2.calcHist([image],[0],None,[256],[0.0,255.0])
minBinNo, maxBinNo = 0, 255for binNo, binValue in enumerate(hist):         #计算从左起第一个不为0的直方图柱的位置if binValue != 0:minBinNo = binNobreakfor binNo, binValue in enumerate(reversed(hist)):#计算从右起第一个不为0的直方图柱的位置if binValue != 0:maxBinNo = 255-binNobreak
print(minBinNo, maxBinNo)for i,v in enumerate(lut):                      #生成查找表,方法来自参考文献1第四章第2节print(i)if i < minBinNo:lut[i] = 0elif i > maxBinNo:lut[i] = 255else:lut[i] = int(255.0*(i-minBinNo)/(maxBinNo-minBinNo)+0.5)#计算
result = cv2.LUT(image, lut)
cv2.imshow("hist", hist)
cv2.imshow("Result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.3 直方图均衡化—RGB2YCrCb

方法:将RGB彩色图像先转换到YPbPr空间,然后只对亮度通道进行全局直方图均衡化和自适应直方图均衡化,最后再将亮度通道和PbPr通道合并形成彩色图像,然后再转换回RGB空间中。
代码详细:https://docs.opencv2.org/4.1.0/d5/daf/tutorial_py_histogram_equalization.html

import numpy as np
import cv2# RGB图像全局直方图均衡化
def hisEqulColor1(img):ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)channels = cv2.split(ycrcb)cv2.equalizeHist(channels[0], channels[0])   # 对第1个通道即亮度通道进行全局直方图均衡化并保存ycrcb = cv2.merge(channels)img = cv2.cvtColor(ycrcb, cv2.COLOR_YCR_CB2BGR)return img# RGB图像进行自适应直方图均衡化,代码同上的地方不再添加注释
def hisEqulColor2(img):ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)channels = cv2.split(ycrcb)clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))clahe.apply(channels[0], channels[0])ycrcb = cv2.merge(channels)img = cv2.cvtColor(ycrcb, cv2.COLOR_YCR_CB2BGR)return imgif __name__ == '__main__':img = cv2.imread(r'C:\Users\xxx\Desktop\004.png')img1 = img.copy()img2 = img.copy()res1 = hisEqulColor1(img1)res2 = hisEqulColor2(img2)res = np.hstack((img, res1, res2))cv2.imwrite(r'C:\Users\xxx\Desktop\res1.jpg', res)

如下图:依次是原图;全局直方图均衡化;自适应直方图均衡化
在这里插入图片描述

2.4 直方图均衡化—RGB2YUV
import numpy as np
import cv2# 全局直方图均衡化
def hisEqulColor1(img):image_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)image_yuv[:, :, 0] = cv2.equalizeHist(image_yuv[:, :, 0])img = cv2.cvtColor(image_yuv, cv2.COLOR_YUV2BGR)return img# 自适应直方图均衡化
def hisEqulColor2(img):image_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))clahe.apply(image_yuv[:, :, 0])img = cv2.cvtColor(image_yuv, cv2.COLOR_YUV2BGR)return imgif __name__ == '__main__':img = cv2.imread(r'C:\Users\xxx\Desktop\004.png')img1 = img.copy()img2 = img.copy()res1 = hisEqulColor1(img1)res2 = hisEqulColor2(img2)res = np.hstack((img, res1, res2))cv2.imwrite(r'C:\Users\xxx\Desktop\res4.jpg', res)

如下图:依次是原图;全局直方图均衡化;自适应直方图均衡化
在这里插入图片描述
仔细观察 RGB2YUV与RGB2YCrCb 自适应直方图均衡化结果:个人觉得RGB2YUV的暗部细节更多一些。


http://chatgpt.dhexx.cn/article/bR1Z3eo7.shtml

相关文章

颜色直方图和颜色矩

来源&#xff1a;http://www.xuebuyuan.com/2019161.html 1、颜色直方图 颜色直方图所描述的是不同色彩在整幅图像中所占的比例&#xff0c;而并不关心每种色彩所处的空间位置&#xff0c;即无法描述图像中的对象或物体。颜色直方图特别适于描述那些难以进行自动分割的图像。 …

颜色直方图 灰度图彩色图

1.读取照片 cv2.imread&#xff08;图片路径&#xff0c;cv2.IMREAD_COLOR&#xff09; 2.定义color变量&#xff08;b&#xff0c;g&#xff0c;r&#xff09; 代表三个通道 3.彩色图像为例 for i&#xff0c;col in enumerate&#xff08;color&#xff09;&#xff1a;遍历…

基于MATLAB颜色直方图的图像检索

基于颜色直方图的图像检索 概述 在过去的十几年间&#xff0c;有许多知名机构都对图像检索系统进行了深入的研究&#xff0c;病开发出了相应的检索系统&#xff0c;例如IBM Almaden研究中心研制的QBIC系统&#xff0c;Virage公司研发的VIRAGE系统&#xff0c;麻省理工大学多媒体…

pyimagesearch-4 聪明的女孩:计算机视觉和图像搜索引擎使用颜色直方图的指南

原文链接 It’s…it’s a histogram. – Dr. Grant 好吧&#xff0c;也许这不是确切的引用。但是&#xff0c;如果格兰特博士知道颜色直方图的力量&#xff0c;我认为他会同样激动。 更重要的是&#xff0c;当电力耗尽时&#xff0c;直方图不会让游客吃东西。 那么&#xff…

OpenCV 学习笔记(颜色直方图计算 calcHist)

OpenCV 学习笔记&#xff08;颜色直方图计算 calcHist&#xff09; 最近在看一本OpenCV 的书&#xff0c;书名是 《OpenCV 3 Computer Vision Application Programming Cookbook &#xff08;third edition&#xff09;》&#xff0c;里面给了很多很实用的代码片段。最近这几篇…

Opencv绘制HSV颜色直方图

一. 使用Opencv绘制HSV颜色直方图 所用的函数 cvCvtColor 可在&#xff1a; 使用Opencv将RGB颜色空间转换到HSV颜色空间/灰度图 文章中查找相关介绍 所使用的结构体&#xff1a; CvHistogram 以及函数&#xff1a; cvCalcHist CvCreateHist cvGetMinMaxHistValue cv…

基于颜色直方图优化的图像增强方法

最近改图像颜色迁移的论文&#xff0c;审稿人要求补充基于直方图优化的方法细节。趁此机会&#xff0c;我重新下载了相关文献&#xff0c;决定重新学习下该类方法&#xff0c;并把一些细节记录在本篇博客中&#xff0c;供交流学习。 目录 1. 前言 2. 背景知识 3. 颜色变换 4. 颜…

[OpenCV实战]52 在OpenCV中使用颜色直方图

颜色直方图是一种常见的图像特征&#xff0c;顾名思义颜色直方图就是用来反映图像颜色组成分布的直方图。颜色直方图的横轴表示像素值或像素值范围&#xff0c;纵轴表示该像素值范围内像素点的个数或出现频率。颜色直方图属于计算机视觉中的基础概念&#xff0c;其常常被应用于…

关于颜色直方图

一、颜色距 转自&#xff1a;https://blog.csdn.net/jaych/article/details/51137341 1、颜色距离 颜色距离指的是两个颜色之间的差距&#xff0c;通常距离越大&#xff0c;两个颜色相差越大&#xff0c;反之&#xff0c;两个颜色越相近。在计算颜色距离时&#xff0c;有类似…

图像特征分析---颜色特征描述---颜色距和颜色直方图

一、颜色距 转自&#xff1a;https://blog.csdn.net/jaych/article/details/51137341 1、颜色距离颜色距离指的是两个颜色之间的差距&#xff0c;通常距离越大&#xff0c;两个颜色相差越大&#xff0c;反之&#xff0c;两个颜色越相近。在计算颜色距离时&#xff0c;有类似计算…

颜色特征提取(一)——颜色直方图(opencv实现)

直方图——再讲颜色直方图之前&#xff0c;先简单介绍一下直方图。 直方图作为一种简单有效的基于统计特性的特征描述子&#xff0c;在计算机视觉领域广泛使用。它的优点主要体现在两个方面:一是对于任意一个图像区域&#xff0c;直方图特征的提取简单方便;其二&#xff0c;直…

一般颜色直方图

颜色直方图是一种用于图像处理和分析的图表&#xff0c;它可以显示图像中不同颜色的数量。通常&#xff0c;颜色直方图会将颜色分成几个色调区间&#xff0c;每个区间对应一个条形图&#xff0c;其中条形图的高度表示该色调区间中的像素数量。通过颜色直方图&#xff0c;你可以…

网络爬虫Jsoup

简介 网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、…

【Java】Jsoup爬虫快速入门案例

1、前言 该技术博客是根据B站狂神说Java教程的笔记总结&#xff0c;希望能为大家带来帮助&#xff01; 2、Jsoup实战案例 爬虫可以理解为爬取数据&#xff0c;所谓爬取数据就是&#xff1a; 获取请求返回的页面信息&#xff0c;筛选出我们想要的数据 如果想要爬取数据&#…

android爬虫框架jsoup,Android笔记之JSoup爬虫入门

前言 闲扯一些没用的&#xff0c;写这篇文章之前是有点私心的&#xff0c;因为之前评论某简书大v的文章是鸡汤&#xff0c;瞬间被拉黑&#xff0c;连个解释和说明的机会都没有&#xff0c;文章语言干涩&#xff0c;内容平平&#xff0c;于是就好奇到底是些什么样的人喜欢和吹捧…

Java的Jsoup爬虫

Java的Jsoup爬虫&#xff0c;爬携程酒店评分&#xff0c;保存数据库中 前言一、Jsoup爬虫pom二、逻辑代码部分1.首先我们要先确定爬取的东西&#xff0c;这边我就以携程的酒店评分为例子。2.Jsoup进行解析具体要求爬的内容3.接下来我们就是将爬取的数据存入数据库中 总结 前言 …

使用Jsoup爬虫爬取相关图片

一、Jsoup概述 jsoup 是一款Java 的HTML解析器&#xff0c;可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API&#xff0c;可通过DOM&#xff0c;CSS以及类似于jQuery的操作方法来取出和操作数据。 主要功能&#xff1a; 1. 从一个URL&#xff0c;文件或字符串…

jsoup爬虫实战详解之新浪

** jsoup爬虫实战详解之新浪 ** 今天分享一个之前困扰了一段时间的关于jsoup爬取新浪网页信息的踩坑总结。 在实现以上功能的之前我门首先要了解两个重点&#xff1a;1.关于jsoup的爬取细节以及教程&#xff0c;爬取时所要了解jsoup的相关标签&#xff1a;具体的自己大家感兴…

Java JSOUP爬虫学习分享

昨天从狂神大佬那学习了如何用jsoup爬去网站数据&#xff0c;现在整理了一下给大家分享一下。 先创建一个名叫JsoupPojo的实体类用来装入数据。 Data public class JsoupPojo {private String src;private String name; } 下面是将用来爬取的方法封装成了一个工具类 Compon…

java jsoup爬虫

前言&#xff1a;在日常开发中&#xff0c;我们必定是与我们的数据源打交道&#xff0c;我们的数据源无非就那么几个 1.数据库2.爬虫数据 3.第三方系统交互&#xff0c;这里介绍java 中网页版的爬虫jsoup的使用 1.首先导入我们的jar包 maven坐标如下 org.jsoup jsoup 1.13.1 c…