python写直方图均衡化,不用opencv,和函数
时间: 2023-05-15 07:05:00 浏览: 165
可以使用Python的PIL库来实现直方图均衡化,以下是示例代码:
```python
from PIL import Image
def histeq(image_path):
# 打开图像
image = Image.open(image_path).convert('L')
# 获取直方图
hist = image.histogram()
# 计算累积直方图
cdf = [sum(hist[:i+1]) for i in range(len(hist))]
# 计算映射表
lut = [int((cdf[i]-cdf[0])/(image.size[0]*image.size[1]-cdf[0])*255) for i in range(len(cdf))]
# 应用映射表
result = Image.new('L', image.size)
result.putdata([lut[p] for p in image.getdata()])
return result
```
调用该函数并传入图像路径即可实现直方图均衡化。
注意:该代码仅适用于灰度图像。如果要处理彩色图像,需要将图像转换为YUV或HSV色彩空间,对亮度通道进行直方图均衡化。
相关问题
python写直方图均衡化,不用opencv和函数,使用matplotlib
可以使用numpy和matplotlib库来实现直方图均衡化,以下是示例代码:
```python
import numpy as np
import matplotlib.pyplot as plt
# 读取图像并转换为灰度图像
img = plt.imread('image.jpg')
gray = np.dot(img[...,:3], [0.299, 0.587, 0.114])
# 计算灰度直方图
hist, bins = np.histogram(gray.flatten(), 256, [0,256])
# 计算累积分布函数
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max() / cdf.max()
# 计算均衡化后的像素值
equalized = np.interp(gray.flatten(), bins[:-1], cdf_normalized)
# 将像素值重新变为图像
equalized = equalized.reshape(gray.shape)
# 显示原图和均衡化后的图像
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
axs[0].imshow(gray, cmap='gray')
axs[0].set_title('Original')
axs[1].imshow(equalized, cmap='gray')
axs[1].set_title('Equalized')
plt.show()
```
这段代码使用numpy的histogram函数计算灰度直方图,然后计算累积分布函数,并使用numpy的interp函数计算均衡化后的像素值。最后将像素值重新变为图像,并使用matplotlib显示原图和均衡化后的图像。
opencv-python 图像直方图和直方图均衡化
OpenCV-Python是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。其中,图像直方图和直方图均衡化是图像处理中常用的技术。
1. 图像直方图:
图像直方图是一种统计图,用于表示图像中各个灰度级别的像素数量。它可以帮助我们了解图像的亮度分布情况。直方图通常以灰度级别为横坐标,像素数量为纵坐标进行绘制。通过分析直方图,我们可以得到图像的亮度信息,进而进行后续的图像处理操作。
2. 直方图均衡化:
直方图均衡化是一种用于增强图像对比度的方法。它通过重新分布图像的灰度级别,使得图像中各个灰度级别的像素数量尽可能均匀分布。这样可以使得图像的亮度范围更广,细节更加清晰。直方图均衡化的过程包括以下几个步骤:
- 计算原始图像的灰度直方图;
- 计算累积分布函数(CDF);
- 根据CDF对原始图像进行灰度级别映射,得到均衡化后的图像。
通过直方图均衡化,我们可以改善图像的视觉效果,使得图像更加清晰、对比度更强。