【量子画像処理】回転ブラーの実装

# はじめに
こんにちは、ユーゴです。今回は、量子画像処理シリーズ(？)です。前回の「[【量子画像処理】実機の精度を上げたくて](https://qiita.com/mu5dvlp/items/3dd0701de1373ef06cd2)」もあわせてご覧ください。

# 目的
量子コンピュータで画像にブラーをかけたい。
「[【量子画像処理】実機の精度を上げたくて](https://qiita.com/mu5dvlp/items/3dd0701de1373ef06cd2)」で量子ビットにエンコードした画像の操作によって実現したい。

# 実装
今回は、こちらの論文を参考にしました。
[Procedural generation using quantum computation](https://www.semanticscholar.org/paper/Procedural-generation-using-quantum-computation-Wootton/7b243529843935ed957d3ccc83494df93c5bf6ec)

ちなみに、「[量子コンピュータで画像処理してみた](https://qiita.com/mu5dvlp/items/9b8b40a078a967f30776)」で参考にした、「[Investigating the usefuless of Quantum Blur](https://www.semanticscholar.org/paper/Investigating-the-usefulness-of-Quantum-Blur-Wootton-Pfaffhauser/96ed7e3ec4832e56fca53062a3b2f128c8414603)」にも良い感じの方法が載っていました。しかし、私の読解力と実装力が不足していたため、こちらの方法は実装できませんでした。

## 概要
以下の手順で実装できます。

1. 画像を量子ビットにエンコード
2. 回転ゲート(Rx/Ry)を適用
3. 量子ビットを画像にデコード

![rotate_blur_circuit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/ea1bf03c-e126-3001-f5dd-c478fa9e1b4f.png)


## コード
エンコード/デコードの基本的な実装はこちらのリポジトリにあります。
[QuantumImageProcess](https://github.com/mu5dvlp/QuantumImageProcess)

simulator.pyに、以下のようなコードがあります。

```python:simulator.py
# 量子回路を作成
state_init = convert_probability2statevector(probabilities,address)
qc = create_QuantumCircuit_by_Statevector(state_init)
qc.measure(range(n_qubits),range(n_qubits))
```

これを以下のように書き換えます。

```python:simulator.py
# 量子回路を作成
state_init = convert_probability2statevector(probabilities,address)
qc = create_QuantumCircuit_by_Statevector(state_init)

# 全ての量子ビットに、Rxゲートを適用
theta=np.pi*0.1
for i in range(n_qubits):
    qc.rx(theta,i)

qc.measure(range(n_qubits),range(n_qubits))
```

thetaはブラーの強さです。$2\pi$で1周するので、thetaは$0\le\theta<2\pi$の範囲となります。
また、今回はRxゲートを使用していますが、Ryでも似たような効果を得ることができます。

**注意点**
- measureする前に回転ゲートを適用してください
- 各量子ビットについて、Rxなら$|+\rangle, |-\rangle$、Ryなら$|i\rangle,|-i\rangle$の状態で、回転が作用しません

書き換えたら、simulator.pyのコードを全て実行しましょう。
今回は、$\theta=0〜\pi$を試します。

## 結果
元画像

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/d0ea2391-3005-166a-92fb-d0a978cc738a.jpeg" width="150>

　
<hr>

$\theta=0$

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/9f61c3b4-d9b2-3212-c4fb-a19c135ac966.png" width="150">

(ノイズは量子ビットのエラーなので、ブラー効果は得ていません。)

<hr>

$\theta=0.1\pi$

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/9742fe30-2338-d668-7425-640c997a8b50.png" width="150">

<hr>

$\theta=0.25\pi$

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/5d10d1c2-310a-b0d1-2576-f8878fe0be5b.png" width="150">

<hr>

$\theta=0.5\pi$

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/adaa44d5-7f43-b8b7-c862-5eea5b15dc1d.png" width="150">


<hr>

$\theta=0.75\pi$

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/4c2fc436-cd5e-f7f4-056c-c932b67c16a5.png" width="150">


<hr>

$\theta=\pi$

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/ef96e7b2-bb93-7665-b3af-9baf861a9455.png" width="150>

　
# 評価
個人的には、$0<\theta\le0.25\pi$あたりが良かったと思います。
<div>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/9742fe30-2338-d668-7425-640c997a8b50.png" width="150">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/5d10d1c2-310a-b0d1-2576-f8878fe0be5b.png" width="150">
</div>

それ以外は、過剰な量子状態の回転操作により、本来の画像からかけ離れています。
<div>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/adaa44d5-7f43-b8b7-c862-5eea5b15dc1d.png" width="150">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/4c2fc436-cd5e-f7f4-056c-c932b67c16a5.png" width="150">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/ef96e7b2-bb93-7665-b3af-9baf861a9455.png" width="150>
</div>

　
# まとめ
今回は、回転ゲートを用いた量子画像のブラー処理を紹介しました。また、ブラーのパラメータは$\theta$が$0.1\pi〜0.25\pi$付近で良い結果が得られると分かりました。

# おわりに
いかがだったでしょうか。今回は、個人的に流行って欲しいと思っている量子画像処理で、ブラーの実装方法を紹介しました。
やはり私のモチベーションとしては、エンタメ領域への活用です。技術的には表現できるのに、ハードウェアの物理的制約で表現できない、といった勿体ないことを減らしていきたいです。(パーティクルや流体など)

このように、量子コンピューティングから、Unity, GAS, AWSなど、幅広いトピックを扱っています。
お役に立てましたら、いいね, フォロー等よろしくお願いします！