直方图均衡化python代码怎么写
时间: 2023-09-15 10:05:30 浏览: 123
### 回答1:
下面是一个简单的直方图均衡化代码:
```
import cv2
import numpy as np
def hist_equalize(img):
# 将图像从 BGR 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 计算灰度图的直方图
hist = cv2.calcHist([gray], [0], None, [256], [0, 256])
# 计算累积分布函数
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max() / cdf.max()
# 创建映射表
lookup_table = np.zeros((256, 1), dtype='uint8')
for i in range(256):
lookup_table[i][0] = cdf_normalized[i]
# 应用映射表
result = cv2.LUT(gray, lookup_table)
return result
# 读入图像
img = cv2.imread('example.jpg')
# 对图像进行直方图均衡化
result = hist_equalize(img)
# 显示结果图像
cv2.imshow('Histogram Equalized Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
此代码使用了 OpenCV 库,需要先安装 OpenCV 库。
### 回答2:
直方图均衡化是一种用于增强图像对比度的方法,通过对图像像素值进行重新分布来实现。下面是一个用Python实现直方图均衡化的示例代码:
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
image = cv2.imread("input.jpg", 0)
# 计算直方图
hist, bins = np.histogram(image.flatten(), 256, [0, 256])
# 计算累计分布函数(CDF)
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max() / cdf.max()
# 对CDF进行线性插值,生成新像素值
cdf_normalized = np.ma.filled(cdf_normalized, 0).astype('uint8')
# 对图像每个像素值进行映射
equ_image = cdf_normalized[image]
# 生成直方图均衡化后的图像
equ_image = np.reshape(equ_image, image.shape)
# 显示原始图像和直方图均衡化后的图像
plt.subplot(121), plt.imshow(image, cmap='gray'), plt.title('Original Image')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(equ_image, cmap='gray'), plt.title('Histogram Equalization')
plt.xticks([]), plt.yticks([])
plt.show()
```
在代码中,首先使用OpenCV库中的`cv2.imread()`函数读取输入图像。然后,通过`np.histogram()`函数计算图像的直方图,并生成256个直方图bin。接下来,利用累计分布函数(CDF),通过对CDF进行线性插值来生成新的像素值。最后,将直方图均衡化后的像素值重新映射到原始图像的每个像素上,并展示原始图像和直方图均衡化后的图像。
需要注意的是,在运行代码前要确保安装了相应的库,如OpenCV、NumPy和Matplotlib。并将代码中的`"input.jpg"`替换为你要处理的图像路径。最后,运行代码即可生成直方图均衡化后的图像和显示在matplotlib窗口中。
### 回答3:
直方图均衡化是一种图像处理方法,用于提高图像的对比度。在Python中,可以使用OpenCV库来实现直方图均衡化。
下面是一个简单的Python代码示例:
```python
import cv2
# 读取原始图像
img = cv2.imread('input.jpg', 0)
# 应用直方图均衡化
equ = cv2.equalizeHist(img)
# 显示原始图像和直方图均衡化后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Equalized Image', equ)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
上述代码首先使用`cv2.imread()`函数读取一张原始图像,并将其转为灰度图像。然后使用`cv2.equalizeHist()`函数应用直方图均衡化。最后使用`cv2.imshow()`函数显示原始图像和直方图均衡化后的图像。
请注意,代码中的`input.jpg`是原始图像的文件名,在运行代码前需要将其替换为实际的图像文件名。
此外,还可以进一步调整直方图均衡化的参数,以获得更好的效果。例如,可以使用`cv2.createCLAHE()`方法创建一个自适应直方图均衡化器,并对图像进行均衡化。
```python
import cv2
# 读取原始图像
img = cv2.imread('input.jpg', 0)
# 创建自适应直方图均衡化器
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
# 应用自适应直方图均衡化
equ = clahe.apply(img)
# 显示原始图像和直方图均衡化后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Equalized Image', equ)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上述代码中,`cv2.createCLAHE()`方法用于创建一个自适应直方图均衡化器,其中`clipLimit`参数用于控制对比度限制,`tileGridSize`参数用于指定每个块的大小。
通过这样的代码,可以实现直方图均衡化并观察图像的对比度提升效果。
阅读全文