直方图均衡化处理

本文介绍了图像直方图的概念,并详细讲解了如何使用OpenCV的全局直方图均衡化equalizeHist和局部直方图均衡化createCLAHE进行图像对比度增强。通过测试代码展示了在灰度图和彩色照片上的应用效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:

Python+OpenCV图像处理之图像直方图 - 九块九毛九 - 博客园

python+opencv直方图均衡化_我是小蚂蚁-优快云博客

1.直方图

图像直方图是反映一个图像像素分布的统计表,其横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。

(1)函数接口

cv.calcHist(	
                images, 
                channels, 
                mask, 
                histSize, 
                ranges[, hist[, accumulate]]	
) 

->	hist

(2)参数说明

images源图像[img]
channels

图像的通道

灰度[0]

彩色[0][1][2]

mask

掩码对象-统计图像的一部分像素点

全部统计:None

histSize绘制直方图的个数 [256]
ranges绘制像素点的范围 [0,255]

(3)测试代码

import cv2
import matplotlib.pyplot as plt

# 获取照片
img=cv2.imread(r"C:\Users\Nobody\Desktop\img1.png",1)
# 缩放
img1=cv2.resize(img,None,fx=0.3,fy=0.3)
cv2.imshow('img1',img1)
# 获取直方图
hist_b=cv2.calcHist([img1],[0],None,[256],[0,255])
hist_g=cv2.calcHist([img1],[1],None,[256],[0,255])
hist_r=cv2.calcHist([img1],[2],None,[256],[0,255])
# 绘制直方图
plt.plot(hist_b,'b')
plt.plot(hist_g,'g')
plt.plot(hist_r,'r')
plt.show()

结果输出

 

根据直方图可以看出,图像大部分的像素点聚集在某几个值上,形成尖峰。

掩码直方图测试代码:

只能针对灰度图

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 获取照片
img=cv2.imread(r"C:\Users\Nobody\Desktop\img1.png",0)
# 缩放
img1=cv2.resize(img,None,fx=0.3,fy=0.3)
mask=np.zeros(img1.shape,np.uint8)
# 选择哪一部分的图像进行展示
mask[50:150,200:400]=255

# 与操作
hist_full=cv2.bitwise_and(img1,mask)
# 显示掩码图像
imgs=np.hstack([img1,mask,hist_full])
cv2.imshow('imgs',imgs)
# 获取掩码的直方图
hist=cv2.calcHist([hist_full],[0],mask,[256],[0,255])
# 绘制掩码直方图
plt.plot(hist,'r')
plt.show()

 

 

 

2.图像均衡化

直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法,是图像增强的一个手段。

直方图均衡化函数包括全局直方图均衡化equalizeHist和局部直方图均衡化createCLAHE

(1)全局直方图均衡化equalizeHist

函数接口:

cv.equalizeHist(	
                    src[, dst]	
) 

->	dst

H'_i = \sum _{0 \le j < i} H(j)

参数说明:

srcSource 8-bit single channel image.
dstDestination image of the same size and type as src .

更多参考:

OpenCV: Histograms

代码测试——灰度照片

import cv2
import numpy as np

# 获取照片
img=cv2.imread(r"C:\Users\Nobody\Desktop\flower.png",0)
# 缩放
img_resize=cv2.resize(img,None,fx=0.5,fy=0.5)
# 图像均衡化
img_equ=cv2.equalizeHist(img_resize)
imgs=np.hstack([img_resize,img_equ])
cv2.imshow('imgs',imgs)
cv2.waitKey()

 

代码测试——彩色照片

import cv2
import numpy as np

# 获取照片
img=cv2.imread(r"C:\Users\Nobody\Desktop\flower.png",1)
# 缩放
img_resize=cv2.resize(img,None,fx=0.5,fy=0.5)
# b g r分离
(b,g,r)=cv2.split(img_resize)
# 图像均衡化
img_b=cv2.equalizeHist(b)
img_g=cv2.equalizeHist(g)
img_r=cv2.equalizeHist(r)
# b g r合成
new_img=cv2.merge((img_b,img_g,img_r))
imgs=np.hstack([img_resize,new_img])
cv2.imshow('imgs',imgs)
cv2.waitKey()

 

(2)局部直方图均衡化createCLAHE

函数接口:

cv.createCLAHE(	
                [, clipLimit[, tileGridSize]]	
) 

->	retval

参数说明:

clipLimit

小于clipLimit的像素点不参与均分,大于才参与均分

越接近于0表示越接近于原图

tileGridSize划分多少块

测试代码——灰度照片

import cv2
import numpy as np

# 获取照片
img=cv2.imread(r"C:\Users\Nobody\Desktop\flower.png",0)
# 缩放
img_resize=cv2.resize(img,None,fx=0.5,fy=0.5)
# 局部图像均衡化
model=cv2.createCLAHE(clipLimit=20,tileGridSize=(3,3))
new_img=model.apply(img_resize)
imgs=np.hstack([img_resize,new_img])
cv2.imshow('imgs',imgs)
cv2.waitKey()

 

 测试代码——彩色照片

import cv2
import numpy as np

# 获取照片
img=cv2.imread(r"C:\Users\Nobody\Desktop\flower.png",1)
# 缩放
img_resize=cv2.resize(img,None,fx=0.5,fy=0.5)
# b g r分割
(b,g,r)=cv2.split(img_resize)
# 局部图像均衡化
model=cv2.createCLAHE(clipLimit=20,tileGridSize=(3,3))
new_b=model.apply(b)
new_g=model.apply(g)
new_r=model.apply(r)
# 图像合并
new_img=cv2.merge((new_b,new_g,new_r))
imgs=np.hstack([img_resize,new_img])
cv2.imshow('imgs',imgs)
cv2.waitKey()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值