画像ファイルの上にplt.quiverで指定したベクトル図を描きたい

実現したいこと

画像ファイルの上にplt.quiverで指定したベクトル図を描きたいです。

図Aを表示するプログラム、ベクトル図Bを描くプログラムは個別にはできました。Aの上にBを表示するPythonコードの描き方が分かりません。

該当のソースコード

図Aは例としてlena400.pngにします。画像サイズが400×400です。

Python

1import cv2 2 3im = cv2.imread("lena400.png")#画像サイズは400×4004cv2.imshow("image",im)5 6cv2.waitKey()

イメージ説明
図Bは例として電場を可視化するコードとします。こちらのサイトのものを参考にしました。
36行目で画像サイズをlena400.pngと同じにしています。

Pyhon

1import numpy as np 2import matplotlib.pyplot as plt 3 4# フォント設定 5plt.rcParams['font.family'] = 'Noto Sans CJK JP' 6plt.rcParams['font.size'] = 8 7plt.rcParams['xtick.labelsize'] = 8 8plt.rcParams['ytick.labelsize'] = 8 9 10# 1個の点電荷がつくる電場 11def Ex(x, y): 12 return x/np.sqrt(x**2 + y**2)**3 13def Ey(x, y): 14 return y/np.sqrt(x**2 + y**2)**3 15 16# 正負の2個の点電荷がつくる電場 17def E2x(x, y): 18 return Ex(x, y-1) - Ex(x, y+1) 19def E2y(x, y): 20 return Ey(x, y-1) - Ey(x, y+1) 21 22# 正負の2個の点電荷がつくる電場の大きさ 23def E(x, y): 24 return np.sqrt(E2x(x, y)**2 + E2y(x, y)**2) 25 26# 規格化された電場ベクトル 27def hE2x(x, y): 28 return E2x(x, y)/E(x, y) 29def hE2y(x, y): 30 return E2y(x, y)/E(x, y) 31 32x = y = np.linspace(-5.5, 5.5, 12) 33x, y = np.meshgrid(x, y) 34 35# グラフのサイズ 36fig = plt.figure(figsize=(4.00, 4.00))#画像サイズは400×400 37 38# 表示範囲 39plt.xlim(-6.5, 6.5) 40plt.ylim(-6.5, 6.5) 41 42# グリッドの表示 43plt.grid() 44 45# x の主目盛を 1 刻みに 46plt.xticks(np.arange(-5, 6, 1)) 47# y の主目盛を 1 刻みに 48plt.yticks(np.arange(-5, 6, 1)) 49 50# x, y を始点としたベクトル場の表示 51plt.quiver(x, y, hE2x(x, y), hE2y(x, y)) 52plt.savefig('fig1.png')

イメージ説明

試したこと

こちらのサイトにグラフの背景を画像にする方法は書かれていましたが、ベクトル場の表示への適用方法が私にはよく分かりませんでした。

plt.quiverではなくcv2.arrowedLineを使う場合、一本のベクトルの描き方は分かりましたが、この操作をベクトル1本1本に対して行うのは非効率で、もっと効率の良い方法があるのではないかと思いました。

python

1import cv2 2 3img = cv2.imread('lena400.png')4 5cv2.arrowedLine(img,6 pt1=(0, 0),7 pt2=(100, 300),8 color=(0, 255, 0),9 thickness=3,10 line_type=cv2.LINE_4,11 shift=0,12 tipLength=0.1) 13 14cv2.imwrite('./lena400_after.png', img)

イメージ説明

コメントを投稿

0 コメント