#第四部分 旋转图片 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 操作之后点和再图上原本的位置不再重合,请分析原因
时间: 2023-06-18 14:08:27 浏览: 112
经过平移和旋转操作后,图像的像素位置发生了变化,导致点集与原本的位置不再重合。这是因为平移和旋转操作会改变图像的坐标系和像素位置,因此点集也需要进行相应的坐标变换才能与图像对应。在代码中,函数 transform_point_set 实现了对点集进行平移和旋转变换的操作,但可能存在一些细节问题导致变换不准确,需要进一步检查和调试。
相关问题
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
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()方法显示处理后的图片。
生成一张图片,把名字的中文和拼音放在中间。对字使用膨胀和腐蚀,在windows11系统上实现
要在Windows 11系统上通过Python实现这个需求,我们可以使用PIL(Pillow库)来处理图片,同时结合第三方库如`opencv-python`来进行膨胀和腐蚀操作。以下是一个简单的步骤概述:
1. 安装所需库:
- 首先,确保已安装`Pillow`和`opencv-python-headless`(如果还没有,可以使用pip安装:`pip install pillow opencv-python-headless`)
2. 导入必要的模块:
```python
from PIL import Image, ImageDraw, ImageFont
import cv2
```
3. 创建并编辑图片:
```python
def draw_text_with_effects(text, pinyin, image_path, output_path):
# 打开原始图片
img = Image.open(image_path)
# 设置字体大小和位置
font_size = 50
text_pos = (img.width // 2, img.height // 2)
pinyin_pos = (text_pos[0] - 50, text_pos[1] + 20)
# 加载中文字体和拼音字体
zh_font = ImageFont.truetype('simhei.ttf', font_size)
pin_font = ImageFont.truetype('simkai.ttf', font_size) # 或者其他合适的拼音字体
# 创建画布
draw = ImageDraw.Draw(img)
# 写入文本
draw.text(text_pos, text, fill=(255, 255, 255), font=zh_font)
draw.text(pinyin_pos, pinyin, fill=(255, 255, 255), font=pin_font)
# 膨胀和腐蚀操作
gray_img = cv2.cvtColor(np.array(img), cv2.COLOR_BGR2GRAY)
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(gray_img, kernel, iterations=1)
dilation = cv2.dilate(erosion, kernel, iterations=1)
dilated_img = cv2.cvtColor(dilation, cv2.COLOR_GRAY2BGR)
# 将腐蚀后的图像合并到原图上
img.paste(dilated_img, box=None, mask=dilated_img)
# 保存结果图片
img.save(output_path)
```
4. 使用函数创建图片:
```python
image_path = 'input.jpg'
output_path = 'output.png'
draw_text_with_effects('姓名', 'pinyin', image_path, output_path)
```
**注意:**
- 这段代码需要在支持中文显示的环境下运行,并且需要有合适的中文字体文件(例如`simhei.ttf`或`simkai.ttf`),以及对应的拼音字体文件。
- 对于膨胀和腐蚀的操作,这里简单地使用了OpenCV的`cv2.erode()`和`cv2.dilate()`函数。实际效果可能会因字体大小、腐蚀核大小等因素而有所不同。
阅读全文