第三章习题
3-1请使用PIL库读取一张图像,并从中裁剪出一个150×150像素的区域,该区域的左上角坐标为(100,100)。接着,将裁剪得到的区域旋转45度,并将其粘贴回原图像的左上角。完成这些操作后,将处理后的图像保存为一个新的文件。请提供代码示例,并显示处理前后的图像,解释裁剪、旋转和粘贴操作的效果。
答:代码示例:
fromPILimportImage
#读取图像
image=Image.open(input_image.jpg)
#裁剪出150x150像素的区域,左上角坐标为(100,100)
cropped_region=image.crop((100,100,250,250))
#将裁剪的区域旋转45度
rotated_region=cropped_region.rotate(45,expand=True)
#将旋转后的区域粘贴回原图像的左上角
image.paste(rotated_region,(0,0))
#保存处理后的图像
image.save(output_image.jpg)
解释裁剪、旋转和粘贴操作的效果
裁剪操作:使用crop()方法从原图像中截取一个左上角坐标为(100,100)、宽高为150×150的区域。这一部分被存储为一个新的图像对象cropped_region。
旋转操作:使用rotate()方法将裁剪得到的区域旋转45度,并且使用expand=True参数来自动调整图像大小以适应旋转后的区域,这样不会剪裁掉旋转后的部分。
粘贴操作:使用paste()方法将旋转后的图像区域粘贴到原图像的左上角(0,0)位置。
3-2使用Matplotlib库读取并显示一张图像。在图像中绘制一个红色的点,点的坐标为(50,50),并绘制一条绿色的直线,直线的起始坐标为(20,20),终止坐标为(100,100)。此外,计算并绘制图像的灰度直方图,解释直方图的形状及其含义。请提供代码示例,并显示绘制点和线后的图像,解释直方图的生成过程及其分析。
答:代码示例:
importmatplotlib.pyplotasplt
importnumpyasnp
fromPILimportImage
#使用PIL读取图像
image_path=input_image.jpg#请替换为你的图像文件路径
image=Image.open(image_path)
#将图像转换为NumPy数组以便Matplotlib处理
image_array=np.array(image)
#显示图像并绘制点和线
plt.figure(figsize=(10,5))
#在子图1中绘制原始图像
plt.subplot(1,2,1)
plt.imshow(image_array)
plt.scatter(50,50,color=red,s=40)#绘制红色点
plt.plot([20,100],[20,100],color=green,linewidth=2)#绘制绿色线
plt.title(ImagewithPointandLine)
plt.axis(off)
#将图像转换为灰度并计算灰度直方图
gray_image=image.convert(L)
gray_array=np.array(gray_image)
#在子图2中绘制灰度直方图
plt.subplot(1,2,2)
plt.hist(gray_array.ravel(),bins=256,range=(0,256),color=black)
plt.title(GrayscaleHistogram)
plt.xlabel(PixelIntensity)
plt.ylabel(Frequency)
#显示所有的绘图结果
plt.tight_layout()
plt.show()
解释图像上的点和线绘制
红色点绘制:
使用plt.scatter()方法在图像的(50,50)坐标处绘制一个大小为40的红色点。
绿色线绘制:
使用plt.plot()方法从坐标(20,20)到(100,100)绘制一条绿色的线。
解释灰度直方图生成过程及其含义
生成过程:首先将原图像转换为灰度模式,得到每个像素的灰度值。然后使用plt.hist()函数计算并绘制灰度值的频率分布。
直方图的含义:横轴表示灰度值(从0到255),纵轴表示每个灰度值的像素频率。直方图的形状反映了图像亮度的分布:
如果直方图集中在