2016-03-29 12 views
0

Bu soruna yanıt vermek için bir kod yazdım.Flatindexed 2D dizisi - görüntüyü dikey/yatay olarak çevirme

X11 kullanarak gri ölçekli bir görüntü çizmek için bir program verdim.

Görüntüyü yatay/dikey olarak çevirmek için bir işlev yazmam istendi.

İşte olan yaşıyorum sorun benim yatay fonksiyon diğer yarısı özgün değerlerini korur, görüntüyü sadece yarı yolda çevirir olmasıdır benim kod parçacığı

// flip the image, left-to-right, like in a mirror. 
void flip_horizontal(uint8_t array[], 
       unsigned int cols, 
       unsigned int rows) 
{ 

    int i; 
    int j; 
    for (i=0; i<rows;i++) 
    { 
    for (j=0; j<cols;j++) 
     { 
     array[rows*i+j]=array[rows*i+(cols-1-j)]; 
     } 
    } 
} 

// flip the image top-to-bottom. 
void flip_vertical(uint8_t array[], 
      unsigned int cols, 
      unsigned int rows) 
{ 

int i=0; 
int j=0; 
    for (i=0; i<rows;i++) 
    { 
    for (j=0; j<cols;j++) 
     { 
     array[rows*i+j]=array[rows*(rows-1-i)+j]; 
     } 
    } 
    return; 
} 

olduğunu.

Dikey çevirme işlevim de bir karmaşadır ve üretilen görüntü hiç gerekmediği gibi görünmüyor, bu nedenle işlevleri yazmak için mantıkta bir hata yaptığım yerde hata ayıklamaya çalışıyorum.

2D dizi değerlerine erişmek için düz dizin yöntemini kullanıyorum.

+0

C '=', "takas" anlamına gelmez. Ve yapsa bile, klasik "kelimeyi tersine çevir" diyerek, harfleri değiştirip tekrar takas yapabildin. –

+0

Düz dizin: 'dizi [satırlar * i + j]' -> dizi [cols * i + j] ' –

cevap

-1
static uint8_t temp; 

void flip_horizontal(uint8_t array[], 
       unsigned int cols, 
       unsigned int rows) 
{ 

    int i; 
    int j; 
    for (i=0; i<rows/2;i++) 
    { 
    for (j=0; j<cols;j++) 
     { 
     temp=array[rows*i+j]; 
     array[rows*i+j]=array[rows*i+(cols-1-j)]; 
     array[rows*i+(cols-1-j)]=temp; 
     } 
    } 
} 

// flip the image top-to-bottom. 
void flip_vertical(uint8_t array[], 
      unsigned int cols, 
      unsigned int rows) 
{ 

int i=0; 
int j=0; 
    for (i=0; i<rows;i++) 
    { 
    for (j=0; j<cols/2;j++) 
     { 
     temp=array[rows*i+j]; 
     array[rows*i+j]=array[rows*(rows-1-i)+j]; 
     array[rows*(rows-1-i)+j]=temp; 
     } 
    } 
    return; 
} 

Bu kod verimliliği iyileştirme çok duramazdı, ama temelde ne yaptım sen takas işlemlerini yapmak kaç kez yarıya iner ve ben takas işlemi sırasında verileri tutmak için geçici bir değişken sunduk.

+0

Düz dizinleme hatasını düzeltmediniz:' array [satırlar * i + j] '-> 'dizi' [sütunlar i + j *] –

2

Yatay çevirme işleminde, iç döngü tüm sütunlardan geçer ve piksele yansıtılmış değerini atar. En soldaki pikselin 100 olduğunu ve en sağdakiin 23 olduğunu söyleyelim. Bir adımdan sonra, en sol 23 olur. Şimdi en sağdaki noktaya geldiğinde, en soldaki olana bakmaya çalışır ve viyola, tekrar 23 alırsınız. 100 değeri zaten kayıp. Bu yüzden resmin sağ yarısı değişmeyecek.

Dikey kapakta aynı sorun.

Ayrıca, sorunları dizine ekliyorsunuz. kodun sütun sayısı ve satır satır sayısı anlamına geldiğini varsayalım. Görüntünün satır-ana saklandığı varsayılırsa, düz dizideki düzen, okuma sırasındaki satır gibi satırdır, sonra satırdaki i ve sütun j'deki piksel, cols * i + j, satır yerine * i + j. Kesintisiz olarak, cols, sütun sayısıdır ve aynı zamanda bir satırın boyutudur. Mutlu hata ayıklama :)