s_t_1979
asked on
Problem in storing coordinates of a pixel
hi! all
i'm writng a code for image compression in which i have to read the data from file and store it in a matrix form. Second step involves sorting of data....data can be sort but i've to store their positions not the values in an array (acc. to the sorted values).
Suppose 64(3rd row & 5th col) is the max value in the matrix...then i've to store 3,5 position of 64 . Now problem is how do i store that. i think it's pretty simple but i'm not bale to get it.
This is done so that value's original location is not lost...since it's an image & after whatever operation we need to send that vlue back to its original position so as to get the original image back.
What kind of structure do i need to use.
Please if someone cud help me solving this prob.
thanks in advance
i'm writng a code for image compression in which i have to read the data from file and store it in a matrix form. Second step involves sorting of data....data can be sort but i've to store their positions not the values in an array (acc. to the sorted values).
Suppose 64(3rd row & 5th col) is the max value in the matrix...then i've to store 3,5 position of 64 . Now problem is how do i store that. i think it's pretty simple but i'm not bale to get it.
This is done so that value's original location is not lost...since it's an image & after whatever operation we need to send that vlue back to its original position so as to get the original image back.
What kind of structure do i need to use.
Please if someone cud help me solving this prob.
thanks in advance
Is this homework?
Try this:
int* sortArray(int* array, int size)
{
// check for minimal two items
if (size <= 1)
return NULL;
// create integer array for the sorted indices
int* idxArr = new int[size];
int nn = 0; // nn is the number of already sorted items
int n1 = 0; // n1 is the lower range index when searching binary
int n2 = 0; // n2 is the upper range index when searching binary
int n = 0; // n is the middle of the binary range
int i; // loop counter
// loop all items and build a sorted index array
for (i = 0; i < size; i++)
{
// i1 is the new item which index must be inserted to the index array
int i1 = array[i];
// init the binary range to the current size of the already sorted index array
n1 = 0;
n2 = nn-1;
// binary search
while (n1 <= n2)
{
// compute the middle of the current range for dividing the current range into two parts
n = (n1 + n2 + 1)/2;
// get the item to compare
int i2 = array[idxArr[n]];
// compare both items
// if the left item is less we make the lower part current
if (i1 < i2)
n2 = n - 1;
// if the left item is greater or equal we make the upper part current
else
n1 = n + 1;
}
// at end of the previous loop n1 is the new position where the current item index (i)
// has to be inserted to get the index array sorted
// if this position is not outside the current size (that means we have not to change the order)
// we move all indices on the right side for one position using memmove
if (n1 < nn)
{
memmove(&idxArr[n1+1], &idxArr[n1], (nn-n1)*sizeof(int));
}
idxArr[n1] = i;
nn++;
}
return idxArr;
}
#define MAXX 100
#define MAXY 100
int main(int argc, char* argv[])
{
int matrix[MAXY][MAXX] = { 0 };
// read matrix from somewhere
if (readMatrix(matrix, ...))
{
int* array = (int*)matrix;
int size = MAXX*MAXY;
int* idxArr = sortArray(array, size);
// now you may store the index array to a file
// it is as big as the original image file (if the values to sort are integers)
writeSortedIndex(idxArr, ...);
// if you need the coordinates e. g. of the biggest value you may calculate
int idx = idxArr[size-1];
int x = idx % MAXX;
int y = idx / MAXX;
// then, you got the max value by
int maxInt = matrix[x][y];
}
}
I assumed that your values are integers.
Hope, that helps
Alex
int* sortArray(int* array, int size)
{
// check for minimal two items
if (size <= 1)
return NULL;
// create integer array for the sorted indices
int* idxArr = new int[size];
int nn = 0; // nn is the number of already sorted items
int n1 = 0; // n1 is the lower range index when searching binary
int n2 = 0; // n2 is the upper range index when searching binary
int n = 0; // n is the middle of the binary range
int i; // loop counter
// loop all items and build a sorted index array
for (i = 0; i < size; i++)
{
// i1 is the new item which index must be inserted to the index array
int i1 = array[i];
// init the binary range to the current size of the already sorted index array
n1 = 0;
n2 = nn-1;
// binary search
while (n1 <= n2)
{
// compute the middle of the current range for dividing the current range into two parts
n = (n1 + n2 + 1)/2;
// get the item to compare
int i2 = array[idxArr[n]];
// compare both items
// if the left item is less we make the lower part current
if (i1 < i2)
n2 = n - 1;
// if the left item is greater or equal we make the upper part current
else
n1 = n + 1;
}
// at end of the previous loop n1 is the new position where the current item index (i)
// has to be inserted to get the index array sorted
// if this position is not outside the current size (that means we have not to change the order)
// we move all indices on the right side for one position using memmove
if (n1 < nn)
{
memmove(&idxArr[n1+1], &idxArr[n1], (nn-n1)*sizeof(int));
}
idxArr[n1] = i;
nn++;
}
return idxArr;
}
#define MAXX 100
#define MAXY 100
int main(int argc, char* argv[])
{
int matrix[MAXY][MAXX] = { 0 };
// read matrix from somewhere
if (readMatrix(matrix, ...))
{
int* array = (int*)matrix;
int size = MAXX*MAXY;
int* idxArr = sortArray(array, size);
// now you may store the index array to a file
// it is as big as the original image file (if the values to sort are integers)
writeSortedIndex(idxArr, ...);
// if you need the coordinates e. g. of the biggest value you may calculate
int idx = idxArr[size-1];
int x = idx % MAXX;
int y = idx / MAXX;
// then, you got the max value by
int maxInt = matrix[x][y];
}
}
I assumed that your values are integers.
Hope, that helps
Alex
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
thanks a lot Dhyanesh...i knew ans will be simple...but was not able to do it. sometimes u tend to forget basic things. Once again thanks a lot.