はじめに
こんにちは、ユーゴです。今回は、量子画像処理シリーズ(?)です。前回の「【量子画像処理】実機の精度を上げたくて」もあわせてご覧ください。
目的
量子コンピュータで画像にブラーをかけたい。
「【量子画像処理】実機の精度を上げたくて」で量子ビットにエンコードした画像の操作によって実現したい。
実装
今回は、こちらの論文を参考にしました。
Procedural generation using quantum computation
ちなみに、「量子コンピュータで画像処理してみた」で参考にした、「Investigating the usefuless of Quantum Blur」にも良い感じの方法が載っていました。しかし、私の読解力と実装力が不足していたため、こちらの方法は実装できませんでした。
概要
以下の手順で実装できます。
- 画像を量子ビットにエンコード
- 回転ゲート(Rx/Ry)を適用
- 量子ビットを画像にデコード
コード
エンコード/デコードの基本的な実装はこちらのリポジトリにあります。
QuantumImageProcess
simulator.pyに、以下のようなコードがあります。
# 量子回路を作成
state_init = convert_probability2statevector(probabilities,address)
qc = create_QuantumCircuit_by_Statevector(state_init)
qc.measure(range(n_qubits),range(n_qubits))
これを以下のように書き換えます。
# 量子回路を作成
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$を試します。
結果
元画像
$\theta=0$
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2607452%2F9f61c3b4-d9b2-3212-c4fb-a19c135ac966.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=83cde7370144a89032e357463ce2276b)
(ノイズは量子ビットのエラーなので、ブラー効果は得ていません。)
$\theta=0.1\pi$
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2607452%2F9742fe30-2338-d668-7425-640c997a8b50.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=8301ffb4ef2b43fb2d1a041df01d80bf)
$\theta=0.25\pi$
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2607452%2F5d10d1c2-310a-b0d1-2576-f8878fe0be5b.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ca8a0219c1941e40d746cfe293cdb83f)
$\theta=0.5\pi$
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2607452%2Fadaa44d5-7f43-b8b7-c862-5eea5b15dc1d.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ec942f8d692be28fe98eed05029e82c5)
$\theta=0.75\pi$
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2607452%2F4c2fc436-cd5e-f7f4-056c-c932b67c16a5.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=35c4b78a102cb6dce7c66209e2a956ff)
$\theta=\pi$
評価
個人的には、$0<\theta\le0.25\pi$あたりが良かったと思います。
それ以外は、過剰な量子状態の回転操作により、本来の画像からかけ離れています。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2607452%2Fadaa44d5-7f43-b8b7-c862-5eea5b15dc1d.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ec942f8d692be28fe98eed05029e82c5)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2607452%2F4c2fc436-cd5e-f7f4-056c-c932b67c16a5.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=35c4b78a102cb6dce7c66209e2a956ff)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2607452%2Fef96e7b2-bb93-7665-b3af-9baf861a9455.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=da900f97f7edabb421e60bf2e15fa06d)
まとめ
今回は、回転ゲートを用いた量子画像のブラー処理を紹介しました。また、ブラーのパラメータは$\theta$が$0.1\pi〜0.25\pi$付近で良い結果が得られると分かりました。
おわりに
いかがだったでしょうか。今回は、個人的に流行って欲しいと思っている量子画像処理で、ブラーの実装方法を紹介しました。
やはり私のモチベーションとしては、エンタメ領域への活用です。技術的には表現できるのに、ハードウェアの物理的制約で表現できない、といった勿体ないことを減らしていきたいです。(パーティクルや流体など)
このように、量子コンピューティングから、Unity, GAS, AWSなど、幅広いトピックを扱っています。
お役に立てましたら、いいね, フォロー等よろしくお願いします!