如何使用opencv自动随机生成类似刮痕的线条

2024-04-25 08:24:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为我的深度学习模型生成合成图像。我需要在黑色表面上画划痕。我已经有了一个小脚本,可以生成随机的白色划痕状线条,但只能水平生成。我需要的划痕也垂直和弯曲。最重要的是,如果划痕的厚度也是随机的,这也会非常有用,所以我有厚的和薄的划痕

这是我目前的代码:

import cv2
import numpy as np
import random

height = 384
width = 384
blank_image = np.zeros((height, width, 3), np.uint8)

num_scratches= random.randint(0,5)
for _ in range(num_scratches):
    row_random = random.randint(20,370)
    blank_image[row_random:(row_random+1), row_random:(row_random+random.randint(25,75))] = (255,255,255)

cv2.imshow("synthetic", blank_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

这是一个示例结果:

enter image description here

我必须如何编辑我的脚本才能获得更多样化的外观

划痕看起来应该是这样的,例如(用油漆完成):

enter image description here


Tags: 模型imageimport脚本nprandomwidthcv2
1条回答
网友
1楼 · 发布于 2024-04-25 08:24:09

划痕也需要垂直

您的方法可以采用如下方式

import numpy as np  # cv2 read image into np.array
img = np.zeros((5,5),dtype='uint8')  # same as loading 5 x 5 px black rectangle
img[1:4,2:3] = 255
print(img)

输出:

[[  0   0   0   0   0]
 [  0   0 255   0   0]
 [  0   0 255   0   0]
 [  0   0 255   0   0]
 [  0   0   0   0   0]]

说明:我将y坐标在1(包括)和4(排除)之间、x坐标在2(包括)和3(排除)之间的所有元素(像素)都设置为y坐标。 尽管如此cv2提供了绘制线条的功能,即cv2.line,这更方便使用,它确实接受img的工作点、起点、终点、颜色和厚度,文档给出了以下示例:

# Draw a diagonal blue line with thickness of 5 px
img = cv2.line(img,(0,0),(511,511),(255,0,0),5)

如果使用灰度,请使用值而不是三元组作为颜色

相关问题 更多 >