2022乱数を使って円周率もどきを求める2先日試した乱数を使った円周率を求める方法をnumpyを使った方法に置き換えた。2.535640128000068numpy使わずにwhileで計算していたまえの処理に較べて15倍位早い結果。全て配列に収めてから処理するとさすがに早い。縦軸を1ピクセルあたりの画素強度、横軸を座標として、ピクセル間の強度値変化を周波数分布に変換する画像に対するフーリエ変換のピクセルあたりの画素強度の例として、1×7サイズのグレースケール画像を考える。下記のようなもの(ここでは視認性のため、拡大した画像で表示)。画素強度値は明るいほど値が大きい。グレースケールの255階調で考えれば、白い箇所は255、黒い箇所は0の値となる。先ほどの画像にピクセル毎に強度値を重ねて表示すると下記のような値を持つ。上記画像の強度値を、縦軸を1ピクセルあたりの画素強度、横軸を座標として表しなおしたグラフが下記。画像に対するフーリエ変換はこのグラフに対して行っていることになるただし通常画像はもっと大きなサイズであり、1ピクセル高ということはない。そのため、実際には各ピクセル行に対してフーリエ変換を行う。各行へのフーリエ変換の実施後はデータを転置し、転置後のデータに対して再度各行に対してフーリエ変換を実施する。その後再度転置を行いデータの向きを元に戻す作業を行う。これで画像に対する2次元フーリエ変換となる。ここまでの内容をpythonコードにしたものが下記。2018numpyとopenCVを使った画像のフーリエ変換と逆変換openCVを使い画像読み込み、fftで周波数データに変換。その後逆変換で元の画像に戻すテスト。入力に使用する画像は↓。サイズは360×240。画像入力、グレースケールで取り込む。cv2.IMREAD_GRAYSCALE)cv2.imshow("original",image)cv2.waitKey(0)cv2.destroyWindow()実行すると元の画像がグレースケールで表示される。imreadは引数2つ、1つ目は読み込みファイル、2つ目は読み込みオプションで以下3つ(1,0,-1でも指定可)。fimage.shapenp.fft.fft2()は2次元FFT。arrayで返ってくる。360)変換結果をパワースペクトルで確認してみる。確認に使用したコードが下記。逆変換で元の画像に戻すコード。注意として変換後の結果には複素数成分が含まれているので、実部を取り出す処理が必要。グレースケールで表示するために0-255階調への値調整が必要になる。ifft",ifimage)cv2.waitKey(0)cv2.destroyWindow()実行結果が下記グレースケールでもとの画像に戻ってきた。2022pythonのmultiprocessingを使いクーロン力の並列計算をするテスト前回クーロン力計算部分の高速化を検討した。結果としてはシンプルに2重ループを使った計算。今回はこのクーロン力計算部分をmultiprocessingを使ったマルチプロセスによる並列化で高速化を試してみる。作成したコードが下記。結果は2.09[sec]。使用coreは4スレッド仕様なので、4プロセスでの処理を行った。前回の処理時間が約8秒であったのを考えると、理想どおり4分の1になる結果が得られた。