如何在python/pytorch的图片上添加白线变换?
How to add transformation of white lines on a picture in python/pytorch?
我正在尝试将微弱的白色对角线(类似于 these lines 除了它们是对角线)添加到机器学习任务的图像中。有谁知道这些转换是否有名称以及我如何在图像上复制它们(最好在 python/pytorch 中)?
查看这段代码:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
def add_lines(image, line_width = 5, line_intensity = 0.8, row_effect = 0.45):
s_shape = (image.height, image.width)
if row_effect == "aspect":
row_effect = image.width/image.height
lines = Image.fromarray(np.full(s_shape, 255, dtype=np.uint8), "L").convert("RGBA")
alpha = np.zeros(s_shape)
line_fun = lambda x : int(line_intensity*255/2*(np.sin(2*np.pi/line_width*x)+1))
for col_index in range(alpha.shape[1]):
for row_index in range(alpha.shape[0]):
alpha[row_index, col_index] = line_fun(col_index + row_effect*row_index)
alpha = Image.fromarray(np.uint8(alpha), "L")
new_image = image.copy().convert("RGBA")
new_image.paste(lines, (0,0), alpha)
return new_image
source = Image.open("source.jpg")
source_lines = add_lines(source, line_width=5, line_intensity=0.4, row_effect="aspect")
_, axs = plt.subplots(1, 2)
axs[0].imshow(source)
axs[1].imshow(source_lines)
最重要的当然是add_lines
功能。
为了解决您的问题,我们按以下步骤进行:
- 创建具有源图像形状的全白灰度图像,
- 创建一个与源大小相同但全为零的数组,
- 定义一个正弦函数,重新缩放使其在范围 [0, line_intensity*255] 内,周期为 line_width,
- 对于 alpha 数组中的每一列,用列索引作为参数的正弦函数的值填充它,以及行索引的某个百分比,这个百分比定义了线条的“对角线”程度是。如果您需要 45 度角的线条,只需将 row_effect 设置为 1,如果您需要它恰好沿对角线穿过图像,请将其设置为图像的纵横比。
- 将源和
lines
都转换为 RGBA,并将 alpha 蒙版转换为灰度,
- 将
lines
图像粘贴到 source
,使用 alpha 作为遮罩。
这个相对简单的代码产生以下结果:
我正在尝试将微弱的白色对角线(类似于 these lines 除了它们是对角线)添加到机器学习任务的图像中。有谁知道这些转换是否有名称以及我如何在图像上复制它们(最好在 python/pytorch 中)?
查看这段代码:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
def add_lines(image, line_width = 5, line_intensity = 0.8, row_effect = 0.45):
s_shape = (image.height, image.width)
if row_effect == "aspect":
row_effect = image.width/image.height
lines = Image.fromarray(np.full(s_shape, 255, dtype=np.uint8), "L").convert("RGBA")
alpha = np.zeros(s_shape)
line_fun = lambda x : int(line_intensity*255/2*(np.sin(2*np.pi/line_width*x)+1))
for col_index in range(alpha.shape[1]):
for row_index in range(alpha.shape[0]):
alpha[row_index, col_index] = line_fun(col_index + row_effect*row_index)
alpha = Image.fromarray(np.uint8(alpha), "L")
new_image = image.copy().convert("RGBA")
new_image.paste(lines, (0,0), alpha)
return new_image
source = Image.open("source.jpg")
source_lines = add_lines(source, line_width=5, line_intensity=0.4, row_effect="aspect")
_, axs = plt.subplots(1, 2)
axs[0].imshow(source)
axs[1].imshow(source_lines)
最重要的当然是add_lines
功能。
为了解决您的问题,我们按以下步骤进行:
- 创建具有源图像形状的全白灰度图像,
- 创建一个与源大小相同但全为零的数组,
- 定义一个正弦函数,重新缩放使其在范围 [0, line_intensity*255] 内,周期为 line_width,
- 对于 alpha 数组中的每一列,用列索引作为参数的正弦函数的值填充它,以及行索引的某个百分比,这个百分比定义了线条的“对角线”程度是。如果您需要 45 度角的线条,只需将 row_effect 设置为 1,如果您需要它恰好沿对角线穿过图像,请将其设置为图像的纵横比。
- 将源和
lines
都转换为 RGBA,并将 alpha 蒙版转换为灰度, - 将
lines
图像粘贴到source
,使用 alpha 作为遮罩。
这个相对简单的代码产生以下结果: