<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns="http://www.w3.org/TR/REC-html40">

<head><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 6.0">
<meta name="ProgId" content="FrontPage.Editor.Document">

<title>OpenCV exercise 2</title>
<style>
<!--
table.MsoTableGrid
	{border:1.0pt solid windowtext;
	text-align:justify;
	text-justify:inter-ideograph;
	font-size:10.0pt;
	font-family:"Times New Roman"}
h3
	{margin-top:6.0pt;
	margin-right:0cm;
	margin-bottom:3.0pt;
	margin-left:36.0pt;
	text-indent:-36.0pt;
	line-height:12.0pt;
	page-break-after:avoid;
	font-size:10.0pt;
	font-family:Arial;
	font-weight:normal;
	font-style:italic;
	}
-->
</style>
</head>

<body>

<pre>              <b><font size="6" color="#FF0000"> <span lang="en-ca">The Learning of OpenCV</span></font></b></pre>
<pre>					
</pre>
<pre>
</pre>
<pre><font color="#FF0000" size="4"><b>Here contains just <span lang="en-ca">the exercises in book &quot;Learning OpenCV&quot; and of course I believe there is better solution for them.</span></b></font></pre>
<pre>Actually some of simple test is NOT from the book and it is my own playing.</pre>
<pre>// I try to compare the result between DCT and DFT cause simply don't understand them at all.</pre>
<pre>#include &lt;cv.h&gt;
#include &lt;highgui.h&gt;
#include &lt;stdio.h&gt;
#include &lt;math.h&gt;
#include &lt;string.h&gt;
#include &lt;windows.h&gt;
#include &lt;tchar.h&gt;
#include &lt;time.h&gt;

#pragma comment(lib, &quot;cvd.lib&quot;)
#pragma comment(lib, &quot;cxcored.lib&quot;)
#pragma comment(lib, &quot;highguid.lib&quot;)

#pragma message(&quot;hello&quot;)

void exercise28()
{
	char* szWinName[] = {&quot;original&quot;,  &quot;polar&quot;};
	IplImage* pImage[sizeof(szWinName)/sizeof(char*)] = { NULL };
	int nNumber = sizeof(szWinName)/sizeof(char*);
	int i = 0, j = 0;
	double color = 255.0;
	int nWidth = 640, nHeight = 480;
	for (i = 0; i &lt; nNumber; i ++)
	{
		switch (i)
		{
		case 0:
			pImage[i] = cvCreateImage(cvSize(nWidth, nHeight), IPL_DEPTH_8U, 3);
			for (j = 4; j &lt; 8; j ++ )
			{
				cvRectangle(pImage[i], cvPoint(nWidth/j, nHeight/j), cvPoint(nWidth*(j-1)/j, nHeight*(j-1)/j), cvScalar(0, 0, 255), 4);
			}
		
			break;
		default:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), pImage[0]-&gt;depth, pImage[0]-&gt;nChannels);
			cvLogPolar(pImage[0], pImage[i], cvPoint2D32f(pImage[0]-&gt;width/2.0, pImage[0]-&gt;height/2.0), 50.0);
			break;
		}
		cvNamedWindow(szWinName[i]);
		cvShowImage(szWinName[i], pImage[i]);
	}
	
	cvWaitKey(0);
	for (i = 0; i &lt; nNumber; i ++)
	{
		cvDestroyWindow(szWinName[i]);
		cvReleaseImage(&amp;pImage[i]);
	}

}

void exercise29()
{
	char* szWinName[] = {&quot;original&quot;, &quot;red&quot;, &quot;green&quot;, &quot;blue&quot;, &quot;realpart Red&quot;, &quot;realpart Green&quot;, 
		&quot;realpart Blue&quot;, &quot;DCT red&quot;, &quot;DCT green&quot;, &quot;DCT blue&quot;, 
	&quot;DFT red&quot;, &quot;DFT green&quot;, &quot;DFT blue&quot;, };
	IplImage* pImage[sizeof(szWinName)/sizeof(char*)] = { NULL };
	int nNumber = sizeof(szWinName)/sizeof(char*);
	IplImage* pTotalImg = NULL;
	int i = 0, j = 0;
	int nPixSize = 3;
	CvMat myMat;
	char* pRow = NULL, *pSrc = NULL, *pDst = NULL;

	CvMat* pMat[4] = {NULL};
	for (i = 0; i &lt; nNumber; i ++)
	{
		switch (i)
		{
		case 0:
			pImage[i] = cvLoadImage(&quot;mytest.bmp&quot;);	
			nPixSize = pImage[0]-&gt;depth*pImage[0]-&gt;nChannels/8;
			//pTotalImg = cvCreateImage(cvSize(pImage[0]-&gt;width*nNumber, pImage[0]-&gt;height), pImage[0]-&gt;depth, pImage[0]-&gt;nChannels);
			//cvNamedWindow(&quot;total&quot;);		
				
			pImage[1] = cvCreateImage(cvGetSize(pImage[0]), pImage[0]-&gt;depth, 1);			
		
			pImage[2] = cvCreateImage(cvGetSize(pImage[0]), pImage[0]-&gt;depth, 1);			
	
			pImage[3] = cvCreateImage(cvGetSize(pImage[0]), pImage[0]-&gt;depth, 1);				
			cvSplit(pImage[0], pImage[3], pImage[2], pImage[1], NULL);
			break;
		case 4: 
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);			
			cvZero(pImage[i]);
			cvConvertScale(pImage[1], pImage[i], 1.0/255);
			break;
		case 5:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvConvertScale(pImage[2], pImage[i], 1.0/255.0);
			break;
		case 6:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvConvertScale(pImage[3], pImage[i], 1.0/255.0);
			break;
		case 7:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);				
			cvDCT(pImage[4], pImage[i], CV_DXT_FORWARD);		
			break;
		case 8:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvDCT(pImage[5], pImage[i], CV_DXT_FORWARD);	
			break;
		case 9:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvDCT(pImage[6], pImage[i], CV_DXT_FORWARD);	
			break;
		/*
		case 10:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_8U, 1);
			cvZero(pImage[i]);
			cvConvertScale(pImage[7], pImage[i],255);
			break;
		case 11:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_8U, 1);
			cvZero(pImage[i]);
			cvConvertScale(pImage[8], pImage[i]);
			break;
		case 12:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_8U, 1);
			cvZero(pImage[i]);
			cvConvertScale(pImage[9], pImage[i]);
			break;
			*/
		case 10:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvDFT(pImage[4], pImage[i], CV_DXT_FORWARD, pImage[i]-&gt;height);		
			break;
		case 11:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvDFT(pImage[5], pImage[i], CV_DXT_FORWARD, pImage[i]-&gt;height);	
			break;
		case 12:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvDFT(pImage[6], pImage[i], CV_DXT_FORWARD, pImage[i]-&gt;height);	
			break;
			/*
		case 16:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_8U, 1);
			cvZero(pImage[i]);
			cvConvertScale(pImage[13], pImage[i],255);
			break;
		case 17:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_8U, 1);
			cvZero(pImage[i]);
			cvConvertScale(pImage[14], pImage[i]);
			break;
		case 18:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_8U, 1);
			cvZero(pImage[i]);
			cvConvertScale(pImage[15], pImage[i]);
			break;
			*/
		}	
		
		
		/*
		pSrc = pImage[i]-&gt;imageData;
		pDst = pTotalImg-&gt;imageData + i*pImage[0]-&gt;width*nPixSize;
		for (j = 0; j &lt; pImage[0]-&gt;height; j ++)
		{
			memcpy(pDst, pSrc, pImage[0]-&gt;width*nPixSize);
			pSrc += pImage[0]-&gt;widthStep;
			pDst += pTotalImg-&gt;widthStep;
		}
		*/
		cvNamedWindow(szWinName[i]);
		cvShowImage(szWinName[i], pImage[i]);
	}
	//cvShowImage(&quot;total&quot;, pTotalImg);
	
	cvWaitKey(0);
	for (i = 0; i &lt; nNumber; i ++)
	{
		cvDestroyWindow(szWinName[i]);
		cvReleaseImage(&amp;pImage[i]);
	}
}



int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{	
	exercise29();
	return 0;
}</pre>
<pre>///////////////////////////////////////////////////////////////////////////////////////</pre>
<pre><a name="DFT/DCT inverse operation">// this is slightly different from above as I am trying to verify that DFT/DCT are indeed inversable operations. This is arsing from my mis-understanding about jpeg which is a lossy compression. The </a></pre>
<pre>//DCT/DFT part operation is not lossy. It is at quantization after DCT/DFT. Also I am trying to compare DFT/Convolution fast algorithms with original convolution or cvFilter2D. But it is just half done.</pre>
<pre>// I need to copy the sample code from book regarding the DFT/Convolution.</pre>
<pre>#include &lt;cv.h&gt;
#include &lt;highgui.h&gt;
#include &lt;stdio.h&gt;
#include &lt;math.h&gt;
#include &lt;string.h&gt;
#include &lt;windows.h&gt;
#include &lt;tchar.h&gt;
#include &lt;time.h&gt;

#pragma comment(lib, &quot;cvd.lib&quot;)
#pragma comment(lib, &quot;cxcored.lib&quot;)
#pragma comment(lib, &quot;highguid.lib&quot;)

#pragma message(&quot;hello&quot;)

void exercise28()
{
	char* szWinName[] = {&quot;original&quot;,  &quot;polar&quot;};
	IplImage* pImage[sizeof(szWinName)/sizeof(char*)] = { NULL };
	int nNumber = sizeof(szWinName)/sizeof(char*);
	int i = 0, j = 0;
	double color = 255.0;
	int nWidth = 640, nHeight = 480;
	for (i = 0; i &lt; nNumber; i ++)
	{
		switch (i)
		{
		case 0:
			pImage[i] = cvCreateImage(cvSize(nWidth, nHeight), IPL_DEPTH_8U, 3);
			for (j = 4; j &lt; 8; j ++ )
			{
				cvRectangle(pImage[i], cvPoint(nWidth/j, nHeight/j), cvPoint(nWidth*(j-1)/j, nHeight*(j-1)/j), cvScalar(0, 0, 255), 4);
			}
		
			break;
		default:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), pImage[0]-&gt;depth, pImage[0]-&gt;nChannels);
			cvLogPolar(pImage[0], pImage[i], cvPoint2D32f(pImage[0]-&gt;width/2.0, pImage[0]-&gt;height/2.0), 50.0);
			break;
		}
		cvNamedWindow(szWinName[i]);
		cvShowImage(szWinName[i], pImage[i]);
	}
	
	cvWaitKey(0);
	for (i = 0; i &lt; nNumber; i ++)
	{
		cvDestroyWindow(szWinName[i]);
		cvReleaseImage(&amp;pImage[i]);
	}

}

void exercise29()
{
	char* szWinName[] = {&quot;original&quot;, &quot;red&quot;, &quot;green&quot;, &quot;blue&quot;, &quot;realpart Red&quot;, &quot;realpart Green&quot;, 
		&quot;realpart Blue&quot;, &quot;DCT red&quot;, &quot;DCT green&quot;, &quot;DCT blue&quot;, &quot;DCT inverse red&quot;,  &quot;DCT inverse green&quot;, &quot;DCT inverse blue&quot;, 
	&quot;DFT red&quot;, &quot;DFT green&quot;, &quot;DFT blue&quot;, &quot;DFT inverse red&quot;, &quot;DFT inverse green&quot;, &quot;DFT inverse blue&quot;, };
	IplImage* pImage[sizeof(szWinName)/sizeof(char*)] = { NULL };
	int nNumber = sizeof(szWinName)/sizeof(char*);
	int i = 0, j = 0;
	int nWidth = 0, nHeight = 0;
	CvMat myMat;

	for (i = 0; i &lt; nNumber; i ++)
	{
		switch (i)
		{
		case 0:
			pImage[i] = cvLoadImage(&quot;mytest.jpg&quot;);	

			pImage[1] = cvCreateImage(cvGetSize(pImage[0]), pImage[0]-&gt;depth, 1);			
		
			pImage[2] = cvCreateImage(cvGetSize(pImage[0]), pImage[0]-&gt;depth, 1);			
	
			pImage[3] = cvCreateImage(cvGetSize(pImage[0]), pImage[0]-&gt;depth, 1);				
			cvSplit(pImage[0], pImage[3], pImage[2], pImage[1], NULL);
			nWidth = cvGetOptimalDFTSize(pImage[0]-&gt;width);
			nHeight = cvGetOptimalDFTSize(pImage[0]-&gt;height);
			break;
		case 4: 
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);			
			cvZero(pImage[i]);
			cvConvertScale(pImage[1], pImage[i], 1.0/255);
			break;
		case 5:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvConvertScale(pImage[2], pImage[i], 1.0/255.0);
			break;
		case 6:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvConvertScale(pImage[3], pImage[i], 1.0/255.0);
			break;
		case 7:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);				
			cvDCT(pImage[4], pImage[i], CV_DXT_FORWARD);		
			break;
		case 8:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvDCT(pImage[5], pImage[i], CV_DXT_FORWARD);	
			break;
		case 9:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvDCT(pImage[6], pImage[i], CV_DXT_FORWARD);	
			break;
	
		case 10:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvDCT(pImage[7], pImage[i],CV_DXT_INVERSE);
			break;
		case 11:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvDCT(pImage[8], pImage[i], CV_DXT_INVERSE);
			break;
		case 12:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvDCT(pImage[9], pImage[i], CV_DXT_INVERSE);
			break;
/////////////////////////////////////////////////////////////////////////////////////////		
		case 13:
			pImage[i] = cvCreateImage(cvSize(nWidth, nHeight), IPL_DEPTH_64F, 1);
			
			cvZero(pImage[i]);
			cvGetSubRect(pImage[i], &amp;myMat, cvRect(0, 0, pImage[0]-&gt;width, pImage[0]-&gt;height));
			cvCopy(pImage[4], &amp;myMat);
			cvDFT(pImage[i], pImage[i], CV_DXT_FORWARD, pImage[0]-&gt;height);		
			break;
		case 14:
			pImage[i] = cvCreateImage(cvSize(nWidth, nHeight), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvGetSubRect(pImage[i], &amp;myMat, cvRect(0, 0, pImage[0]-&gt;width, pImage[0]-&gt;height));
			cvCopy(pImage[5], &amp;myMat);
			cvDFT(pImage[i], pImage[i], CV_DXT_FORWARD, pImage[0]-&gt;height);		
			break;
		case 15:
			pImage[i] = cvCreateImage(cvSize(nWidth, nHeight), IPL_DEPTH_64F, 1);
			cvZero(pImage[i]);
			cvGetSubRect(pImage[i], &amp;myMat, cvRect(0, 0, pImage[0]-&gt;width, pImage[0]-&gt;height));
			cvCopy(pImage[4], &amp;myMat);
			cvDFT(pImage[i], pImage[i], CV_DXT_FORWARD, pImage[0]-&gt;height);		
			break;			
		case 16:
			pImage[i] = cvCreateImage(cvSize(nWidth, nHeight), IPL_DEPTH_64F, 1);			
			cvZero(pImage[i]);			
			cvDFT(pImage[13], pImage[i], CV_DXT_INV_SCALE, pImage[0]-&gt;height);
			break;
		case 17:
			pImage[i] = cvCreateImage(cvSize(nWidth, nHeight), IPL_DEPTH_64F, 1);			
			cvZero(pImage[i]);
			cvDFT(pImage[14], pImage[i], CV_DXT_INV_SCALE, pImage[0]-&gt;height);
			break;
		case 18:
			pImage[i] = cvCreateImage(cvSize(nWidth, nHeight), IPL_DEPTH_64F, 1);			
			cvZero(pImage[i]);
			cvDFT(pImage[15], pImage[i], CV_DXT_INV_SCALE, pImage[0]-&gt;height);
			break;
			
		}		
	
		cvNamedWindow(szWinName[i]);
		cvShowImage(szWinName[i], pImage[i]);
	}
	cvWaitKey(0);
	for (i = 0; i &lt; nNumber; i ++)
	{
		cvDestroyWindow(szWinName[i]);
		cvReleaseImage(&amp;pImage[i]);
	}
}

void exercise30()
{
	char* szWinName[] = {&quot;original&quot;, &quot;CANNY&quot;, &quot;distance&quot;};
	IplImage* pImage[sizeof(szWinName)/sizeof(char*)] = { NULL };
	int nNumber = sizeof(szWinName)/sizeof(char*);
	int i = 0, j = 0;
	for (i = 0; i &lt; nNumber; i ++)
	{
		switch (i)
		{
		case 0:
			pImage[i] = cvLoadImage(&quot;mytest.jpg&quot;, CV_LOAD_IMAGE_GRAYSCALE);	
			break;
		case 1:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), pImage[0]-&gt;depth, 1);
			cvZero(pImage[i]);
			cvCanny(pImage[0], pImage[i], 0, 255);
			break;
		default:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_32F, 1);
			cvZero(pImage[i]);
			cvDistTransform(pImage[1], pImage[i]);
			break;
		}
		cvNamedWindow(szWinName[i]);
		cvShowImage(szWinName[i], pImage[i]);
	}
	
	cvWaitKey(0);
	for (i = 0; i &lt; nNumber; i ++)
	{
		cvDestroyWindow(szWinName[i]);
		cvReleaseImage(&amp;pImage[i]);
	}
}


void exercise31()
{
	char* szWinName[] = {&quot;src img&quot;, &quot;real src img&quot;, &quot;kernel&quot;, &quot;real kernel img&quot;, &quot;dst img&quot;};
	IplImage* pImage[sizeof(szWinName)/sizeof(char*)] = { NULL };
	int nNumber = sizeof(szWinName)/sizeof(char*);
	int i = 0, nSize = 0;
	CvMat myMat, kernel;
	for (i = 0; i &lt; nNumber; i ++)
	{
		switch (i)
		{
		case 0:
			pImage[i] = cvLoadImage(&quot;mysrc.jpg&quot;, CV_LOAD_IMAGE_GRAYSCALE);	
			pImage[i+1] = cvCreateImage(cvGetSize(pImage[i]), IPL_DEPTH_32F, 1);
			cvConvertScale(pImage[i], pImage[i+1], 1.0/255.0);
			break;
		case 2:
			pImage[i] = cvLoadImage(&quot;mykernel.jpg&quot;, CV_LOAD_IMAGE_GRAYSCALE);
			nSize = pImage[i]-&gt;width;
			if (pImage[i]-&gt;width &gt; pImage[i]-&gt;height)
			{
				nSize = pImage[i]-&gt;height;
			}
			pImage[i+1] = cvCreateImage(cvSize(nSize, nSize), IPL_DEPTH_32F, 1);
			cvGetSubRect(pImage[i], &amp;myMat, cvRect(0,0, nSize, nSize));			

			cvConvertScale(&amp;myMat, pImage[i+1], 1.0/(1*255.0), -0.319);
			cvGetSubRect(pImage[i+1], &amp;kernel, cvRect(0, 0, nSize, nSize));
			break;
		case 4:
			pImage[i] = cvCreateImage(cvGetSize(pImage[0]), IPL_DEPTH_32F, 1);
			if (nSize % 2 == 0)
			{
				cvFilter2D(pImage[1], pImage[i], &amp;kernel, cvPoint(nSize/2, nSize/2));
			}
			else
			{
				cvFilter2D(pImage[1], pImage[i], &amp;kernel);
			}

			break;
		}
		cvNamedWindow(szWinName[i]);
		cvShowImage(szWinName[i], pImage[i]);
	}
	
	cvWaitKey(0);
	for (i = 0; i &lt; nNumber; i ++)
	{
		cvDestroyWindow(szWinName[i]);
		cvReleaseImage(&amp;pImage[i]);
	}
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{	
	exercise31();
	return 0;
}</pre>
<pre>กก</pre>
<pre>กก</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="logic.htm">      







                       <img src="picture/back.gif" style="border: medium none" alt="back.gif (341 bytes)" width="32" height="35"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
<a href="index.htm">
<img src="picture/up.gif" style="border: medium none" alt="up.gif (335 bytes)" width="35" height="32"></a>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<a href="Matrix.htm">
<img src="picture/next.gif" style="border: medium none" alt="next.gif (337 bytes)" width="32" height="35">            


</a>            


</p>

</body>

</html>