diff options
author | scuri <scuri> | 2008-10-17 06:10:15 +0000 |
---|---|---|
committer | scuri <scuri> | 2008-10-17 06:10:15 +0000 |
commit | 5a422aba704c375a307a902bafe658342e209906 (patch) | |
tree | 5005011e086bb863d8fb587ad3319bbec59b2447 /html/en/proc_samples.html |
First commit - moving from LuaForge to SourceForge
Diffstat (limited to 'html/en/proc_samples.html')
-rw-r--r-- | html/en/proc_samples.html | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/html/en/proc_samples.html b/html/en/proc_samples.html new file mode 100644 index 0000000..e51ff37 --- /dev/null +++ b/html/en/proc_samples.html @@ -0,0 +1,142 @@ +<!doctype HTML PUBLIC "-//IETF//DTD HTML//EN"> +<html> + +<head> +<meta http-equiv="Content-Language" content="en-us"> +<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> +<title>Processing Samples</title> +<link rel="stylesheet" type="text/css" href="../style.css"> +</head> + +<body> + +<h1>Image Processing Samples</h1> +<h3><a name="proc_fourier">Fourier Transform</a></h3> + + <p>This is another command line application that process an image in the + Fourier Frequency Domain. In this domain the image is a map of the spatial + frequencies of the original image. It depends on the IM main library and on + the IM_FFTW library. The FFTW is a very fast Fourier transform, but is + contaminated by the GPL license, so everything must be also GPL. To use it in + a commercial application you must contact the MIT and pay for a commercial + license.</p> + <p>Se also + <a href="doxygen/group__transform.html"> + Reference / Image Processing / Domain Transform Operations</a>.</p> + <p>You can view the source code here: <a href="../download/proc_fourier.cpp"> + proc_fourier.cpp</a></p> + +<h3><a name="houghlines">Hough Lines</a></h3> + + <p>The Hough transform can be used to detect lines in an image. But it results + are highly dependent on other operations done before and after the transform. + Here you can see a small pseudo code that ilustrates a possible sequence of + operations to detect lines using the hough transform.</p> + <p>First the canny operator will isolate the borders, the threshold will mark + the candidate pixels. After the transform the local maximum are isolated to + detect the line parameters of the lines that have many pixels from the + cadidate ones. The last operation will just draw the detected lines over the + original gray scale image.</p> + + <pre>imProcessCanny(in,out,stddev) +imProcessHysteresisThreshold(in,out,low,high) + +imProcessHoughLines(in,out) +imProcessLocalMaxThreshold(in,out,size,min) + +imProcessHoughLinesDraw(in1,in2,out)</pre> + + <p>Or a more complete sequence using another approach:</p> + + <pre>gray = imImageCreate(width, height, IM_GRAY, IM_BYTE); +binary = imImageCreate(width, height, IM_BINARY, IM_BYTE); +binary2 = imImageClone(binary); + +rhomax = sqrt(width*width +height*height)/2; +hough_height=2*rhomax+1; +hough = imImageCreate(180, hough_height, IM_GRAY, IM_INT); +hough_binary = imImageCreate(180, hough_height, IM_BINARY, IM_BYTE); + +imConvertColorSpace(rgb, gray); + +// very important step, the quality of the detected lines are highly dependent on +// the quality of the binary image +// Using a simple threshold like in here maybe not a good solution for your image +imProcessPercentThreshold(gray, binary, percent=50); + +// eliminates unwanted objects, depending on the quality of the threshold +// this step can be skiped +imProcessBinMorphClose(binary, binary2, 3, 1); +imProcessPrune(binary2, binary, 4, size=100, 0); + +// Is there any holes in the objects? +// Holes also have borders... +imProcessFillHoles(binary, binary2, 4); + +// leave only the object borders +imProcessPerimeterLine(binary2, binary); + +// here you should have near only the lines you want to detect. +// if there are more or less lines that you want redo the previous steps + +imProcessHoughLines(binary, hough); +imProcessLocalMaxThreshold(hough, hough_binary, 7, 100); + +// this is optional, it will draw the results +imProcessHoughLinesDraw(gray,hough_binary,draw_hough); </pre> + + <p>In the result of <b>imProcessLocalMaxThreshold</b> there will be several white + pixels. They represent the detected lines. Defining:</p> + + <pre>Y = a * X + b +cos(theta) * X + sin(theta) * Y = rho + +where: + X = x - width/2 + Y = y - height/2 + +because the origin of the transform is in the center of the image</pre> + + <p>Each coordinate in the transform has values in the intervals:</p> + + <pre>theta = 0 .. 179 (horizontal coordinate of the hough space) +rho = -rhomax .. rhomax (vertical coordinate of the hough space, + vertically centered in the image) + +where: + rhomax = sqrt(width*width + height*height) /2 (width and height of the original image)</pre> + + <p>For each (xi, yi) point found in the result image:</p> + + <pre>theta = xi; +rho = yi - rhomax; + +then: + +a = -cos(theta)/sin(theta); +b = (rho + (width/2)*cos(theta) + (height/2)*sin(theta))/sin(theta);</pre> + + <p>The complex formula for "b" came from the fact that we have to shift the + result to the image origin at (0,0).</p> + +<h3><a name="analysis">Image Analysis</a></h3> + + <p>The following pseudo code ilustrates the sequence of operations to measure + regions. This is also called Blob Analysis.</p> + <p>First the regions are isolated from background using a threshold. Then + regions too small or too large are eliminated and the holes are filled in this + example. After the regions are found we can start measuring properties of the + regions like area and perimeter.</p> + + <pre>imProcessSliceThreshold(in, out, level1, level2) +imProcessPrune(in, out, connect, size1, size2) +imProcessFillHoles(in, out, connect) +imAnalyzeFindRegions(in, out, connect) +imAnalyzeMeasureArea(in, area) +imAnalyzeMeasurePerimeter(in, perim)</pre> + + + +</body> + +</html>
\ No newline at end of file |