summaryrefslogtreecommitdiff
path: root/test/lua/multimorpho.lua
diff options
context:
space:
mode:
Diffstat (limited to 'test/lua/multimorpho.lua')
-rw-r--r--test/lua/multimorpho.lua103
1 files changed, 103 insertions, 0 deletions
diff --git a/test/lua/multimorpho.lua b/test/lua/multimorpho.lua
new file mode 100644
index 0000000..be612c6
--- /dev/null
+++ b/test/lua/multimorpho.lua
@@ -0,0 +1,103 @@
+-- multi-step morphological opening on a binarized image, with increasing structuring element (Se) size:
+-- step 1 - 3x3 Se
+-- step 2 - 5x5 Se
+-- step 3 - 7x7 Se
+-- Step n - (2n+1)x (2n+1) Se
+-- after each step, a count of the objects (white items) in the opened image has to be performed,
+-- and the number of counted items to be saved in a .txt file for easy and fast exporting to excel
+
+require"imlua"
+require"imlua_process"
+
+err_msg = {
+ "No error.",
+ "Error while opening the file.",
+ "Error while accessing the file.",
+ "Invalid or unrecognized file format.",
+ "Invalid or unsupported data.",
+ "Invalid or unsupported compression.",
+ "Insuficient memory",
+ "Interrupted by the counter",
+}
+
+colorspace_str = {
+ "RGB",
+ "MAP",
+ "GRAY",
+ "BINARY",
+ "CMYK",
+ "YCBCR",
+ "LAB",
+ "LUV",
+ "XYZ"
+}
+
+num_step = arg[1]
+file_name1 = arg[2]
+if (not num_step or not file_name1) then
+ print("Must have the number of steps and a file name as parameters.")
+ print(" Can have more than one file name as parameters and can use wildcards.")
+ print(" Usage:")
+ print(" lua multimorpho.lua num_step filename1 filename2 ...")
+ return
+end
+
+print(">>> Multi-step Morphological Opening <<<")
+print("Number of Steps: "..num_step)
+print("")
+
+function ProcessImageFile(file_name, num_step)
+ print("Loading File: "..file_name)
+ image, err = im.FileImageLoad(file_name);
+
+ if (err and err ~= im.ERR_NONE) then
+ error(err_msg[err+1])
+ end
+
+ if (image:ColorSpace() ~= im.BINARY) then
+ error("Invalid Image Color Space. Must be a Binary image [Color Space="..colorspace_str[image:ColorSpace()+1].."].")
+ end
+
+ file_name = file_name..".csv"
+ print("Saving Log File: "..file_name)
+ log = io.open(file_name, "w")
+
+ morph_image = image:Clone()
+ obj_image = im.ImageCreateBased(image, nil, nil, im.GRAY, im.USHORT)
+
+ for step = 1, num_step do
+ kernel_size = 2*step+1
+ print(" Binary Morphology Open [Kernel Size="..kernel_size.."x"..kernel_size.."].")
+ im.ProcessBinMorphOpen(image, morph_image, kernel_size, 1) -- 1 interaction
+
+ num_obj = im.AnalyzeFindRegions(morph_image, obj_image, 4, false) -- 4 connected, ignore objects that touch the border
+ print(" Objects Found: "..num_obj)
+ log:write(kernel_size..";"..num_obj.."\n")
+
+ if (num_obj == 0) then
+ step = num_step
+ end
+
+ obj_image:Clear()
+ morph_image:Clear()
+ end
+
+ log:close()
+ obj_image:Destroy()
+ morph_image:Destroy()
+ image:Destroy()
+ print("Done File.")
+ print("")
+end
+
+file_count = 0
+for index,value in ipairs(arg) do
+ if (index > 1) then
+ ProcessImageFile(arg[index], num_step)
+ file_count = file_count + 1
+ end
+end
+
+if (file_count > 1) then
+ print("Processed "..file_count.." Files.")
+end