# ImageJ Processing prep data for Deep Learning

To run the ImageJ workflow, you need either one of the following:

* ImageJ with the appropriate plugins (here I used SIFT as example, but you can use other methods)

* Fiji (it is ImageJ with a plethora amount of plugins for image reproducible research/analysis)

ImageJ is an image processing freeware made with "reproducible analysis/results" as the most important feature, that runs on every common OS (Windows, Linux, Mac OS), and is open source.

**Note: ImageJ can integrate into Python.**

# Macro processing

In order to process images, you will need to create a Macro, but it is preferrable to create a macro file (you don't need to give any extension to the file name).
Here, we will name it "Macro SIFT" as an example. Don't use SIFT but another method if you want to compete in this competition. This Macro allows to

* Automatically align the image set 4 from my train folder "C:\\Users\\Laurae\\Documents\\Data Science\\Draper\\train_sm" assuming they are .JPEG (sorry, I do not even have enough space on my computer to store the TIFF files) using a registration method (here we use SIFT, but it is only for example),

* Resize the final output to 256x192,

* Save to the folder "C:\\Users\\Laurae\\Documents\\Data Science\\Draper\\train parsed" with .JPEG inputs.

```{r, eval=FALSE}
function processFile(id, folderIn, folderOut) {
	open(folderIn + "\\set" + id + "_1.jpeg");
	open(folderIn + "\\set" + id + "_2.jpeg");
	open(folderIn + "\\set" + id + "_3.jpeg");
	open(folderIn + "\\set" + id + "_4.jpeg");
	open(folderIn + "\\set" + id + "_5.jpeg");
	run("Images to Stack", "method=[Scale (smallest)] name=Stack title=[] use");
	run("Linear Stack Alignment with SIFT", "initial_gaussian_blur=1.60 steps_per_scale_octave=3 minimum_image_size=64 maximum_image_size=1024 feature_descriptor_size=4 feature_descriptor_orientation_bins=8 closest/next_closest_ratio=0.92 maximal_alignment_error=25 inlier_ratio=0.05 expected_transformation=Affine interpolate");
	run("Scale...", "x=- y=- z=1.0 width=256 height=192 depth=5 interpolation=Bilinear average process create");
	run("Image Sequence... ", "format=JPEG name=set" + id + "_ start=1 digits=1 save=[" + folderOut + "]");
	run("Close");
	run("Close");
	run("Close");
}

folderIn = "C:\\Users\\Laurae\\Documents\\Data Science\\Draper\\train_sm"
folderOut = "C:\\Users\\Laurae\\Documents\\Data Science\\Draper\\train parsed"
processFile(4, folderIn, folderOut);
```

# What does the macro?

The script is sample as it is read:

* We set the variable folderIn to the folder where we have our images

* We set the variable folderOut to the folder where we want to save our images

* We run the function processFile to parse the image set 4 which is in folderIn (where we have our images) to save the final output in folderOut (where we want to save our images)

In processFile, it is also as simple:

* We open the image set one by one (1 to 5)

* We stack the images in a Stack (surimposed images to analyze together) using the smallest dimensions possible (3099x2329 if available)

We run a linear stack alignement with SIFT method, using the following (default) parameters:

* Gaussian Blur: 1.60

* Steps per scale Octave = 3

* Minimum image size = 64

* Maximum image size = 1024

* Feature descriptor size = 4

* Feature descriptor orientation bins = 8

* Closest/Next closest ratio = 0.92

* Maximum alignment error = 25

* Inlier ratio = 0.05

* Expected transformation = Affine interpolate

Once we (the script) are done with the stack alignment:

* We scale down the images to 256x192 (interpolation is present if needed)

* We save the images as sequence files (1, 2, 3, 4, 5) with the same file names (we reproduce the names) as .JPEG

* We close all the opened windows from the script (there are 3: the stack, the feature analysis descriptor, and the aligned stack).

# Potential improvements you can do?

You can do extra post-processing if needed, this includes:

* Blacking out all the parts where at least one image did not covere these parts

* Changing the output size (256x192x3 might be large/small => 147456 features)

* Modify the histogram, hue, saturation... to match images' colors

* Perfect align the images using an elastic registration method aftewards (might not be necessary, and it is very time expensive)

Then, you must remember to do it on every set.

# I don't know how to code in ImageJ???

If you do not know how to code for ImageJ Macros, it is easy as pie for using ImageJ functions:

* Start the Macro recorder,

* Do the actions you want to record and get the code,

* Stop the Macro recorder,

* Copy & Paste the output code at the appropriate section!

# Pre-processing script

Once you are done pre-processing every set, you can start feeding the images in your favorite Deep Learning library/package and start predicting! (unless you want to do extra feature extraction beforehand!)

Here is the full script if you are using SIFT image registration (I hardcoded the set IDs, but you can obviously do around without):

```{r, eval=FALSE}
function processFile(id, folderIn, folderOut) {
	open(folderIn + "\\set" + id + "_1.jpeg");
	open(folderIn + "\\set" + id + "_2.jpeg");
	open(folderIn + "\\set" + id + "_3.jpeg");
	open(folderIn + "\\set" + id + "_4.jpeg");
	open(folderIn + "\\set" + id + "_5.jpeg");
	run("Images to Stack", "method=[Scale (smallest)] name=Stack title=[] use");
	run("Linear Stack Alignment with SIFT", "initial_gaussian_blur=1.60 steps_per_scale_octave=3 minimum_image_size=64 maximum_image_size=1024 feature_descriptor_size=4 feature_descriptor_orientation_bins=8 closest/next_closest_ratio=0.92 maximal_alignment_error=25 inlier_ratio=0.05 expected_transformation=Affine interpolate");
	run("Scale...", "x=- y=- z=1.0 width=256 height=192 depth=5 interpolation=Bilinear average process create");
	run("Image Sequence... ", "format=JPEG name=set" + id + "_ start=1 digits=1 save=[" + folderOut + "]");
	run("Close");
	run("Close");
	run("Close");
}

folderIn = "C:\\Users\\Laurae\\Documents\\Data Science\\Draper\\train_sm"
folderOut = "C:\\Users\\Laurae\\Documents\\Data Science\\Draper\\train parsed"
processFile(4, folderIn, folderOut);
processFile(5, folderIn, folderOut);
processFile(10, folderIn, folderOut);
processFile(12, folderIn, folderOut);
processFile(16, folderIn, folderOut);
processFile(20, folderIn, folderOut);
processFile(21, folderIn, folderOut);
processFile(25, folderIn, folderOut);
processFile(29, folderIn, folderOut);
processFile(31, folderIn, folderOut);
processFile(35, folderIn, folderOut);
processFile(43, folderIn, folderOut);
processFile(44, folderIn, folderOut);
processFile(50, folderIn, folderOut);
processFile(53, folderIn, folderOut);
processFile(57, folderIn, folderOut);
processFile(58, folderIn, folderOut);
processFile(59, folderIn, folderOut);
processFile(69, folderIn, folderOut);
processFile(78, folderIn, folderOut);
processFile(79, folderIn, folderOut);
processFile(94, folderIn, folderOut);
processFile(97, folderIn, folderOut);
processFile(107, folderIn, folderOut);
processFile(112, folderIn, folderOut);
processFile(131, folderIn, folderOut);
processFile(137, folderIn, folderOut);
processFile(143, folderIn, folderOut);
processFile(144, folderIn, folderOut);
processFile(158, folderIn, folderOut);
processFile(160, folderIn, folderOut);
processFile(165, folderIn, folderOut);
processFile(171, folderIn, folderOut);
processFile(173, folderIn, folderOut);
processFile(175, folderIn, folderOut);
processFile(176, folderIn, folderOut);
processFile(178, folderIn, folderOut);
processFile(190, folderIn, folderOut);
processFile(194, folderIn, folderOut);
processFile(201, folderIn, folderOut);
processFile(203, folderIn, folderOut);
processFile(205, folderIn, folderOut);
processFile(211, folderIn, folderOut);
processFile(217, folderIn, folderOut);
processFile(218, folderIn, folderOut);
processFile(220, folderIn, folderOut);
processFile(223, folderIn, folderOut);
processFile(224, folderIn, folderOut);
processFile(229, folderIn, folderOut);
processFile(239, folderIn, folderOut);
processFile(241, folderIn, folderOut);
processFile(251, folderIn, folderOut);
processFile(252, folderIn, folderOut);
processFile(255, folderIn, folderOut);
processFile(257, folderIn, folderOut);
processFile(264, folderIn, folderOut);
processFile(268, folderIn, folderOut);
processFile(274, folderIn, folderOut);
processFile(277, folderIn, folderOut);
processFile(279, folderIn, folderOut);
processFile(285, folderIn, folderOut);
processFile(297, folderIn, folderOut);
processFile(298, folderIn, folderOut);
processFile(301, folderIn, folderOut);
processFile(303, folderIn, folderOut);
processFile(307, folderIn, folderOut);
processFile(311, folderIn, folderOut);
processFile(327, folderIn, folderOut);
processFile(340, folderIn, folderOut);
processFile(342, folderIn, folderOut);

folderIn = "C:\\Users\\Laurae\\Documents\\Data Science\\Draper\\test_sm"
folderOut = "C:\\Users\\Laurae\\Documents\\Data Science\\Draper\\test parsed"
processFile(1, folderIn, folderOut);
processFile(2, folderIn, folderOut);
processFile(3, folderIn, folderOut);
processFile(6, folderIn, folderOut);
processFile(7, folderIn, folderOut);
processFile(8, folderIn, folderOut);
processFile(9, folderIn, folderOut);
processFile(11, folderIn, folderOut);
processFile(13, folderIn, folderOut);
processFile(14, folderIn, folderOut);
processFile(15, folderIn, folderOut);
processFile(17, folderIn, folderOut);
processFile(18, folderIn, folderOut);
processFile(19, folderIn, folderOut);
processFile(22, folderIn, folderOut);
processFile(23, folderIn, folderOut);
processFile(24, folderIn, folderOut);
processFile(26, folderIn, folderOut);
processFile(27, folderIn, folderOut);
processFile(28, folderIn, folderOut);
processFile(30, folderIn, folderOut);
processFile(32, folderIn, folderOut);
processFile(33, folderIn, folderOut);
processFile(34, folderIn, folderOut);
processFile(36, folderIn, folderOut);
processFile(37, folderIn, folderOut);
processFile(38, folderIn, folderOut);
processFile(39, folderIn, folderOut);
processFile(40, folderIn, folderOut);
processFile(41, folderIn, folderOut);
processFile(42, folderIn, folderOut);
processFile(45, folderIn, folderOut);
processFile(46, folderIn, folderOut);
processFile(47, folderIn, folderOut);
processFile(48, folderIn, folderOut);
processFile(49, folderIn, folderOut);
processFile(51, folderIn, folderOut);
processFile(52, folderIn, folderOut);
processFile(54, folderIn, folderOut);
processFile(55, folderIn, folderOut);
processFile(56, folderIn, folderOut);
processFile(60, folderIn, folderOut);
processFile(61, folderIn, folderOut);
processFile(62, folderIn, folderOut);
processFile(63, folderIn, folderOut);
processFile(64, folderIn, folderOut);
processFile(65, folderIn, folderOut);
processFile(66, folderIn, folderOut);
processFile(67, folderIn, folderOut);
processFile(68, folderIn, folderOut);
processFile(70, folderIn, folderOut);
processFile(71, folderIn, folderOut);
processFile(72, folderIn, folderOut);
processFile(73, folderIn, folderOut);
processFile(74, folderIn, folderOut);
processFile(75, folderIn, folderOut);
processFile(76, folderIn, folderOut);
processFile(77, folderIn, folderOut);
processFile(80, folderIn, folderOut);
processFile(81, folderIn, folderOut);
processFile(82, folderIn, folderOut);
processFile(83, folderIn, folderOut);
processFile(84, folderIn, folderOut);
processFile(85, folderIn, folderOut);
processFile(86, folderIn, folderOut);
processFile(87, folderIn, folderOut);
processFile(88, folderIn, folderOut);
processFile(89, folderIn, folderOut);
processFile(90, folderIn, folderOut);
processFile(91, folderIn, folderOut);
processFile(92, folderIn, folderOut);
processFile(93, folderIn, folderOut);
processFile(95, folderIn, folderOut);
processFile(96, folderIn, folderOut);
processFile(98, folderIn, folderOut);
processFile(99, folderIn, folderOut);
processFile(100, folderIn, folderOut);
processFile(101, folderIn, folderOut);
processFile(102, folderIn, folderOut);
processFile(103, folderIn, folderOut);
processFile(104, folderIn, folderOut);
processFile(105, folderIn, folderOut);
processFile(106, folderIn, folderOut);
processFile(108, folderIn, folderOut);
processFile(109, folderIn, folderOut);
processFile(110, folderIn, folderOut);
processFile(111, folderIn, folderOut);
processFile(113, folderIn, folderOut);
processFile(114, folderIn, folderOut);
processFile(115, folderIn, folderOut);
processFile(116, folderIn, folderOut);
processFile(117, folderIn, folderOut);
processFile(118, folderIn, folderOut);
processFile(119, folderIn, folderOut);
processFile(120, folderIn, folderOut);
processFile(121, folderIn, folderOut);
processFile(122, folderIn, folderOut);
processFile(123, folderIn, folderOut);
processFile(124, folderIn, folderOut);
processFile(125, folderIn, folderOut);
processFile(126, folderIn, folderOut);
processFile(127, folderIn, folderOut);
processFile(128, folderIn, folderOut);
processFile(129, folderIn, folderOut);
processFile(130, folderIn, folderOut);
processFile(132, folderIn, folderOut);
processFile(133, folderIn, folderOut);
processFile(134, folderIn, folderOut);
processFile(135, folderIn, folderOut);
processFile(136, folderIn, folderOut);
processFile(138, folderIn, folderOut);
processFile(139, folderIn, folderOut);
processFile(140, folderIn, folderOut);
processFile(141, folderIn, folderOut);
processFile(142, folderIn, folderOut);
processFile(145, folderIn, folderOut);
processFile(146, folderIn, folderOut);
processFile(147, folderIn, folderOut);
processFile(148, folderIn, folderOut);
processFile(149, folderIn, folderOut);
processFile(150, folderIn, folderOut);
processFile(151, folderIn, folderOut);
processFile(152, folderIn, folderOut);
processFile(153, folderIn, folderOut);
processFile(154, folderIn, folderOut);
processFile(155, folderIn, folderOut);
processFile(156, folderIn, folderOut);
processFile(157, folderIn, folderOut);
processFile(159, folderIn, folderOut);
processFile(161, folderIn, folderOut);
processFile(162, folderIn, folderOut);
processFile(163, folderIn, folderOut);
processFile(164, folderIn, folderOut);
processFile(166, folderIn, folderOut);
processFile(167, folderIn, folderOut);
processFile(168, folderIn, folderOut);
processFile(169, folderIn, folderOut);
processFile(170, folderIn, folderOut);
processFile(172, folderIn, folderOut);
processFile(174, folderIn, folderOut);
processFile(177, folderIn, folderOut);
processFile(179, folderIn, folderOut);
processFile(180, folderIn, folderOut);
processFile(181, folderIn, folderOut);
processFile(182, folderIn, folderOut);
processFile(183, folderIn, folderOut);
processFile(184, folderIn, folderOut);
processFile(185, folderIn, folderOut);
processFile(186, folderIn, folderOut);
processFile(187, folderIn, folderOut);
processFile(188, folderIn, folderOut);
processFile(189, folderIn, folderOut);
processFile(191, folderIn, folderOut);
processFile(192, folderIn, folderOut);
processFile(193, folderIn, folderOut);
processFile(195, folderIn, folderOut);
processFile(196, folderIn, folderOut);
processFile(197, folderIn, folderOut);
processFile(198, folderIn, folderOut);
processFile(199, folderIn, folderOut);
processFile(200, folderIn, folderOut);
processFile(202, folderIn, folderOut);
processFile(204, folderIn, folderOut);
processFile(206, folderIn, folderOut);
processFile(207, folderIn, folderOut);
processFile(208, folderIn, folderOut);
processFile(209, folderIn, folderOut);
processFile(210, folderIn, folderOut);
processFile(212, folderIn, folderOut);
processFile(213, folderIn, folderOut);
processFile(214, folderIn, folderOut);
processFile(215, folderIn, folderOut);
processFile(216, folderIn, folderOut);
processFile(219, folderIn, folderOut);
processFile(221, folderIn, folderOut);
processFile(222, folderIn, folderOut);
processFile(225, folderIn, folderOut);
processFile(226, folderIn, folderOut);
processFile(227, folderIn, folderOut);
processFile(228, folderIn, folderOut);
processFile(230, folderIn, folderOut);
processFile(231, folderIn, folderOut);
processFile(232, folderIn, folderOut);
processFile(233, folderIn, folderOut);
processFile(234, folderIn, folderOut);
processFile(235, folderIn, folderOut);
processFile(236, folderIn, folderOut);
processFile(237, folderIn, folderOut);
processFile(238, folderIn, folderOut);
processFile(240, folderIn, folderOut);
processFile(242, folderIn, folderOut);
processFile(243, folderIn, folderOut);
processFile(244, folderIn, folderOut);
processFile(245, folderIn, folderOut);
processFile(246, folderIn, folderOut);
processFile(247, folderIn, folderOut);
processFile(248, folderIn, folderOut);
processFile(249, folderIn, folderOut);
processFile(250, folderIn, folderOut);
processFile(253, folderIn, folderOut);
processFile(254, folderIn, folderOut);
processFile(256, folderIn, folderOut);
processFile(258, folderIn, folderOut);
processFile(259, folderIn, folderOut);
processFile(260, folderIn, folderOut);
processFile(261, folderIn, folderOut);
processFile(262, folderIn, folderOut);
processFile(263, folderIn, folderOut);
processFile(265, folderIn, folderOut);
processFile(266, folderIn, folderOut);
processFile(267, folderIn, folderOut);
processFile(269, folderIn, folderOut);
processFile(270, folderIn, folderOut);
processFile(271, folderIn, folderOut);
processFile(272, folderIn, folderOut);
processFile(273, folderIn, folderOut);
processFile(275, folderIn, folderOut);
processFile(276, folderIn, folderOut);
processFile(278, folderIn, folderOut);
processFile(280, folderIn, folderOut);
processFile(281, folderIn, folderOut);
processFile(282, folderIn, folderOut);
processFile(283, folderIn, folderOut);
processFile(284, folderIn, folderOut);
processFile(286, folderIn, folderOut);
processFile(287, folderIn, folderOut);
processFile(288, folderIn, folderOut);
processFile(289, folderIn, folderOut);
processFile(290, folderIn, folderOut);
processFile(291, folderIn, folderOut);
processFile(292, folderIn, folderOut);
processFile(293, folderIn, folderOut);
processFile(294, folderIn, folderOut);
processFile(295, folderIn, folderOut);
processFile(296, folderIn, folderOut);
processFile(299, folderIn, folderOut);
processFile(300, folderIn, folderOut);
processFile(302, folderIn, folderOut);
processFile(304, folderIn, folderOut);
processFile(305, folderIn, folderOut);
processFile(306, folderIn, folderOut);
processFile(308, folderIn, folderOut);
processFile(309, folderIn, folderOut);
processFile(310, folderIn, folderOut);
processFile(312, folderIn, folderOut);
processFile(313, folderIn, folderOut);
processFile(314, folderIn, folderOut);
processFile(315, folderIn, folderOut);
processFile(316, folderIn, folderOut);
processFile(317, folderIn, folderOut);
processFile(318, folderIn, folderOut);
processFile(319, folderIn, folderOut);
processFile(320, folderIn, folderOut);
processFile(321, folderIn, folderOut);
processFile(322, folderIn, folderOut);
processFile(323, folderIn, folderOut);
processFile(324, folderIn, folderOut);
processFile(325, folderIn, folderOut);
processFile(326, folderIn, folderOut);
processFile(328, folderIn, folderOut);
processFile(329, folderIn, folderOut);
processFile(330, folderIn, folderOut);
processFile(331, folderIn, folderOut);
processFile(332, folderIn, folderOut);
processFile(333, folderIn, folderOut);
processFile(334, folderIn, folderOut);
processFile(335, folderIn, folderOut);
processFile(336, folderIn, folderOut);
processFile(337, folderIn, folderOut);
processFile(338, folderIn, folderOut);
processFile(339, folderIn, folderOut);
processFile(341, folderIn, folderOut);
processFile(343, folderIn, folderOut);
processFile(344, folderIn, folderOut);
```