如何在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 作为遮罩。

这个相对简单的代码产生以下结果: