Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Porównanie obrazków

Ostatnio zmodyfikowano 2015-06-30 18:06
Autor Wiadomość
kanarinios
Temat założony przez niniejszego użytkownika
Porównanie obrazków
» 2015-06-29 21:52:04
Witam,
mam problem z zadaniem, w którym muszę porównać dwa obrazki w formacie ppm i sprawdzić czy jeden zawiera się w drugim i jeśli tak to program ma wycinać fragment wiekszego z obrazków który jest taki sam z mniejszym i zapisywać  w nowym pliku.
Liczy się każda wskazówka i pomoc, gdyż nie wiem jak się zbytnio zabrać za funkcję którą mam stworzyć do porównywania i wycinania.
Z góry dzięki za pomoc

udało mi się skonstruować taką funkcję do porównania dwóch obrazków, jednak nie jestem pewien czy dobrze:
C/C++
#include<iostream>
#include<cstdlib>
#include<fstream>
#include<string>

using namespace std;

int zdjecie1[ 500 ][ 500 ][ 3 ];
int zdjecie2[ 500 ][ 500 ][ 3 ];
int wyciecie[ 500 ][ 500 ][ 3 ];

void pp( int zdjecie1[ 500 ][ 500 ][ 3 ], int zdjecie2[ 500 ][ 500 ][ 3 ], int wyciecie[ 500 ][ 500 ][ 3 ], int kolor )
{
    for( int m = 0; m < 500; m++ )
    {
        for( int j = 0; j < 500; j++ )
        {
            for( int k = 0; k < kolor; k++ )
            {
                bool zp = 0;
                for( int e = 0; e < 500; e++ )
                {
                    for( int w = 0; w < 500; w++ )
                    {
                        for( int q = 0; q < kolor; q++ )
                        if( zdjecie1[ 500 ][ 500 ][ 3 ] == zdjecie2[ 500 ][ 500 ][ 3 ] )
                             zp = 1;
                       
                    }
                }
                if( zp == 0 )
                     zdjecie1[ 500 ][ 500 ][ 3 ] = 0;
                else( zp == 1 );
               
                zdjecie1[ 500 ][ 500 ][ 3 ] = wyciecie[ 500 ][ 500 ][ 3 ];
            }
        }
    }
}



int main()
{
    string imie_obrazka;
    string imie_obrazka2;
    string zapis_obrazka;
    cout << "Krzysztof Kanarek\nEnergetyka i Chemia Jadrowa\nnr. indeksu:366263\nProgram zaliczeniowy" << endl;
    cout << "Podaj nazwe pliku z ktorego bedzie wczytywany wiekszy obrazek: " << endl;
    cin >> imie_obrazka;
   
    cout << "Podaj nazwe pliku z ktorego bedzie wczytywany mniejszy obrazek: " << endl;
    cin >> imie_obrazka2;
   
    ifstream wejscie( imie_obrazka.c_str() );
    if( !wejscie.is_open() )
    {
        cout << "Plik nie istnieje w tym folderze" << endl;
        return 0;
    }
   
    ifstream wejscie1( imie_obrazka2.c_str() );
    if( !wejscie1.is_open() )
    {
        cout << "Plik nie istnieje w tym folderze" << endl;
        return 0;
    }
   
    /* if(strcmp(zdjecie1,zdjecie2)==1)
          cout<<"Wszystko jest ok";
         else(strcmp(zdjecie1,zdjecie2)==-1)
          {
      cout<<"blad!!!!!";
          return 0;
          }*/
   
   
    cout << "Podaj nowa nazwe" << endl;
    cin >> zapis_obrazka;
    ofstream wyjscie( zapis_obrazka.c_str() );
   
    string typ;
    wejscie >> typ;
    wejscie1 >> typ;
   
    int xw, yw, zk, xw1, yw2, zk3;
    int kolor;
   
    wejscie >> xw;
    wejscie >> yw;
    wejscie >> zk;
   
    wejscie1 >> xw1;
    wejscie1 >> yw2;
    wejscie1 >> zk3;
   
   
    if( typ == "P2" )
    {
        kolor = 1;
    }
    else if( typ == "P3" )
    {
        kolor = 3;
    }
   
   
    for( int x = 0; x < xw; ++x )
    {
        for( int y = 0; y < yw; ++y )
        {
            for( int k = 0; k < kolor; k++ )
            {
                int pamiec;
                wejscie >> pamiec;
                zdjecie1[ x ][ y ][ k ] = pamiec;
            }
        }
    }
    for( int x = 0; x < xw; ++x )
    {
        for( int y = 0; y < yw; ++y )
        {
            for( int k = 0; k < kolor; k++ )
            {
                int pamiec1;
                wejscie1 >> pamiec1;
                zdjecie2[ x ][ y ][ k ] = pamiec1;
            }
        }
    }
   
   
    pp( zdjecie1, zdjecie2, wyciecie, kolor );
    //wyjscie<<typ<<endl;
    //wyjscie<<kr*l<<" "<<wr*l<<endl;
    //wyjscie<<zk<<endl;
   
    /* for(int y=0;y<wr*l;y++)
    {
    for(int x=0;x<kr*l;x++)
    {
    for(int k=0;k<kolor;k++)
    {
   
    wyjscie<<tab3[x][y][k]<<" ";
   
    }
    }
    }*/
   
    wejscie.close();
    wejscie1.close();
    wyjscie.close();
    return 0;
   
}

Ostatecznie wymyśliłem coś takiego ale byłbym wdzięczny za jakieś wskazówki gdyż program się kompiluje ale nie ma oczekiwanych efektów
P-134172
darko202
» 2015-06-30 12:29:13
The portable pixmap format PPM
PPM RAWBITS is three bytes per pixel


Nigdy nie zajmowałem się plikami ppm, ale myślę, że
1.
powinieneś zacząć od rozczytania formatu zapisu takiego pliku.
np.
https://pl.wikipedia.org/wiki​/Portable_anymap#Opis_formatu
zastanawiło mnie :
* Linie nie powinny być dłuższe niż 70 znaków
jak więc są zapisywane dłuższe linie ?

to może rozstrzygnąć czy wczytywanie pliku do tablicy np.
int zdjecie1[ 500 ][ 500 ][ 3 ];
jak leci kolejnych znaków jest poprawne (do sprawdzenia)

http://netpbm.sourceforge.net​/doc/ppm.html

poszukaj powinny być dokładne opisy pozwalające na zrozumienie formatu PPM
https://github.com/pbsds​/hatena-server/wiki/PPM-format
zbadaj budowę takiego pliku na przykładzie


2.
jeśli założymy że mamy już obraz zapisany w int tab[ i ][ j ][ k ]
*
"fragment jest w drugim" - szukasz jednakowego ciągu w linii szerokości, ale potem sprawdzasz zgodność w wysokości i głębokości (aż znajdziesz identyczny prostopadłościan)  


*
int zdjecie1[ 500 ][ 500 ][ 3 ];
int zdjecie2[ 500 ][ 500 ][ 3 ]; ( dziwne bo jeden obraz powinien być mniejszy)

oczywiście możemy sprawdzić czy wszystkie bity obu obrazów są jednakowe
ale nie o to chodzi w zadaniu "fragment jest w drugim"


*
operacja if( zdjecie1[ 500 ][ 500 ][ 3 ] == zdjecie2[ 500 ][ 500 ][ 3 ] )
nie jest operacją która się powiedzie
chyba chodziło Ci o zdjecie1[ i1 ][ j1 ][ k ] == zdjecie1[ i2 ][ j2 ][ k ]


podsumowując
- ustal jak wygląda format PPM i jak go poprawnie wczytać
- popraw zaprezentowany algorytm (logika postępowania)
- dodaj do niego komentarz - choćby dla siebie
- trzymaj się tych komentarzy
  * robię to
  * sprawdzam czy faktycznie

sprawdzenie - cały program nie działa (to co zaprezentowałeś) jest niepoważne

Powodzenia :)


 


P-134182
notabigthreat
tylko sugestie
» 2015-06-30 18:06:16
C/C++
typedef int piksel[ 3 ]; //czy też coś podobnego

Tablice:
C/C++
piksel zdjecie1[ wysokosc1 ][ szerokosc1 ];
piksel zdjecie2[ wysokosc2 ][ szerokosc2 ];

Poszukaj pierwszego wiersza szukanego obrazka.
Szukamy tu pierwszego wiersza zdjecie2 w zdjecie1.

C/C++
bool czy_identyczne( piksel a, piksel b )
{
    //są równe, jeśli zgadzają się ich zerowe, pierwsze i drugie elementy
}

C/C++
piksel * wynik = zdjecie1;
do
{
    //poprawcie mnie, jeśli się mylę co do tych tablic
    wynik = std::search( wynik, & zdjecie1[ wysokosc1 - 1 ][ wysokosc1 ],
    zdjecie2, & zdjecie2[ 0 ][ szerokosc2 ], czy_identyczne );
   
    if( wynik == & zdjecie1[ wysokosc1 - 1 ][ wysokosc1 ] )
    {
        //nie zawiera sie
    }
} while( !(( /*  *wynik i *(wynik+szerokosc1) leżą w tym samym rzędzie  */ ) &&( /*reszta obrazka sie zgadza*/ ) ) );


Kod pisany z głowy, nie ręczę.
P-134190
« 1 »
  Strona 1 z 1