Pythonを使用してイメージ内のほぼ水平な赤色レーザーラインを検出する最も信頼性の高い方法は何ですか?私は3dレーザースキャンに関連する小さなプロジェクトに取り組んでいます。歪みからの距離を計算するために、イメージ内のレーザーを検出できる必要があります。Pythonを使用してイメージ内のレーザーラインを検出する方法
私は、レーザーラインを含まないことが知られている基準画像Aとレーザーラインを含んでいる画像Bを2つの画像、ひずんでいる可能性があります。例えば
サンプル画像A:
サンプル画像B:
これらはRGBであるが、レーザが赤色であるので、私は青をストリッピングすることにより、いくつかのノイズを除去しますこの機能を使用する緑色チャンネル:
from PIL import Image
import numpy as np
def only_red(im):
"""
Strips out everything except red.
"""
data = np.array(im)
red, green, blue, alpha = data.T
im2 = Image.fromarray(red.T)
return im2
私にこれらの画像を取得し
:
次は、私が試してみて、PIL.ImageChops.difference()
を使用して、これら2枚の画像の差をとることにより、より多くのノイズを除去します。理想的には、2つの画像間の露出は同一であり、その違いにはレーザーライン以外は何も含まれない。残念なことに、レーザーが光を加えるので、各画像の露出と全体的な明るさが大きく異なり、結果としてかなりのノイズが残っています。例えば
私の最後のステップは、ラインがどこにあるのと、「最良の推測」を作ることです。私は線がおおよそ水平になり、レーザー線が画像の中で最も明るいものでなければならないことを知っているので、私は各列を走査し、最も明るい画素を持つ行を見つけます。このためのコードは次のとおりです。
import os
from PIL import Image, ImageOps
import numpy as np
x = Image.open('laser-diff.png', 'r')
x = x.convert('L')
out = Image.new("L", x.size, "black")
pix = out.load()
y = np.asarray(x.getdata(), dtype=np.float64).reshape((x.size[1], x.size[0]))
print y.shape
for col_i in xrange(y.shape[1]):
col_max = max([(y[row_i][col_i], row_i) for row_i in xrange(y.shape[0])])
col_max_brightness, col_max_row = col_max
print col_i, col_max
pix[col_i, col_max_row] = 255
out.save('laser-line.png')
私は本当に私の距離計算を実行するために必要なのはcol_max
値の配列ですが、laser-line.png
は私が成功を視覚化するのに役立ちますし、次のようになります。
ご覧のとおり、見積もりはかなり近いですが、まだノイズの部分があります。ほとんどの場合、レーザーラインがマットブラック仕上げで吸収される画像の左側にあります。
私の精度やスピードを向上させるにはどうすればよいですか?私はこれをRaspberry PiのようなARMプラットフォーム上で実行しようとしています。そのため、コードを実行するにはあまりにも効率が悪いかもしれないと心配しています。
私はNumpyの行列関数を十分に理解していないので、より効率的ではなく、各列をスキャンするための遅いforループを解決する必要がありました。 Numpyの列ごとに最も明るいピクセルを持つ行を見つけるための高速な方法はありますか?
また、レーザーラインを調光せずに差異を実行する前に、画像を均一化する信頼できる方法がありますか?
最後に、y座標が25%〜75%分位にないすべての点を削除することができます。次に、より良い結果を得て、locf..etc –
@ B.Mr.W。を使用して不足している値を記入してください。あなたは部分的に正しいです。レーザーがカメラの下に取り付けられ、焦点面に平行であるため、すべてのレーザーポイントは中央の行より下にある必要があります。つまり、上のすべてのポイントはノイズです。ありがとう。 – Cerin