一、核心代码
中心裁剪:代码使用
tf.image.crop_to_bounding_box
函数对输入图像进行中心裁剪。这个函数接受以下参数:
data["image"]
:要裁剪的图像。(height - crop_size) // 2
和(width - crop_size) // 2
:这些参数确定了裁剪框的左上角坐标,以确保在图像中心进行裁剪。crop_size
:裁剪的尺寸。crop_size
:裁剪的尺寸。
二、全量代码?
import matplotlib.pyplot as plt
import tensorflow as tf
from PIL import Image
from io import BytesIO
import requests
from keras import ops
# 定义 preprocess_image 函数
def preprocess_image(data, image_size=256):
height = ops.shape(data["image"])[0]
width = ops.shape(data["image"])[1]
crop_size = ops.minimum(height, width)
image = tf.image.crop_to_bounding_box(
data["image"],
(height - crop_size) // 2,
(width - crop_size) // 2,
crop_size,
crop_size,
)
image = tf.image.resize(image, size=[image_size, image_size], antialias=True)
return ops.clip(image / 255.0, 0.0, 1.0)
# 定义下载图像函数
def download_image(img_url):
response = requests.get(img_url)
if response.status_code == 200:
return response.content
else:
return None
# 定义显示图像函数
def display_image(images,positions):
plt.figure(figsize=(10, 5))
for pos in positions:
plt.subplot(1, 2, pos)
plt.title("Image")
plt.imshow(images[pos-1])
plt.axis("off")
plt.show()
# 定义主函数
def process_and_display_image(img_url, image_size=256):
# 下载图像
image_data = download_image(img_url)
if image_data is not None:
# 创建Pillow图像对象
image = Image.open(BytesIO(image_data))
# 转换为TensorFlow张量
image = tf.convert_to_tensor(image)
# 调用预处理函数进行图像预处理
preprocessed_image = preprocess_image({"image": image}, image_size=image_size)
# 显示原始图像和预处理后的图像
display_image([image,preprocessed_image.numpy()],[1,2])
else:
print("Failed to retrieve the image.")
# 调用主函数并传递图像URL和其他参数
img_url = 'https://pic1.zhimg.com/80/v2-23e87ffc0da8098a9f7d733cdee58ff4_1440w.webp?source=2c26e567'
process_and_display_image(img_url)
三、结果