首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用PIL Python创建像素噪波

使用PIL Python创建像素噪波
EN

Stack Overflow用户
提问于 2020-01-31 01:14:22
回答 4查看 4.8K关注 0票数 6

我正在尝试生成带有噪声和文本的图像的训练数据,类似于下图:

我已经知道如何生成具有合适大小的文本的图像,但不知道如何生成噪声。起初,我认为高斯噪声是正确的方法,但这似乎不是正确的噪声类型。

代码语言:javascript
运行
复制
from PIL import Image, ImageDraw, ImageFont
import numpy


img = Image.new('RGB', (250, 50), color = 'white')
fnt = ImageFont.truetype('/Library/Fonts/Arial.ttf', 36)
d = ImageDraw.Draw(img)
d.text((62,5), "3H1339", font=fnt, fill=(0,0,0))
img.save('imagetext.png')
EN

回答 4

Stack Overflow用户

发布于 2020-01-31 01:29:19

我认为你在寻找一种尖酸刻薄的噪音。每个像素都有被破坏的概率(数量)。每个有噪声的像素都有相同的概率是咸味颗粒(白色)或胡椒颗粒(黑色)。给定一个PIL图像:

代码语言:javascript
运行
复制
def add_salt_and_pepper(image, amount):

    output = np.copy(np.array(image))

    # add salt
    nb_salt = np.ceil(amount * output.size * 0.5)
    coords = [np.random.randint(0, i - 1, int(nb_salt)) for i in output.shape]
    output[coords] = 1

    # add pepper
    nb_pepper = np.ceil(amount* output.size * 0.5)
    coords = [np.random.randint(0, i - 1, int(nb_pepper)) for i in output.shape]
    output[coords] = 0

    return Image.fromarray(output)

可以很容易地修改为具有随机颜色的颗粒。

票数 3
EN

Stack Overflow用户

发布于 2020-01-31 04:43:20

用Python做这件事可能需要一段时间,但如果我向您展示一个方法,您可以自己应用这些概念。我将使用ImageMagick,它安装在大多数Linux发行版上,可以在macOS和Windows上使用。你只需在终端中运行它。

因此,要制作一个坚实的背景,只需选择3个随机的RGB值0..255并制作一个大小如下的图像:

代码语言:javascript
运行
复制
convert -size 250x50 xc:"rgb($((RANDOM%255)),$((RANDOM%255)),$((RANDOM%255)))" background.png

要为要通过其显示的背景部分制作蒙版,请执行以下操作:

代码语言:javascript
运行
复制
convert -seed $RANDOM -size 50x10 xc: +noise random -colorspace gray -resize 250x50\! -blur 0x3  -edge 10  mask.png

要遮罩图像并在其上绘制文本:

代码语言:javascript
运行
复制
convert background.png mask.png -compose copyalpha -composite -gravity center -pointsize 48 -annotate 0 '9437TF' result.png

现在,如果你把所有这些放在一个循环中,并生成32张带有随机蒙版的随机彩色图像,你可以通过管道将结果输入到ImageMagickmontage命令中,并将它们布置在一个4图像宽的网格上:

代码语言:javascript
运行
复制
#!/bin/bash

for x in {0..31} ; do
        convert -size 250x50 xc:"rgb($((RANDOM%255)),$((RANDOM%255)),$((RANDOM%255)))" background.png
        convert -seed $RANDOM -size 50x10 xc: +noise random -colorspace gray -resize 250x50\! -blur 0x3  -edge 10  mask.png
        convert background.png mask.png -compose copyalpha -composite -gravity center -pointsize 48 -annotate 0 '9437TF'  miff:-
done | magick montage -tile 4x -geometry +10+10 miff:-  result.png

或者你可以在白色背景上画一个随机数(比如接近80 )的随机半径和随机颜色的圆圈,然后随机模糊它们。它可能看起来像这样:

代码语言:javascript
运行
复制
#!/bin/bash

MINCIRCLES=20
MINRADIUS=3
for x in {0..31} ; do
    convert -size 250x50 xc:white background.png
    ((R=RANDOM%255))
    ((G=RANDOM%255))
    ((B=RANDOM%255))
    NCIRCLES=$((MINCIRCLES+(RANDOM%40)))
    for c in $(seq $MINCIRCLES $NCIRCLES) ; do
        RADIUS=$((MINRADIUS+(RANDOM%8)))
        ((X=$RANDOM%250))
        ((Y=$RANDOM%50))
        ((P=X+RADIUS))
        mogrify -fill "rgb($R,$G,$B)" -draw "circle $X,$Y $P,$Y" background.png
    done
    convert background.png -blur x2 -gravity center -pointsize 48 -annotate 0 '9437TF'  miff:-
done  | magick montage -tile 4x -geometry +10+10 miff:-  result.png

票数 2
EN

Stack Overflow用户

发布于 2020-02-04 01:46:30

这是我用我的ImageMagick答案做的事情的Python PIL/Pillow版本。我创建了一个白色的画布,并生成一个随机的RGB颜色,我将以此为基础绘制所有的圆,但为了增加乐趣,我使用了一个微小的变化。然后我在随机的地方画一个随机大小的圆圈,模糊它们并添加文本。

代码语言:javascript
运行
复制
#!/usr/bin/env python3

from PIL import Image, ImageDraw, ImageFont, ImageFilter
import numpy
from random import randint, seed

# Create white canvas and get drawing context
w, h = 250, 50
img  = Image.new('RGB', (w, h), color = 'white')
draw = ImageDraw.Draw(img)

# Let's have repeatable, deterministic randomness
seed(37)

# Generate a basic random colour, random RGB values 10-245
R, G, B = randint(10,245), randint(10,245), randint(10,245),

# Draw a random number of circles between 40-120
cmin = randint(50, 70)
cmax = randint(90,120)
for _ in range(cmin,cmax):
   # Choose RGB values for this circle, somewhat close (+/-10) to basic RGB
   r = R + randint(-10,10)
   g = G + randint(-10,10)
   b = B + randint(-10,10)
   diam = randint(5,11)
   x, y = randint(0,w), randint(0,h)
   draw.ellipse([x,y,x+diam,y+diam], fill=(r,g,b))

# Blur the background a bit
res = img.filter(ImageFilter.BoxBlur(3))

# Load font and draw text
draw = ImageDraw.Draw(res)
fnt = ImageFont.truetype('/Library/Fonts/Arial.ttf', 36)
draw.text((62,5), "3H1339", font=fnt, fill=(0,0,0))

# Save result
res.save('result.png')

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59991178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档