NeRF-w 渲染后的图像效果的定性对比,对局部放大以观察细节效果。如下
对单张渲染后的图像,选择指定区域并进行放大操作,然后将原始图像、处理后的两个区域以及标记连线的新图像,如下图
代码
from PIL import Image, ImageDraw
# 读取并放大图片的指定区域
def process_image(image_path):
# 打开图像
img = Image.open(image_path)
# 获取图像的宽度和高度
width, height = img.size
# 确定选中区域1的大小(假设为原始高度的三分之一)
size1 = height // 3
half_size1 = size1 // 2
# 确定选中区域2的大小(假设为原始高度的五分之一)
size2 = height // 5
half_size2 = size2 // 2
# 确定区域1的坐标(右上方)
box1 = (max(0, width // 2), max(0, height // 2 - size1), min(width, width // 2 + size1), min(height, height // 2))
# 确定区域2的坐标(左下方)
box2 = (max(0, width // 2 - size2), max(0, height // 2), min(width, width // 2), min(height, height // 2 + size2))
# 复制选定的区域并放大
region1 = img.crop(box1)
region1 = region1.resize((region1.width * 2, region1.height * 2))
region2 = img.crop(box2)
region2 = region2.resize((region1.width, region1.height))
# 在原始图像上绘制矩形框
draw = ImageDraw.Draw(img)
draw.rectangle(box1, outline='red', width=3)
draw.rectangle(box2, outline='blue', width=3)
# 在子图上绘制矩形框
draw1 = ImageDraw.Draw(region1)
draw2 = ImageDraw.Draw(region2)
draw1.rectangle((0, 0, region1.width, region1.height), outline='red', width=3)
draw2.rectangle((0, 0, region2.width, region2.height), outline='blue', width=3)
# 创建一个新的空白图像,大小为原始图像的宽度,高度为原始图像高度加上最大高度的子图以及一些间隙
# new_height = height + max(region1.height, region2.height) + 30 # 加上一些间隙
new_height = height + max(region1.height, region2.height) # 加上一些间隙
new_img = Image.new('RGB', (width, new_height))
# 计算子图位置
offset = 10 # 两个子图之间的间隙
new_img.paste(img, (0, 0))
new_img.paste(region1, (width // 2, height + offset))
new_img.paste(region2, (0, height + offset))
# 获取两个矩形框的中心点
box1_center = ((box1[0] + box1[2]) // 2, box1[3]) # 取框下中心
box2_center = ((box2[0] + box2[2]) // 2, box2[3]) # 取框下中心
region1_center = (width // 2 + region1.width // 2, height + offset) # 取子图上中心
region2_center = (region2.width // 2, height + offset ) # 取子图下中心
# 在原图区域框的下面和子图框的上面绘制红色和蓝色的连线
draw_line = ImageDraw.Draw(new_img)
draw_line.line([box1_center, region1_center], fill='red', width=2)
draw_line.line([box2_center, region2_center], fill='blue', width=2)
return new_img
# 读取5张图片并处理
image_paths = ["./test_images/001.png", "./test_images/002.png", "./test_images/003.png", "./test_images/004.png", "./test_images/005.png"]
for i, path in enumerate(image_paths):
new_image = process_image(path)
new_image.save(f"./test_images/new_image_{i + 1}.jpg") # 保存新的图片
这段代码是一个Python脚本,用于处理输入的图像文件,选择特定区域并对其进行放大操作,然后将原始图像、处理后的两个区域进行标记后的新图像保存到文件中。以下是代码的总结:
处理图像功能:
- 打开并读取图像。
- 确定两个指定区域的位置和大小。
- 选取指定区域并放大。
- 在原始图像和子图上绘制矩形框。
创建新图像:
- 创建一张新的空白图像。
- 将原始图像和两个处理后的区域放置在新图像中,并绘制连接这些区域的线条。
处理多张图像:
- 循环处理图像列表中的每张图像。
- 保存处理后的图像。
总结:
该代码用于处理图像中的特定区域并放大,并在新图像上显示原始图像、处理后的两个区域,以及用颜色标记连接这些区域。
注意:
- 在处理过程中,子图的位置被计算,然后这些子图被粘贴到新图像中。
- 连接线的位置是根据处理后的区域和原始图像区域的中心点进行绘制。
对以上代码进行改进,由鼠标选中需要放大的两个图像区域 。