首页 > 解决方案 > 如何在 python/pytorch 中的图片上添加白线转换?

问题描述

我正在尝试将微弱的白色对角线(类似于这些线,只是它们是对角线)添加到图像中以用于机器学习任务。有谁知道这些转换是否有名称以及如何在图像上复制它们(最好在 python/pytorch 中)?

标签: image-processingcomputer-vision

解决方案


查看这段代码:


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,如果您需要它完全对角地穿过图像,请将其设置为图像的纵横比。
  • 将源和RGBA 转换lines为 RGBA,并将 alpha 蒙版转换为灰度,
  • lines将图像粘贴到source,使用 alpha 作为蒙版。

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


推荐阅读