from PIL import Image, ImageDraw # 将图片平移并旋转 gray2 = Image.fromarray(src) width, height = gray2.size # 计算中心点和X轴角度 center = (max_point[0], max_point[1]) angle = np.arctan2(point2[1] - max_point[1], point2[0] - max_point[0]) * 180 / np.pi img_translated = gr
时间: 2023-06-18 17:08:15 浏览: 134
ay2.transform((width, height), Image.AFFINE, (1, 0, -center[0], 0, 1, -center[1])) # 平移图片
img_rotated = img_translated.rotate(angle) # 旋转图片
draw = ImageDraw.Draw(img_rotated) # 获取绘图对象
draw.line([max_point, point2], fill='red', width=2) # 绘制直线
img_rotated.show() # 显示处理后的图片
以上代码是对一张图片进行平移和旋转,并在图片上绘制一条直线。首先利用PIL库中的Image类将数组转换成图片对象,然后计算中心点和旋转角度,利用transform()方法平移图片,利用rotate()方法旋转图片,最后利用Draw类绘制直线。最后通过show()方法显示处理后的图片。
相关问题
#第四部分 旋转图片 from PIL import Image, ImageDraw # 将图片平移并旋转 gray2 = Image.fromarray(src) width, height = gray2.size # 计算中心点和X轴角度 center = (max_point[0], max_point[1]) angle = np.arctan2(point2[1] - max_point[1], point2[0] - max_point[0]) * 180 / np.pi img_translated = gray2.transform((width, height), Image.AFFINE, (1, 0, center[0] - width/2, 0, 1, center[1] - height/2), resample=Image.BICUBIC) img_translated_rotated = img_translated.rotate(angle, resample=Image.BICUBIC, expand=True) #img_translated_rotated.show() import cv2 GRID_STEP = distance/2 # 设置10*10栅格(暂时尝试) grid_num_x = 10 grid_num_y = 10 def transform_point_set(points, max_point, distance, angle): # 平移向量 translation_vector = np.array([distance * np.cos(angle*np.pi/180), distance * np.sin(angle*np.pi/180)]) # 旋转矩阵 rotation_matrix = np.array([[np.cos(angle*np.pi/180), -np.sin(angle*np.pi/180)], [np.sin(angle*np.pi/180), np.cos(angle*np.pi/180)]]) # 将点集转换为 numpy 数组 point_array = np.array(points) max_point_array = np.array(max_point) # 对点集进行平移和旋转 point_array = (point_array - max_point_array) @ rotation_matrix + max_point_array + translation_vector # 将 numpy 数组转换为列表 points2 = point_array.tolist() return points2 操作之后点和再图上原本的位置不再重合,请分析原因
经过平移和旋转操作后,图像的像素位置发生了变化,导致点集与原本的位置不再重合。这是因为平移和旋转操作会改变图像的坐标系和像素位置,因此点集也需要进行相应的坐标变换才能与图像对应。在代码中,函数 transform_point_set 实现了对点集进行平移和旋转变换的操作,但可能存在一些细节问题导致变换不准确,需要进一步检查和调试。
如何实现创建主窗口和控件,如按钮、标签、画布等,用于显示用户输入的手写数字图片和识别结果。
在Python中,可以使用Tkinter模块来创建GUI应用程序。以下是一个示例代码,可以创建一个主窗口和一个画布,用于显示用户输入的手写数字图片和识别结果,并且还有一个按钮,用于触发识别操作。
```python
import tkinter as tk
import numpy as np
from PIL import Image, ImageDraw
import tensorflow as tf
# 加载模型
model = tf.keras.models.load_model('path/to/model')
# 创建主窗口
root = tk.Tk()
root.title('Handwritten Digit Recognition')
# 创建画布
canvas = tk.Canvas(root, width=280, height=280, bg='white')
canvas.pack()
# 创建标签
label = tk.Label(root, text='Draw a digit from 0 to 9', font=('Arial', 16))
label.pack()
# 创建按钮
button = tk.Button(root, text='Recognize', font=('Arial', 16), command=lambda: recognize(canvas))
button.pack()
# 定义识别函数
def recognize(canvas):
# 将画布上的图像转换为28x28的灰度图像
img = Image.new('L', (28, 28), 'white')
draw = ImageDraw.Draw(img)
canvas_img = canvas.postscript(colormode='gray')
img.paste(Image.open(io.BytesIO(canvas_img.encode('utf-8'))).resize((20, 20)), (4, 4))
img = np.asarray(img).reshape(1, 28, 28, 1) / 255.0
# 使用模型进行识别
pred = model.predict(img)
digit = np.argmax(pred)
# 显示识别结果
label.config(text='The digit is {}'.format(digit))
# 运行主循环
root.mainloop()
```
在这个示例中,我们通过Tkinter创建了一个主窗口,并在其中添加了一个画布、一个标签和一个按钮。当用户在画布上绘制完手写数字后,点击按钮,程序会将画布上的图像转换为28x28的灰度图像,并使用预训练的模型进行识别。最后,程序将识别结果显示在标签中。
阅读全文