Pythonでのデジタル画像のトリミング
-
03-07-2019 - |
質問
物理学者の教授からこの質問をもらいました。
私はPythonプログラミングの初心者です。私はコンピューターの専門家ではなく、物理学者です。私は自分の研究のためにPythonでコードを記述しようとしていました。これには少しの画像処理が含まれます。
必要なのは、画像を表示し、マウスを使用して関心のある領域を選択し、最後に選択した領域を切り抜くだけです。 Matlabでginput()関数を使用してこれを行うことができます。
PILを使用してみました。しかし、コマンドImage.show()を発行した後、イメージは表示されますが、イメージウィンドウを終了しない限り、プログラムはそこで停止します。私が計画していたことを実装する方法はありますか。他のモジュールをダウンロードする必要がありますか?お知らせ下さい。
解決
あなたはおそらくGIMPまたは他の画像操作プログラムを使用するだけでよいとDavidに同意しますが、ここに pygame は、あなたが望むことをします。 PILと同様にpygameもインストールする必要があります。使用方法は次のとおりです。
scriptname.py <input_path> <output_path>
実際のスクリプト:
import pygame, sys
from PIL import Image
pygame.init()
def displayImage( screen, px, topleft):
screen.blit(px, px.get_rect())
if topleft:
pygame.draw.rect( screen, (128,128,128), pygame.Rect(topleft[0], topleft[1], pygame.mouse.get_pos()[0] - topleft[0], pygame.mouse.get_pos()[1] - topleft[1]))
pygame.display.flip()
def setup(path):
px = pygame.image.load(path)
screen = pygame.display.set_mode( px.get_rect()[2:] )
screen.blit(px, px.get_rect())
pygame.display.flip()
return screen, px
def mainLoop(screen, px):
topleft = None
bottomright = None
runProgram = True
while runProgram:
for event in pygame.event.get():
if event.type == pygame.QUIT:
runProgram = False
elif event.type == pygame.MOUSEBUTTONUP:
if not topleft:
topleft = event.pos
else:
bottomright = event.pos
runProgram = False
displayImage(screen, px, topleft)
return ( topleft + bottomright )
if __name__ == "__main__":
screen, px = setup(sys.argv[1])
left, upper, right, lower = mainLoop(screen, px)
im = Image.open(sys.argv[1])
im = im.crop(( left, upper, right, lower))
im.save(sys.argv[2])
これが役立つことを願って:)
他のヒント
(他の物理学者からの)価値のあることのために、 GIMP 。 Python(または任意の言語)でこのタスクを実行する主な利点は、プロセスを自動化することで時間を節約することですが、あなたが-そうですね、教授-何らかの方法で画像のどの部分を切り取るかを自動的に把握するアルゴリズムを開発できない限り、自動化によって節約される時間はあまりないようです。
正しく覚えていれば、GIMPは実際にはスクリプト可能です。おそらくPythonを使用しているので、教授の友人が望んでいることを行うために時間を節約するGIMPスクリプトを書くことができるかもしれません。
Image.show()は、現在のプラットフォームで見つけることができるシンプルな画像ビューアーを呼び出します。クロップアンドセーブ機能がある場合とない場合があります。
Windowsのボックスを使用していて、マシン上で動作させる必要がある場合は、&#8216; Open with ...&#8217;を設定します画像を実行するように関連付けを行うと、選択したエディターに画像が読み込まれます。 OS Xおよび* nixでは、Image.pyの下部にある_showxv()メソッドをハックして、画像を開くために使用するコマンドを変更します。
実際にポータブルなソリューションを提供する必要がある場合は、UIフレームワークを使用してトリミングアプリケーションを強化する必要があります。選択肢は Tkinter に要約されます(ImageTk.pyは表示用のラッパーを提供しますTkのPIL画像)、 PyQT4 (PIL 1.1.6のImageQtは、 QT4で画像を表示するためのラッパー)または wxPython (wxWidgetsを使用した高レベルのアプリケーションオーサリングツールキット)。完全なUIキットのコツをつかむのはかなり手間がかかりますが、アプリケーションのインターフェースの動作を完全にカスタマイズすることができます。
画像を自動トリミングするライブラリのようなpythonのスクリプトがあります: 画像の自動トリミング
探しているのは、matplotlibというモジュールで、Matlabをエミュレートします。 ginput()関数を参照してください。これにより、境界ボックスを見つけることができ、PILからトリミングを使用できます。