フリーハンドで描いた曲線の画像ファイルを読み込み、最小二乗法を用いて平滑化するプログラムコードをPython言語で書いてください
以下は、Pythonでフリーハンドで描いた曲線の画像ファイルを読み込み、最小二乗法を用いて平滑化するプログラムコードです。このコードは、NumPyおよびmatplotlibライブラリを使用しています。
import numpy as np
import matplotlib.pyplot as plt
# 画像ファイルの読み込み
img = plt.imread('曲線の画像ファイル名.png') #ここではC:/Users/User/Desktop/test.pngとした。
# 画像をグレースケールに変換
gray = np.mean(img, axis=2)
# フリーハンドで描いた曲線の座標を取得
points = np.array(np.nonzero(gray)).T
# 最小二乗法による平滑化
order = 3
x = points[:, 0]
y = points[:, 1]
coeffs = np.polyfit(x, y, order)
poly = np.poly1d(coeffs)
new_y = poly(x)
# 平滑化した曲線をプロット
plt.plot(x, new_y, 'r-')
plt.show()
このコードでは、以下の処理を行います。
1.画像ファイルを読み込み、グレースケールに変換します。
2.フリーハンドで描いた曲線の座標を取得します。
3.最小二乗法により、曲線を平滑化します。ここでは、3次の多項式を使用しています。
4.平滑化した曲線をプロットします。
注意点としては、フリーハンドで描いた曲線が閉じていない場合、プログラムの出力結果が正しくない可能性があることです。また、平滑化により曲線の形状が変化するため、必要に応じてパラメーターの調整が必要になる場合があります。
の画像が下のようになった。
※order = の所を3から100とかに変えたら元の曲線により近付くようだ。
ただし1000000とかデカ過ぎるとパソコンがフリーズするので注意。
P.S.
なぜこんなことを思い付いたのかというと、化学の実験結果をグラフにまとめてレポートとして提出する時に最小二乗法という理論を使わなければならなかったことを電車に乗っている際に思い出したからだ。
化学の実験結果は直線を描くものであった。いかにも任意の点群の間を計算したかのようにサッと定規で適当にひいて誤魔化していた。
直線じゃなくてフリーハンドで描いた曲線に応用できないか?
応用したら汚いフリーハンドの曲線が滑らかになるのではないか?
と考えて、Pythonでのプログラミングを考えたのだ。
そして実行に移したら見事に成功した。
読み込むファイル名の所もパスを入れなければならないのでは?と思って自分で付け加えた。
次はウィジェット化してみたい。
このプログラムはフリーハンドでイラストを描く際やCADのフリーハンドによるモデリングにも応用できると思われる。
複雑な曲線を滑らかで自然にCADで描くのは結構骨が折れるものだ。
それを楽にしたいと思った。
P.S.2
Adobeillustratorなどで曲線を描く際に、複数の折点が生じてカクカク気味になる場合もあるだろう。
自分の望んだ通りの形状にするのはなかなか面倒なはずである。
そこで最小二乗法を使えば、より滑らかで自然な曲線になるはずだ。
P.S.3
元の画像(修正前)
修正後