- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I am trying to implement this simple test program in IPP. It enlarges a sample 2d matrix by 200%. This is the Matlab version:
A = uint8([1 2 3; 4 5 6]) % Input matrix
tform = affine2d([2 0 0; 0 2 0; 0 0 1]); % Define transform
B = imwarp(A, tform, 'nearest') % Run the transform
I get this output, as expected:
A =
1 2 3
4 5 6
B =
1 1 2 2 3 3
1 1 2 2 3 3
4 4 5 5 6 6
4 4 5 5 6 6
This is IPP equivalent code:
// ipptest.cpp : Attempt to use WarpAffine to scale an image 200%.
//
#include "ipp.h"
#include <iostream>
#include <iomanip>
typedef unsigned char byte;
int main(int argc, char* argv[])
{
ippInit();
// Source image and ROI
static const int kHEIGHT = 2;
static const int kWIDTH = 3;
byte srcImage[kHEIGHT][kWIDTH] =
{
{ 1, 2, 3 },
{ 4, 5, 6 }
};
IppiRect srcRoi;
srcRoi.x = srcRoi.y = 0;
srcRoi.width = kWIDTH + 1;
srcRoi.height = kHEIGHT + 1;
IppiSize srcSize;
srcSize.height = kHEIGHT;
srcSize.width = kWIDTH;
// Destinatino image buffer and ROI
byte destImage[kHEIGHT * 2][kWIDTH * 2];
IppiRect destRoi;
destRoi.x = destRoi.y = 0;
destRoi.width = kWIDTH * 2 + 1;
destRoi.height = kHEIGHT * 2 + 1;
// Scale source image by 200% in both x and y
double coeffs[2][3] =
{
{ 2.0, 0.0, 0.0 },
{ 0.0, 2.0, 0.0 }
};
IppStatus stat;
double bound[2][2];
// Following code is from AffineTransform sample to figure out destination width and height
stat = ippiGetAffineBound(srcRoi, bound, coeffs);
double width = bound[1][0] - bound[0][0];
double height = bound[1][1] - bound[0][1];
std::cout << "IPP sample says " << kWIDTH << " x " << kHEIGHT << " image should be scaled 200% to " << width << " x " << height << std::endl;
// Print input image
std::cout << std::endl << "Source image: " << std::endl;
for (int row = 0; row < kHEIGHT; ++row)
{
for (int col = 0; col < kWIDTH; ++col)
{
std::cout << " " << (unsigned int)srcImage[row][col];
}
std::cout << std::endl;
}
// Apply transform
stat = ippiWarpAffine_8u_C1R(
(const Ipp8u*)srcImage, srcSize, kWIDTH, srcRoi,
(Ipp8u*)destImage, kWIDTH * 2, destRoi,
coeffs, IPPI_INTER_NN);
// Print output image
std::cout << std::endl << "Transformed image: " << std::endl;
for (int row = 0; row < kHEIGHT * 2; ++row)
{
for (int col = 0; col < kWIDTH * 2; ++col)
{
std::cout << " " << (unsigned int)destImage[row][col];
}
std::cout << std::endl;
}
return 0;
}
But what I get is this:
IPP sample says 3 x 2 image should be scaled 200% to 6 x 4
Source image:
1 2 3
4 5 6
Transformed image:
1 2 2 3 3 204
4 5 5 6 6 204
4 5 5 6 6 204
204 204 204 204 204 204
Press any key to continue . . .
Obviously the transformed image isn't correct. Can somebody point out what's wrong, please.
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Goran,
Which version of Matlab is used?
To check the transformation I implemented the following small test for Matlab.
A = uint8([1 2 3; 4 5 6]) % Input matrix
tform=maketform('affine',[2 0 0; 0 2 0; 0 0 1]); % Define transform
B = imtransform(A, tform, 'nearest') % Run the transform
I got this result:
A =
1 2 3
4 5 6
B =
1 2 2 3 3
4 5 5 6 6
4 5 5 6 6
Regards, Valentin
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
OK, I see, I get the same output when I run your version, so Matlab and IPP match.
But could you please explain why if I have a 2x3 matrix and enlarge it by 200% I get 3x5 output instead of 4x6.
Wouldn't it make sense that using [2 0; 0 2] linear transform matrix would double the size of the input matrix?
Thanks!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you for the question. The matrix represents the image, where each pixel is a point that has own color value and (x,y) coordinates. Pixel coordinates correspond to the position of the number in the matrix. So if we have MxN matrix then the left-top point has coordinates (0,0) and the right-bottom point has coordinates (N-1,M-1). When we double increase the matrix size, we obtain a new matrix with the left-top point (0,0) and the right-bottom point ( (N-1) * 2, (M-1) * 2 ). In case of 2x3 matrix the right-bottom point has coordinates (x,y) = ( (3 - 1)*2 , (2 - 1)*2 ) = (4, 2), therefore the size of the enlarged matrix is 3x5.
Regards, Valentin
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for the explanation!
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page