词云中的词语无法适应掩模形状

4
我正在尝试从数据框中创建词云,其中有一个单词列和一个相应频率的列。我还下载了一张图片作为蒙版,例如:cloud image 我无法让词云适应蒙版 - 尽管按照示例所示进行操作。以下是我的代码:
from PIL import Image
import pandas as pd
import numpy as np
from wordcloud import WordCloud
import matplotlib.pyplot as plt

df = pd.DataFrame({'word':['time', 'car', 'Peter\'s', 'sky', 
                           'something', 'computer', 'brain', 'plants',
                           'trees', 'Alien\'s', 'gun', 'eat'],
                   'freq':[24, 16, 16, 15,
                           14, 13, 12, 10,
                           9, 9, 5, 3]})

words = ' '.join(df['word'])

cloud_image = r"C:\Users\L\Documents\Python Scripts\cloud.png"

mask = np.array(Image.open(cloud_image))

wordcloud = WordCloud(max_words=2000,
                      width=1280, 
                      height=720,
                      mask=mask)

wordcloud.generate_from_frequencies()

fig, ax = plt.subplots(figsize=(8, 6))
ax.imshow(wordcloud, interpolation='bilinear')
ax.axis("off")
ax.imshow(mask, interpolation='bilinear')
plt.show()
3个回答

3

我知道这个问题有点旧了,但我刚刚花了一个小时尝试使用特定的图像作为遮罩。我面临的主要问题是,我想用作我的词云遮罩的图像没有白色背景(RGB 255,255,255)。我最终采取的解决方案:

  1. 如果您的图片有明显的背景,请使用任何在线工具从您的图像中删除背景颜色。我使用了一个名为“Background Burner”的网站,将我的图像背景变成透明的。然而(正如我发现的那样),Python 的词云会将透明背景视为黑色。
  2. 使用去除背景后的图像,在线工具将背景(通常是透明的)更改为白色。我使用了一个名为 LunaPic 的网站来改变我的图像。

结果是您的原始图像具有白色(RGB 255,255,255)背景。词云的遮罩现在会按照您的期望处理您的图像!


很高兴你找到了解决方案。只是提醒一下,WordCloud()有一个参数background_color,你可以将其设置为'white'以获得无背景的图像(我想是这样 - 已经有一段时间了)。 - fffrost
有没有关于如何创建自定义图像的想法? - Sahar Millis

1
事实证明,这只是图像大小/类型的问题。使用不同的蒙版图像可以解决问题(尽管之前我尝试过两个图像但没有成功,因此才发帖)。

0
一些图像需要进行调整处理。请注意,只有白点值用于图像的 mask_out(其他值用于 mask_in)。问题在于,有些图像不适合进行遮罩处理。原因是颜色的 np.array 有些不匹配。为了解决这个问题,可以采取以下方法: 1. 创建遮罩对象:(请尝试使用自己的图像,因为我无法上传 :))
import numpy as np;
import pandas as pd;
from PIL import Image;
from wordcloud import WordCloud

mask = np.array(Image.open("filepath/picture.png"))
print(mask)

如果白色np.array的输出值为255,则可以接受。但如果是0或其他可能的值,我们必须将其更改为255。
2.对于其他值的情况,更改值的代码如下: 2-1.创建用于转换的函数(这里我们的值= 0)
def transform_zeros(val):
    if val == 0: 
       return 255
    else:
       return val

2-2. 创建相同形状的 np.array:

maskable_image = np.ndarray((mask.shape[0],mask.shape[1]), np.int32)

2-3. 转换:

for i in range(len(mask)):
    maskable_image[i] = list(map(transform_zeros, mask[i]))

3.Checking:

print(maskable_image)

然后你可以使用这个数组作为你的掩码。

mask = maskable_image

所有这些都是从 链接 复制和解释的,所以如果你觉得我尝试的解释不清楚,请检查它,因为我只提供了解决方案,对于图像的颜色数组及其变换并不是很理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接