画像でマスク処理をしたWordcloud作成

# はじめに

本記事では、画像でマスク処理をするワードクラウドの作成方法を紹介します。

Pythonライブラリの[word_cloud](https://github.com/amueller/word_cloud)のGitHubページでやっていたので前から気になってたけどやったことなかったのでやった。上手く使えば、イケてるInfographicsに使えるかも。


**今回実施したこと**

- WordCloud作成
- WordCloud作成+画像でマスク処理
- WordCloud作成+画像でマスク処理+元画像の色を保持

# インストール

Pythonライブラリ[word_cloud](https://github.com/amueller/word_cloud)を使います。
インストールは以下のコマンドです。

```bash:コマンド
$ pip install wordcloud
or 
$ conda install -c conda-forge wordcloud
```

# コード

- 言語: Python
- 使用ライブラリ: word_cloudなど
- GitHubリポジトリ: [Jupyter Notebookリンク](https://github.com/haradai1262/keyakizaka46-mining/blob/master/script/tweet_mining/get_wordcloud_blacksheep.ipynb)

以下では、関数部分のみ表示します。(全体を確認したい場合は[Jupyter Notebookリンク](https://github.com/haradai1262/keyakizaka46-mining/blob/master/script/tweet_mining/get_wordcloud_blacksheep.ipynb)を見て下さい)

## WordCloud作成

```python:pythonスクリプト
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
import numpy as np
from PIL import Image
fpath = "C:\Windows\Fonts\meiryob.ttc" # fontは任意で

def get_wordcrowd( text ):
    wordcloud = WordCloud(background_color="black",
                          width=800,
                          height=600,
                          font_path=fpath,
                          collocations=False, # 単語の重複しないように
                         ).generate( text )

    # show
    plt.figure(figsize=(6,6), dpi=200)
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()

get_wordcrowd(text)
```

|ワードクラウド|
|---|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/264359/8582c45c-68e2-cce6-936b-cf5050dde1cb.png)|


## WordCloud作成+画像でマスク処理

```python:pythonスクリプト
def get_wordcrowd_mask( text, imgpath ):
    img_color = np.array(Image.open( imgpath ))
    wc = WordCloud(width=800,
                   height=600,
                   font_path=fpath,
                   mask=img_color,
                   collocations=False, # 単語の重複しないように
                  ).generate( text )

    # show
    plt.figure(figsize=(6,6), dpi=200)
    plt.imshow(wc, interpolation="bilinear")
    plt.axis("off")
    plt.show()

get_wordcrowd_mask(text, './mask_images/Keyakizaka46_logo_2.png')
```

|マスク画像|ワードクラウド|
|---|---|
|![](https://qiita-image-store.s3.amazonaws.com/0/264359/b69ecb69-d4ca-3dd3-9166-059d4226dc98.png)|![](https://qiita-image-store.s3.amazonaws.com/0/264359/84288d91-f610-aa50-5ef2-5d9637ad4b4b.png)|

## WordCloud作成+画像でマスク処理+元画像の色を保持
```python:pythonスクリプト
def get_wordcrowd_color_mask( text, imgpath ):
    img_color = np.array(Image.open( imgpath ))
    wc = WordCloud(width=800,
                   height=600,
                   font_path=fpath,
                   mask=img_color,
                   collocations=False, # 単語の重複しないように
                  ).generate( text )

    image_colors = ImageColorGenerator(img_color)
   
    # show
    plt.figure(figsize=(6,6), dpi=200)
    plt.imshow(wc.recolor(color_func=image_colors), # 元画像の色を使う
               interpolation="bilinear")
    plt.axis("off")
    plt.show()

get_wordcrowd_color_mask(text, './mask_images/Keyakizaka46_logo_2.png')
```

|マスク画像|ワードクラウド|
|---|---|
|![](https://qiita-image-store.s3.amazonaws.com/0/264359/b69ecb69-d4ca-3dd3-9166-059d4226dc98.png)|![](https://qiita-image-store.s3.amazonaws.com/0/264359/086e903f-d43a-ed90-1db9-3a0f58904c79.png)|

# 利用例


|マスク画像|ワードクラウド|
|---|---|
|![](https://qiita-image-store.s3.amazonaws.com/0/264359/3e960934-82d5-b12a-49b5-149b873d31a3.png)|![](https://qiita-image-store.s3.amazonaws.com/0/264359/2469772f-0f2a-2a92-50db-6143639e5d32.png)|

|マスク画像|ワードクラウド|
|---|---|
|![](https://qiita-image-store.s3.amazonaws.com/0/264359/6962b2ae-cbaa-d214-54d9-dc46ecbebbd1.png)|![](https://qiita-image-store.s3.amazonaws.com/0/264359/4f2619d0-0fea-e15f-306d-ecfdfa5907cf.png)|

# 参考

- https://github.com/amueller/word_cloud
- https://python-graph-gallery.com/wordcloud/