その漫画自炊オタクはImageJマクロに恋をする

プログラミングを用いた、自炊漫画の画像処理

【Fiji・Jython】スキャナ読み取り直後に数秒間だけ画像表示させるPlugin (New version)

 





「データ確認のためちょこっとだけ画像表示させるマクロ」のプラグイン版です

 

# FileWatcher_Modoki_new.py

from ij import IJ 
from ij import WindowManager
from ij.gui import ImageWindow
import time
import os


version = "1.2.0"


IJ.log("")
IJ.log("FileWatcher Modoki New")
IJ.log("ver" + version)
IJ.log("")




checkImageTime = 1.8

width = 580
height = 870






#------------------------------------------------------------------------------
# Define getFileList
def getFileList(dir):

	list = []
	for filename in os.listdir(dir):
		if os.path.isdir(os.path.join(dir, filename)):
			if not filename.startswith("."):
				filename += "/"
				list.append(filename)
		if os.path.isfile(os.path.join(dir, filename)):
			if not filename.startswith("."):
				list.append(filename)
	list.sort()

	return list
	
#------------------------------------------------------------------------------


#------------------------------------------------------------------------------
# define zeroPad
def zeroPad(number, length):

	return str(number).zfill(length)
	
#------------------------------------------------------------------------------


#------------------------------------------------------------------------------
# Define getElapsedTime
def getElapsedTime(initialTime,currentTime):
	global min
	
	Time = currentTime - initialTime;
	msec = Time % 1
	msec = int(msec * 1000)
	sec = int(Time % 60)
	min = int(Time / 60) % 60
	hour = int(Time / 3600)	
	strElapsedTime = zeroPad(hour,2) + "h : " + zeroPad(min,2) + "m : " + zeroPad(sec,2) + "." + zeroPad(msec,3) + "s"
	return strElapsedTime
	
#------------------------------------------------------------------------------
	
	
#------------------------------------------------------------------------------
# Define closeOthers
def closeOthers(frontImageTitle):

	# getTitle of displayed Images
	displayedImages = WindowManager.getImageTitles()

	# close all images except the foremost one
	for title in displayedImages:
		if title != frontImageTitle:
			WindowManager.getFrame(title).close()
		
#------------------------------------------------------------------------------
			
# zero time
initialTime = time.time()


# select directory
surveillanceDir = IJ.getDirectory("Choose a directory")
initialList = getFileList(surveillanceDir)


# initialize
min = 0


while min < 30:
	
	# currentMemory
	bytes = float(IJ.currentMemory())
	bytes = bytes / 1000000
	
	# count elapsed time
	currentTime = time.time()
	elapsedTime = getElapsedTime(initialTime,currentTime)
	IJ.log("\\Update:ElapsedTime ... " + elapsedTime + "        " + "{:.2f}".format(bytes) + "[MB]")
	
	# get current list
	currentList = getFileList(surveillanceDir)
	
	# obtain new files using set difference
	newFiles = list(set(currentList) - set(initialList))
	newFiles.sort()
	
	
	# if new files are detected...
	for newTitle in newFiles:
		path = surveillanceDir + newTitle
		print path
		
		imp = IJ.openImage(path)
		
		
		# show image
		iw = ImageWindow(imp)
		iw.setLocationAndSize(0,0,580,870)
		imp.show()
		
		# close all images except the foremost one 
		frontImageTitle = newTitle
		closeOthers(frontImageTitle)
		
		# ime to check the image
		time.sleep(checkImageTime)
		
		# reset time 
		initialTime = time.time()
		
		
	# update list
	initialList = currentList

	# wait 
	time.sleep(0.1)


# End of proc
IJ.showMessage("Time out.")
raise RuntimeError("Time out")


 

Pythonの本を読んでいて「set型は順番を考慮しないというデメリットがある一方で、集合に関する演算が高速」的な記述を見たので実装してみました。

 

 

こちらが読んだ本。ImageJマクロのおかげでちょっとプログラミングがわかるけどPythonはよう知らん、という私にはちょうどいい感じの本でした。

 

 

肝心な処理速度ですが、前回の「最終更新時間チェック法」と比べてみたところ、残念ながら前回バージョンの方がちょびっとだけ速いという結果でした。最終更新時間チェック法は単ループで回してるので、それが効いてるみたいです。

それでも「set型 差集合法」もしっかり速いので、ひとまずはこれでじゅうぶんかなって感じです。

 

 

最終更新時間チェック法

 

 

 

 

 

 

おしまい

 

 

 

 

 

 

 

 

ライセンスなんかは一切無いので、ぜひぜひ自由に使ってみてください!

 

imagej-jisui.hatenablog.com