python代码实现下题:读取所提供的图像(一幅彩色图像、一幅灰度图像),显示其直方图,对其进行基本的灰度变换,包括逆变换、分段线性变换、对数变换、幂律变换,显示其结果
时间: 2024-10-21 14:18:02 浏览: 43
在Python中,我们可以使用`PIL`(Pillow库)来处理图像,`matplotlib`来绘制直方图,以及一些数学库来进行灰度变换。以下是一个简单的例子:
```python
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
# 读取图像
img = Image.open('your_image.jpg') # 替换为你的图片路径
# 如果需要处理灰度图像
if img.mode != 'L':
img = img.convert('L')
# 显示原始图像
plt.imshow(img, cmap='gray')
plt.show()
# 直方图
hist, bins = np.histogram(img.flatten(), bins=256, range=(0, 256))
plt.plot(bins[:-1], hist, r'-')
plt.xlabel('灰度值')
plt.ylabel('频率')
plt.title('原图像直方图')
plt.show()
### 灰度变换部分
# 1. 逆变换(直接返回原图,因为灰度图像本身就是灰度)
inv_transform = lambda x: x
# 2. 分段线性变换 (例如,将图像分为三个区间并分别进行缩放)
def linear_segmentation(x):
low, mid, high = 0, 128, 255
return np.piecewise(x, [x < low, x <= mid, x > high], [lambda x: x*0, lambda x: x*2, lambda x: x])
# 3. 对数变换
def log_transform(x):
return np.log(x + 1) # 防止log(0)
# 4. 幂律变换 (例如,y = x^gamma)
def power_law_transform(x, gamma=1.5):
return x**gamma
# 应用变换并展示
transformed_img_inv = inv_transform(img)
transformed_img_linear = linear_segmentation(img)
transformed_img_log = log_transform(img)
transformed_img_power_law = power_law_transform(img)
plt.figure(figsize=(15, 5))
plt.subplot(1, 4, 1), plt.imshow(transformed_img_inv, cmap='gray')
plt.subplot(1, 4, 2), plt.imshow(transformed_img_linear, cmap='gray')
plt.subplot(1, 4, 3), plt.imshow(transformed_img_log, cmap='gray')
plt.subplot(1, 4, 4), plt.imshow(transformed_img_power_law, cmap='gray')
for i in range(4):
plt.suptitle(f"变换后的图像 (第{i+1}种)", fontsize=14)
plt.axis('off')
plt.show()
# 结合每个变换的直方图,如果需要的话
```
阅读全文