from PIL import Image import numpy as np import matplotlib.pyplot as plt img = Image.open("work/Lena_RGB.jpg") plt.imshow(img) plt.show() plt.close() img_gray = img.convert('L') # 转换为灰度图像 img_arr = np.array(img_gray) h, w = img_arr.shape gray_levels = np.arange(256) freq = np.zeros(256) for i in range(h): for j in range(w): freq[img_arr[i, j]] += 1 prob = freq / (h * w) plt.bar(gray_levels, prob) fig, axs = plt.subplots(2, 2, figsize=(12, 8)) axs[0, 0].imshow(img, cmap='gray') axs[0, 0].set_title('Original Image') axs[0, 1].bar(gray_levels, freq) axs[0, 1].set_title('Gray Level Frequency') axs[1, 0].bar(gray_levels, self_info) axs[1, 0].set_title('Self Information') axs[1, 1].text(0.5, 0.5, f'Entropy: {entropy:.2f}', fontsize=20, ha='center') axs[1, 1].axis('off') plt.show()
时间: 2023-12-30 21:04:58 浏览: 70
这段代码使用了 Python 的PIL库来打开一张RGB图像,然后将其转换为灰度图像。接着,使用numpy库将灰度图像转换为数组,计算出每个灰度级别的频率,并绘制直方图。最后,计算图像的熵并显示结果。其中,plt是matplotlib库中的绘图函数。如果你对其中的某些函数不熟悉,我可以为你详细解释一下。
相关问题
from PIL import Image import numpy as np import matplotlib.pyplot as plt img = Image.open("work/Lena_RGB.jpg") plt.imshow(img) plt.show() plt.close() img_arr = np.array(img) h,w = img_arr.shape gray_levels = np.arange(256) freq = np.zeros(256) for i in range(h): for j in range(w): freq[img_arr[i, j]] += 1 prob = freq / (h * w)
这段代码是用Python处理图像的代码,主要功能是打开一张名为"Lena_RGB.jpg"的图片,并将其转化为numpy数组形式。然后使用matplotlib库中的plt.imshow()和plt.show()函数将图片显示出来。接下来,代码计算了图片中每个像素值的出现频率,并将其存储在名为freq的数组中。最后,根据频率数组计算每个像素值的概率,并将其存储在名为prob的数组中。
用matplotlib重新写上述的程序,16位二进制数据本身就是RGB565格式,无需再次转换。
好的,以下是用matplotlib重新写的程序:
```python
import numpy as np
import matplotlib.pyplot as plt
# 读取二进制文件
with open('lena_256x256_rgb565.bin', 'rb') as f:
data = f.read()
# 将二进制数据转换成numpy数组
arr = np.frombuffer(data, dtype=np.uint16)
# 将RGB565格式的数据拆分成R、G、B三个通道
r = ((arr & 0xf800) >> 11) << 3
g = ((arr & 0x07e0) >> 5) << 2
b = (arr & 0x001f) << 3
# 将R、G、B三个通道合并成RGB图像
rgb = np.dstack((r, g, b))
# 显示图像
plt.imshow(rgb)
plt.show()
```
这个程序与之前的程序相比,最大的不同在于使用了matplotlib库来显示图像。我们可以使用`plt.imshow`函数来显示numpy数组对应的图像,而无需使用PIL库。同时,由于16位二进制数据本身就是RGB565格式,因此无需再次转换。
阅读全文