I want to learn how images are composed - image

I really want to learn how an image is composed (i.e. array of bits, or however, how is the color composed for each pixel, etc). Can you point me in the right direction? I'm not really sure what to search for.
Thanks a lot in advance.
So what I want to do is to be able to modify the picture pragmatically, i.e. change to black and white, scale it, crop it, etc, and for this I would really like to learn how the image is composed instead of just finding these algorithms online.

You don't always need to know low level mathematical details(matrixes,quantisation,fourier transform etc.) of graphic formats to manipulate images.
For all the things you want to do you may use proper libraries.
For example in PHP libraries used freuqently to manipulate images are:
GD - http://php.net/manual/en/book.image.php
ImageMagick - http://php.net/manual/en/book.imagick.php

It depends on the image format that you're interested in manipulating. Each format (more or less) is composed in a different manner, and based on that has a different set of capabilities for manipulating the image.
Different sets of actions on an image favor different image formats, as does the type of image you want to manipulate.
Provide more details about what you want to do with the image and I'm sure someone else will come along and tell you which formats are best and how they are handled.

Related

How can you render complex dependency graph (dot) in a human readable way?

I'm looking for a way to render dependency graphs (puppet resource graphs to be exact) in a human readable way. And by 'readable' I mean easily readable without the need of having to setup a cinema screen just to be able to completely display the relevant part.
Here is such a graph I'm talking about.
If you render it via graphviz' dot -Tpng, it generates a about 16k x 3k pixel image which I absolutely cannot entirely display in any way that I could still read anything that's written there.
I'd like it to be more compact (less white space) and maybe different colors to help keeping track of the relationships more easily. Any hints on how to do that?
PS: The example graph actually is a quite simple one.
Perhaps you could use Gephi to filter the graph...
This post could help.

Some options for making augmented local maps with d3

I am new to d3 geo. My task is to make a map of Boston and add some interactive features to it.
So far I've been able to get an outline of Boston. But the base map should be comparable to something you'd see in Google Maps - it should have buildings, roads, street names and city names, rivers, etc. A basic geography that makes the region more familiar.
For now, I don't need to pan, and may have just two or three zoom states.
All the visualizations I've seen that overlay interactive features onto maps like this seem to use images for the underlying maps: windhistory, polymaps, google maps and more. So I guess my questions are:
Why do some maps use images for the "backdrop"? Is it just the easiest way to build on top of existing maps? Is it more performant?
If I go with the images approach, are there any limitations to the features I can add? I'm hoping to do things like windmaps, animations, heatmaps, etc.
What are the copyright implications for using images? I imagine the answer to this is, "depends on which images I use," but are there some standard libraries that have no strings attached? For example I know if I use Google Maps, I have to display their logo, there's an API limit, etc. Are there any standard sources that are completely open?
Are there any examples where geography is added purely through TopoJSON?
Sorry if some of these seem obvious, but I am completely new to maps and just don't know the standard practices. Thanks for any help!
A quick take on your questions. Hopefully someone with more mapping experience can give you more detail:
Why do some maps use images for the "backdrop"?
File size and computation time, mostly. Drawing complete maps with buildings, roads, and topography requires a lot of data and a lot of time for the browser to render it. If your browser DOM gets too complicated, it can slow down all interactions even after the original drawing.
If I go with the images approach, are there any limitations to the features I can add?
There's a reason most interactive maps use multiple layers. The background images are best for the underlying "lay of the land" type imagery, anything you want to be interactive should be on top with SVG.
What are the copyright implications for using images?
If you're using someone's images, you have to follow their licence. You might want to look at the OpenStreetMap project.
Are there any examples where geography is added purely through TopoJSON?
I suppose that depends on what you mean by "geography"; Mike Bostock has generated topoJSON for a variety of features based on US Atlas data.
As for whether it makes sense: TopoJSON encodes paths/boundaries directly, and encodes regions as the area enclosed by a set of boundaries. You could use it to encode streets and rivers and even building outlines, but you're not saving any file size relative regular GeoJSON because those paths generally aren't duplicated the way that region boundaries are. Relative to using image tiles, any improvement in file size would be countered with increased processing time.

Find duplicate images of different sizes

I am wondering if there is a pre-existing algorithm/library/framework to compare two images to see if one is a re-sized version of the other? The programming language doesn't matter at this stage.
If there is nothing out there, I'd need to write something up. What I have thought of so far:
(Expensive) Resize the larger to the smaller and compare pixel by pixel.
Better yet, just resize a few random "areas" on the picture and compare. If they match, convert more, etc...
Break the image into a number of rows and columns and do some sort of parity math on the color values.
The problem I see with the first two ideas especially, is that there are different ways to re-size a picture in the first place, so the math will likely not work out the same at all. Some re-sizing adds blur, etc....
If anyone could point me to some good literature on this subject, that would be great. My googling turns up mostly shareware applications which is not what I want.
The goal is to have this running in the back of a webserver.
The best approach depends on the characteristics of the images you are comparing, what percentage of probability it is that the images are the same, and when they are different, are they typically off by a lot or could it be as minute as a single pixel difference?
If the answers to the above is that the images you need to compare will be completely random then going with the expensive solution, or some available package might be the best bet.
If it is that you know that the images are different more often than not, and that the images typically differ quite a lot, and you really want to hand-roll a solution you could implement some initial 'quick compare' steps that would be less expensive and that would quickly identify a lot of the cases where the images are different.
For example you could resize the larger image, then either compare pixel-by-pixel (or calculate a hash of the pixel values) only a 'diagonal line' of the image (top left pixel to bottom right pixel) and by doing so exclude differing images and only do the more expensive comparison for those that pass this test.
Or take a pre-set number of points at whatever is a 'good distribution' depending on the type of image and only do the more expensive comparison for those that pass this test.
If you know a lot about the images you will be comparing, they have known characteristics and they are different more often than they are the same, implementing a cheap 'quick elimination compare' along the lines of the above could be worthwhile.
You need to look into dHash algorithm for this.
I wrote a pure java library just for this few days back. You can feed it with directory path(includes sub-directory), and it will list the duplicate images in list with absolute path which you want to delete. Alternatively, you can use it to find all unique images in a directory too.
It used awt api internally, so can't be used for Android though. Since, imageIO has problem reading alot of new types of images, i am using twelve monkeys jar which is internally used.
https://github.com/srch07/Duplicate-Image-Finder-API
Jar with dependencies bundled internally can be downloaded from, https://github.com/srch07/Duplicate-Image-Finder-API/blob/master/archives/duplicate_image_finder_1.0.jar
The api can find duplicates among images of different sizes too.

opencv or imagemagick for highlighting differences

I am working on a project in which I need to highlight the difference between pair of scanned images of text.
Example images are here and here.
I am building a webapp based on HTML,JS for this.
I found that openCV does support highlighting differences between 2 images.
Also I saw that imageMagick also has such support.
Does openCV has support for doing automatic registration of images?
And is there a JS module for openCV?
Which one is more suited for my purpose?
1. Simplistic way:
Suppose the images are perfectly aligned and similarly illuminated: subtract one image from another pixel by pixel, then threshold the result, filter out noisy blobs, and select the biggest ones. Good for a school project
2. A bit more complicated:
Align the images, then find a way to uniform the illumination, then apply the simplistic way.
How to align:
Find the text area in two images, as being a darker than the file color.
Find its corners
Use getPerspectiveTransform() to find the transform between images.
warpPerspective() one image to another.
Another way to register the two images is by feature matching. It has quite an extensive support in OpenCV. And findHomography() will estimate the pose between two images from a bigger set of matching points.
3. Canonical answer:
Align the image.
Convert it to text with an OCR engine.
Compare the text in the two images.
Well, besides the great help given by vasile, you also need the web app answer.
In order to make it work in a server, you will probably need a file upload form, as well as an answer from the server with the applied algorithm. There are several ways you can do it depending on the server restrictions you have. If you can run command line arguments, you would probably need to implement the highlight algorithm in opencv and pass the two input files a an output one for the program. A php script should be used for uploading the files, calling the command line program, and outputting the result to the user.
Another approach could be using java and JavaCV in a web container like Apache Tomcat, for instance.
Best regards,
Daniel

Image Comparison using OpenCV in order to determine traffic density

I am working on a project which gives plots real time traffic status on Google Maps, & make it available to user on an Android phone and web browser.
http://www.youtube.com/watch?v=tcAyMngkzjk
I need to compare 2 images in openCV in order to determine traffic density. Can you please guide me how to compare the images? Should I go for histogram comparison or simple image subtraction?
One common solution is using background subtraction to track moving objects (cars) and then export an image with the moving objects remarked, so you can easily extract the objects from the image. If this is not the case, you will have to detect the vehicles and that's more challenging task because as carlosdc says there are many approaches depending on the angle of the camera, the size of vehicles, light conditions, cluttered backgrounds, etc.
If you specify a little more the problem ...
It really depends, and it would be impossible to determine without looking at your images.
Also, let me point out that it may be quite difficult to make this work adequately in all conditions: day/night, ray/shine, etc. Perhaps you should start by looking at what others have done and how good/bad it works. One such example would be this
try to read this two tutorials about OpenCV versus detect/recognition and find contur.
http://python-catalin.blogspot.ro/search/label/OpenCV
or try to find the color change in your image ... ( for example find colors versus background street )

Resources