image-processing - 如何在 python/pytorch 中的图片上添加白线转换?
问题描述
我正在尝试将微弱的白色对角线(类似于这些线,只是它们是对角线)添加到图像中以用于机器学习任务。有谁知道这些转换是否有名称以及如何在图像上复制它们(最好在 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,如果您需要它完全对角地穿过图像,请将其设置为图像的纵横比。
- 将源和RGBA 转换
lines
为 RGBA,并将 alpha 蒙版转换为灰度, lines
将图像粘贴到source
,使用 alpha 作为蒙版。
推荐阅读
- .net - 在 xaml 中显示当前区域性小数分隔符
- javascript - react组件的执行顺序
- python - 不使用 if-else 的条件参数?
- angular - Angular Eslint config is not extending Project Eslint config
- python - 使用多处理时结合 Pandas DataFrames
- python - 无论如何使用带有 python GUI 框架的 Windows UI 库
- terraform - 创建谷歌云存储桶并使用相同的 terraform 脚本将 terraform 状态保存到其中?
- flutter - 可滚动列和 ListView.builder
- android - 我试图通过 Spring 服务器发送的事件获取我的数据,当使用 streambuilder 快照时我得到空值?
- android - 即使图像是硬编码的,构建偶尔也会显示不正确的可绘制对象