用简单的python代码实现以下要求对两幅不同大小的图像执行加、减、乘、除操作,在同一个窗口内分成五个子窗口来分别显示,注上“原图像A,原图像B,加法图像,减法图像,乘法图像,除法图像”文字标题。
时间: 2024-09-22 21:09:42 浏览: 43
在Python中,我们可以使用PIL(Pillow)库来进行图像处理,NumPy进行数值计算,并且`matplotlib`用于创建图像和子图。以下是一个简单的例子,展示了如何实现这个需求:
```python
from PIL import Image, ImageMath
import numpy as np
# 假设我们有两个图像文件,img_a.jpg和img_b.jpg
img_a = Image.open('img_a.jpg')
img_b = Image.open('img_b.jpg')
# 确保图片大小相等,如果不等则可以调整大小或填充
width, height = min(img_a.size), min(img_a.size)
img_a = img_a.resize((width, height))
img_b = img_b.resize((width, height))
# 将图片转换为numpy数组进行运算
arr_a = np.array(img_a.convert('RGB'))
arr_b = np.array(img_b.convert('RGB'))
# 加、减、乘、除运算
add_img = arr_a + arr_b
subtract_img = arr_a - arr_b
multiply_img = arr_a * arr_b
divide_img = arr_a / arr_b # 注意这里可能会出现除零错误,需要处理
# 再将结果转回PIL图像并添加到新的ImageMath实例上
math_add = ImageMath.eval('a + b', a=img_a, b=img_b)
math_subtract = ImageMath.eval('a - b', a=img_a, b=img_b)
math_multiply = ImageMath.eval('a * b', a=img_a, b=img_b)
try:
math_divide = ImageMath.eval('a / b', a=img_a, b=img_b)
except ZeroDivisionError:
math_divide = "Cannot divide by zero"
# 创建一个新的ImageGrid来显示5个子窗口
fig, axs = plt.subplots(nrows=2, ncols=3, figsize=(10, 6))
axs[0, 0].imshow(img_a, cmap='gray')
axs[0, 0].set_title('原图像A')
axs[0, 1].imshow(img_b, cmap='gray')
axs[0, 1].set_title('原图像B')
axs[0, 2].imshow(math_add, cmap='gray')
axs[0, 2].set_title('加法图像')
axs[1, 0].imshow(subtract_img, cmap='gray')
axs[1, 0].set_title('减法图像')
axs[1, 1].imshow(multiply_img, cmap='gray')
axs[1, 1].set_title('乘法图像')
if math_divide != "Cannot divide by zero":
axs[1, 2].imshow(math_divide, cmap='gray')
axs[1, 2].set_title('除法图像 (若存在除零错误,则显示此信息)')
else:
axs[1, 2].text(0.5, 0.5, 'Cannot divide by zero', fontsize=14)
plt.tight_layout()
plt.show()
阅读全文