Picture Manipulation Assignment Project Homework Task case study Online
WHAT YOUR APPLICATION SOULD BE DOING BY NOW?
In the first phase of the project development, the focus was on Picture Manipulation. This handout assumes that your application developed so far is able to:
Read a picture from a file
Read the RGB color information from a pixel in a picture
Rotate a picture 90o clockwise and 90oanticlockwise
Flip a picture horizontally and vertically
Write a picture to a file
Create mirror images of pictures OR adjust color information.
Read a picture from a file
Read the RGB color information from a pixel in a picture
Rotate a picture 90o clockwise and 90oanticlockwise
Flip a picture horizontally and vertically
Write a picture to a file
Create mirror images of pictures OR adjust color information.
WHAT IS THE FOCUS OF THIS HANDOUT?
In this phase of project development, you will be building a small Search Engine (and its extensions) for finding pictures by matching their pixels and color information. You have to write a separate class for this phase which should be called SearchEngine. The key features to be implemented are as follows:
Compare two images for similarity
Create a listing/database of all images in a certain directory
Find a matching image in a directory
Detect and Remove duplicate images in a directory
Compare two images for similarity
Create a listing/database of all images in a certain directory
Find a matching image in a directory
Detect and Remove duplicate images in a directory
In this assignment, you will also learn to use Java Documentation which will be your guide for using classes from Java Library in your code. The complete documentation is available at http://java.sun.com/javase/6/docs/api/ where the left hand pane lists all packages and classes included in the Java Library.
You will import java.io in your code (apart from other packages that you may need to import) under which you will find various classes, the most important being File in the scope of this assignment. This class has methods for listing files in a directory, getting length of file, deleting a file and almost all sorts of operations that you can do to a file. Now it is on your part to decide what you will use in order to implement the required tasks.
Note that this is a creative assignment so one reason of exposing you to the java library is to allow you to add your own operations and functionality to your application – which is AFTER you are done implementing the required tasks. If you have any bright ideas and you want to implement and incorporate them in your application, the Java Docs is your guide to explore the things you can do. Although you may not be awarded extra marks for this but towards the end, it will be your application and you will feel good about it.
IMPORTANT: You should try and optimize your code/algorithm so your application runs efficiently with large image files and huge directories – if you have a bad algorithm and it takes unnecessary time to do what is required, it would take very long for larger inputs and thus would not leave a good impression of your application.
Turn to the next page for details and hints on the required tasks.
In all of the following methods that you will implement, you are required to apply thorough checking on the inputs received. Your program must not crash if an invalid input is passed to your method. Of course you will not check for invalid data types but you will definitely check for valid values of inputs before using them in your code. If you find an invalid input, you should smartly exit from the function letting the calling function know about the error.
COMPARE TWO IMAGES
The method that you will write should take two Pictureobjects and a threshold value of type int. You are required to compare the two pictures and tell if the pictures are exactly the same, similar or not matching at all. The prototype for this method is:
public int compareImage(int threshold, Picture p1, Picture p2)
You may be wondering why this function returns an integer. Well you could have just printed the results inside this function but this seems to be a better way because this way, the calling function would also know the results. You will follow the following convention to read results returned by this function:
Return Value | Result |
0 | Pictures are exactly the same |
1 | Pictures are similar |
2 | Pictures do not match at all |
-1 | Invalid Input received |
Your calling function should print the results on screen depending upon what value is returned by this method. You will not print anything in this method.
ALGORITHM FOR SIMILARITY:
There should be no problem in checking if the two pictures are the same. For similarity, you will use the threshold value passed to this method. You will check if the difference in color values for every pixel is less than this threshold value or not – if it is, then the pictures are similar and if it is not (and the pictures are also not the same) then the pictures do not match at all. For example, if your threshold value is 5 and the colors of two pixels being compared are (100, 90, 90) and (99, 86, 93), then you can say that the two pixels are similar.
CREATE A LISTING/DATABASE
For this feature, you will write a method that takes a String as a parameter. This Stringobject will hold the path of the directory which is to be searched for images. The prototype for this method is:
public ArrayList<String> getList(String directoryPath)
The list of files (their names) in a directory should be returned from this method as ArrayList of type String. Ignore all subdirectories and non-images in the given directory – the ArrayList must only hold names of image files in the directory. The calling function, when it receives the ArrayList returned by this method, should traverse it and print its contents. Again, you will not print anything in this method. You can assume that all image files will be of JPEG format with the extension .jpg.
If you get an invalid input or a directory path that does not exist, return nullfrom this method and apply a check in your calling function. You will notreturn null if no files exist in the specified directory – if you don’t get a list of filenames at the calling end, you should be able to tell whether an error occurred or no files were found in the directory in which case the appropriate message should be printed on the screen at the calling end.
FIND A MATCHING IMAGE
So far so good, you’ve created a method to compare two images and you have a way to get a list of image files in a specific directory. Next, write a method that finds all matches of a given image in a directory. The prototype for this method is:
public ArrayList<String> findMatch(Picture p, String directoryPath)
Again, this function returns an ArrayList of type String which holds filenames of allmatching images found in the directory. This method is passed an object of type Picture and you have to find similar/exact matches of this picture in the directory path which is also passed to this method as a String. Ignore all subdirectories and non-images in the given directory - you can assume that all image files will be of JPEG format with the extension .jpg. The calling function, when it receives ArrayList returned by this method, should traverse it and print its contents. Do not print anything in this method.
If you get an invalid input or a directory path that does not exist, return nullfrom this method and apply a check in your calling function. You will notreturn null if no matching files are found – if you don’t get a list of filenames at the calling end, you should be able to tell whether an error occurred or no matching files were found in which case the appropriate message should be printed on the screen at the calling end.
DETECT DUPLICATE IMAGES
Duplicate in this context means exact, not similar. This method just takes the directory path as a String and searches this directory for duplicate images. The prototype of this function is:
public ArrayList<String> findDuplicate(String directoryPath)
You will not pass the picture object to this method; your algorithm should automatically check duplicate occurrences of image files in the directory and removethem from the directory. Ignore all subdirectories and non-images in the given directory - you can assume that all image files will be of JPEG format with the extension .jpg. The names of all the files that are deleted by this method go in the ArrayList of type String which is then returned from this method. The calling function, when it receives the ArrayList, should traverse it and print its contents. Again, do not insert any print statement in this method.
If you get an invalid input or a directory path that does not exist, return null from this method and apply a check in your calling function. You will not return null if no files are removed – if you don’t get a list of filenames at the calling end, you should be able to tell whether an error occurred or no duplicate files were found in which case the appropriate message should be printed on the screen at the calling end.
HOW TO MERGE PHASE 1 AND PHASE 2:
This phase is implemented as a separate class. Your main method resides in the class that you created in Phase 1 so why not just let it stay there and declare this class there.
You should keep in mind that the next phase will require you to build a GUI layer on top of all this so your class (from phase 1) should be such that you face minimum difficulty when linking your function calls to the GUI – it should be organized (broken down into proper methods – everything must not be in the main method) and everything should be easily identifiable.