自己想的,比较简单粗糙。
#include <stdio.h>
#include <iostream>
#include "cv.h"
#include "highgui.h"
int main()
{
int i,j;
uchar* srcptr;
uchar* dstptr;
IplImage* src = cvLoadImage("H:\\pictures\\tree.jpg");
int srcWidth = src->widthStep;
int srcHeight = src->height;
int halfH = srcHeight/2;
int index;
IplImage * dst = cvCreateImage(cvSize(srcWidth/3,srcHeight), src->depth, src->nChannels);
uchar* data = (uchar*)dst->imageData;
for ( i = 0; i < srcHeight; i++)
{
for (j = 0; j < srcWidth; j++)
{
data[i * srcWidth + j ] = 255;
}
}
for (j = 0; j < src->widthStep; j++)
{
for (i = 0; i < srcHeight; i++)
{
if (i <= halfH)
{
index = j*srcHeight/(3*srcWidth);
if (i >= index)
{
if ((i-index)*halfH/(halfH-index) >= srcHeight)
{
continue;
}
dstptr = (uchar*)(dst->imageData + i * dst->widthStep);
srcptr = (uchar*)(src->imageData + (i-index)*halfH/(halfH-index) * src->widthStep);
dstptr[j] = srcptr[j];
}
else
{
dstptr[j] = 0;
}
}
else
{
index = j*srcHeight/(3*srcWidth);
if (i <= srcHeight - index)
{
if (halfH + halfH*(i - halfH)/(halfH - index) >= srcHeight)
{
continue;
}
dstptr = (uchar*)(dst->imageData + i * dst->widthStep);
srcptr = (uchar*)(src->imageData + (halfH + halfH*(i - halfH)/(halfH - index)) * src->widthStep);
dstptr[j] = srcptr[j];
}
else
{
dstptr[j] = 0;
}
}
}
}
cvSaveImage("H:\\pictures\\tree1.jpg",dst);
cvNamedWindow("src", 0);
cvNamedWindow("dst", 0);
cvShowImage("src", src);
cvShowImage("dst", dst);
cvWaitKey(0);
cvDestroyWindow("src");
cvDestroyWindow("dst");
cvReleaseImage(&src);
cvReleaseImage(&dst);
return 0;
}
原图像:
变换后的图像: