Рубрики

Поворот изображения на 90 градусов

Учитывая изображение, как вы повернете его на 90 градусов? Неясный вопрос Сверните браузер и попробуйте решение, прежде чем идти дальше.

Изображение можно рассматривать как 2D-матрицу, которая может быть сохранена в буфере. Нам предоставлены размеры матрицы и ее базовый адрес. Как мы можем повернуть это?

Например, см. Рисунок ниже,

* * * ^ * * *
* * * | * * *
* * * | * * *
* * * | * * *

После поворота вправо появляется (соблюдайте направление стрелки)

* * * *
* * * *
* * * *
-- - - >
* * * *
* * * *
* * * *

Идея проста. Преобразуйте каждую строку исходной матрицы в необходимый столбец конечного изображения. Мы будем использовать вспомогательный буфер для преобразования изображения.

Из приведенного выше рисунка мы можем наблюдать, что

first row of source ------> last column of destination
second row of source ------> last but-one column of destination
so ... on
last row of source ------> first column of destination

В наглядной форме мы можем представить приведенные выше преобразования матрицы (mxn) в матрицу (nxm),

Трансформации

Если вы не пытались, по крайней мере попробуйте свой псевдокод сейчас.

Будет легко написать наш псевдокод. В C / C ++ мы обычно просматриваем матрицу в главном порядке строк. Каждый ряд превращается в отдельный столбец конечного изображения. Нам нужно построить столбцы конечного изображения. Смотрите следующий алгоритм (преобразование)

for (r = 0; r < m; r++)
{
   for (c = 0; c < n; c++)
   {
      // Hint: Map each source element indices into
      // indices of destination matrix element.
       dest_buffer [ c ] [ m - r - 1 ] = source_buffer [ r ] [ c ];
   }
}

Обратите внимание, что существуют различные способы реализации алгоритма, основанные на обходе матрицы, основного ряда или основного порядка столбцов. У нас есть две матрицы и два способа (основной ряд и столбец), чтобы пройти каждую матрицу. Следовательно, может быть по крайней мере 4 различных способа преобразования исходной матрицы в конечную матрицу.

C ++

// C ++ программа для включения
// изображение на 90 градусов
#include <bits/stdc++.h>

using namespace std;

void displayMatrix(unsigned int const *p, 

                    unsigned int row, 

                   unsigned int col); 

                      

void rotate(unsigned int *pS, 

            unsigned int *pD, 

            unsigned int row, 

            unsigned int col); 

              

void displayMatrix(unsigned int const *p, 

                   unsigned int r, 

                   unsigned int c) 

    unsigned int row, col; 

    cout << "\n\n"

  

    for (row = 0; row < r; row++) 

    

        for (col = 0; col < c; col++) 

            cout << * (p + row * c + col) << "\t"

        cout << "\n"

    

  

    cout << "\n\n"

  

void rotate(unsigned int *pS, 

            unsigned int *pD, 

            unsigned int row, 

            unsigned int col) 

    unsigned int r, c; 

    for (r = 0; r < row; r++) 

    

        for (c = 0; c < col; c++) 

        

            *(pD + c * row + (row - r - 1)) = 

                        *(pS + r * col + c); 

        

    

  
// Код драйвера

int main() 

      

    // объявления

    unsigned int image[][4] = {{1, 2, 3, 4}, 

                               {5, 6, 7, 8}, 

                               {9, 10, 11, 12}}; 

    unsigned int *pSource; 

    unsigned int *pDestination; 

    unsigned int m, n; 

  

    // установка начальных значений

    // и выделение памяти

    m = 3, n = 4, pSource = (unsigned int *)image; 

    pDestination = (unsigned int *)malloc

                   (sizeof(int) * m * n); 

  

    // обрабатываем каждый буфер

    displayMatrix(pSource, m, n); 

  

    rotate(pSource, pDestination, m, n); 

  

    displayMatrix(pDestination, n, m); 

  

    free(pDestination); 

  

    return 0; 

  
// Этот код предоставлен rathbhupendra

С

// C программа для поворота
// изображение на 90 градусов
#include <stdio.h>
#include <stdlib.h>

  

void displayMatrix(unsigned int const *p, 

                   unsigned int row, 

                   unsigned int col);

                     

void rotate(unsigned int *pS, 

            unsigned int *pD, 

            unsigned int row, 

            unsigned int col);

              

void displayMatrix(unsigned int const *p, 

                   unsigned int r, 

                   unsigned int c) 

{

    unsigned int row, col;

    printf("\n\n");

  

    for (row = 0; row < r; row++)

    {

        for (col = 0; col < c; col++)

            printf("%d\t", * (p + row * c + col));

        printf("\n");

    }

  

    printf("\n\n");

}

  

void rotate(unsigned int *pS, 

            unsigned int *pD,

            unsigned int row, 

            unsigned int col)

{

    unsigned int r, c;

    for (r = 0; r < row; r++)

    {

        for (c = 0; c < col; c++)

        {

            *(pD + c * row + (row - r - 1)) = 

                            *(pS + r * col + c);

        }

    }

}

  
// Код драйвера

int main()

{

      

    // объявления

    unsigned int image[][4] = {{1,2,3,4}, 

                               {5,6,7,8},

                               {9,10,11,12}};

    unsigned int *pSource;

    unsigned int *pDestination;

    unsigned int m, n;

  

    // установка начальных значений

    // и выделение памяти

    m = 3, n = 4, pSource = (unsigned int *)image;

    pDestination = 

        (unsigned int *)malloc 

        (sizeof(int) * m * n);

  

    // обрабатываем каждый буфер

    displayMatrix(pSource, m, n);

  

    rotate(pSource, pDestination, m, n);

  

    displayMatrix(pDestination, n, m);

  

    free(pDestination);

  

    getchar();

    return 0;

}

Выход :



1    2    3    4    
5    6    7    8    
9    10    11    12    




9    5    1    
10    6    2    
11    7    3    
12    8    4    



На месте повернуть квадратную матрицу на 90 градусов

Составлено Venki . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Поворот изображения на 90 градусов

0.00 (0%) 0 votes