【Opencv3教程】Opencv-python入门篇(二)直方图均衡化

直方图均衡化:

1 直方图:

对于灰度图,直方图用于统计 [ 0 , 255 ] [0,255] [0,255] 区间内每个像素值出现的次数;

import cv2

import matplotlib.pyplot as plt

import numpy as np

image = cv2.imread('./sample.jpg')

image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

plt.imshow(image, cmap='gray')
plt.show()

plt.hist(image.ravel(), 256, [0, 256])
plt.show()

我们读入测试图像并统计直方图:
在这里插入图片描述
在这里插入图片描述

2 直方图均衡化的原理:

可以看到像素值的分布是不均衡的,而直方图均衡化可以使图像具有较大的灰度动态范围和较高的对比度,同时图像的细节更为丰富;

即,假设我们有如图数据:
在这里插入图片描述
我们从小到大统计每个像素值出现的概率 p i p_i pi,并计算累积概率 P i P_i Pi,其中:

P i = ∑ j = 0 i p i P_i=\sum_{j=0}^{i}p_i Pi=j=0ipi

即:
在这里插入图片描述

则第 i i i 个值 a i a_i ai 经过均衡化的新灰度值 A i A_i Ai 为:

A i = [ P i × ( a m a x − a m i n ) ] A_i=[P_i×(a_{max}-a_{min})] Ai=[Pi×(amaxamin)],其中对于灰度图 a m a x = 255 , a m i n = 0 a_{max}=255,a_{min}=0 amax=255,amin=0;

得到的经过转换的图像为:
在这里插入图片描述

3 直方图均衡化的 python 实现:

import cv2

import matplotlib.pyplot as plt

import numpy as np

image = cv2.imread('./sample.jpg')

image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

equal = cv2.equalizeHist(image)

plt.hist(equal.ravel(), 256, [0, 256])
plt.show()

经过直方图均衡化的图像的直方图如图所示:
在这里插入图片描述

左图为原图,右图为均衡化之后的结果:

在这里插入图片描述

4 自适应直方图均衡化:

由于不同物体对应图像不同区域,因此首先对图像分区,再分别对每个区域进行直方图均衡化似乎更合理一些,我们就称这种方法为自适应直方图均衡化:

import cv2

import matplotlib.pyplot as plt

import numpy as np

image = cv2.imread('./sample.jpg')

image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

equal = cv2.equalizeHist(image)

result = np.hstack([image, equal])

clahe = cv2.createCLAHE(2.0, (8, 8)) 
# clipLimit:颜色对比度的阈值
# titleGridSize:进行像素均衡化的网格大小
res = clahe.apply(image)
result = np.hstack([result, res])

plt.imshow(result, cmap='gray')
plt.show()

从左至右依次为:原图,直方图均衡化,自适应直方图均衡化

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIT可达鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值