background image

PRZETWARZANIE OBRAZÓW : Techniki programowania przy użyciu biblioteki CImg

I.

© P.Ślusarczyk

Strona 1 z 3

1.

Środowisko programistyczne

a. Dev-C++:

http://www.bloodshed.net/devcpp.html

b. Microsoft Visual C++ Express:

http://www.microsoft.com/visualstudio/eng/

c. CImg:

http://cimg.sourceforge.net/

i.

(wersja 1.2.7 dla Dev C++

ii.

wersja najnowsza dla Visual C++

d. ImageMagick:

http://www.imagemagick.org/script/index.php

2.

Konfiguracja projektu w środowisku DevC++

a. Utworzenie pustego projektu

'Empty Project'

b. Dołączenie biblioteki ‘libgdi32.a’ (biblioteka pakietu Dev-C++):

'Projekt->Opcje Projektu->Parametry->Konsolidator
->Dodaj Plik'

c. Wskazanie lokalizacji pliku ‘CImg.h’ jako katalogu plików nagłówkowych:

'Projekt->Opcje Projektu-> Pliki/Katalogi
-> Katalogi Plików Nagłówkowych'

3.

Konfiguracja projektu w środowisku Visual C++ 2012 Express

a. Utworzenie projektu typu: '

Win32 Console Application'

i.

W okienku '

Win32 Application Wizard'

wybranie zakładki

'

Application Settings'

ii.

W sekcji '

Application type'

należy wybrać

'Console

Application'

iii.

W sekcji '

Additional options'

należy wybrać

'Empty project'

b. Wskazanie lokalizacji pliku ‘CImg.h’ jako katalogu plików nagłówkowych:

'Project->Properties ...->Configuration Properties
->VC++ Directories->Include Directories'

c. Dodawanie plików do projektu:

Project->Add New Item ...

-> C++ File (.cpp)

d. Kompilacja:

'Build/Build Solution (F7)'

e. Uruchamianie:

'Debug/Start Without Debugging (Crtl-F5)'

1.

Przeanalizuj działanie poniższych programów:

Wydruk 1. Rozmycie obrazu

#include "CImg.h"
using namespace cimg_library;

int main()
{

CImg<unsigned char> image("lena.pgm");
image.display("Oryginał");
image.blur(2.5);
image.display("Rozmyty"); // UWAGA: Obraz jest normalizowany

return 0;

}

Wydruk 2. Rozmycie obrazu

#include "CImg.h"
using namespace cimg_library;

int main()
{

CImg<unsigned char> image("lena.pgm");
CImgDisplay original_disp(image,"Oryginał");
image.blur(2.5);

CImgDisplay transformed_disp(image,"Rozmyty",3);
while (!original_disp.is_closed || !transformed_disp.is_closed)

{}

return 0;

}

background image

PRZETWARZANIE OBRAZÓW : Techniki programowania przy użyciu biblioteki CImg

I.

© P.Ślusarczyk

Strona 2 z 3

Wydruk 3a. (Negatyw obrazu monochromatycznego - dla wersji 1.2.7. + Dev C++)

#include "CImg.h"
using namespace cimg_library;

int main()
{

CImg<unsigned char> image("lena.pgm");

// image(i,j) gdzie:  i - numer kolumny
//

j - numer wiersza

for(unsigned int i=0; i<image.dimx(); i++)

for(unsigned int j=0; j<image.dimy(); j++)

image(i,j)=255-image(i,j);

CImgDisplay im_display(image,"Negatyw",3);
while (!im_display.is_closed())

{}

return 0;

}

Wydruk 3a. (Negatyw obrazu monochromatycznego - dla wersji 1.4.9 + Visual C++)

#include

"CImg.h"

using namespace

cimg_library;

int

main()

{

CImg<

unsigned char

> image(

"lena.pgm"

);

// image(i,j) gdzie:

//     i - numer kolumny

//     j - numer wiersza

for

(

int

i=0; i<image.width(); i++)

for

(

int

j=0; j<image.height(); j++)

image(i,j)=255-image(i,j);

CImgDisplay im_display(image,

"Negatyw"

,3);

while

(!im_display.is_closed())

{}

return

0;

}

Wydruk 4a. (Odbicie lustrzane obrazu - dla wersji 1.2.7. + Dev C++)

#include "CImg.h"
using namespace cimg_library;

int main()
{

CImg<unsigned char> image("lena.pgm");
CImgDisplay orginal_disp(image,"Oryginał");

for(unsigned int i=0; i<image.dimx()/2; i++)

for(unsigned int j=0; j<image.dimy(); j++){

unsigned char temp = image(i,j);
image(i,j) = image(image.dimx()-i,j);
image(image.dimx()-i,j) = temp;

}

CImgDisplay transf_disp(image,"Odbicie lustrzane",3);
while (!orginal_disp.is_closed || !transf_disp.is_closed)

{}

return 0;

}

Wydruk 4b. (Odbicie lustrzane obrazu - dla wersji 1.4.9 + Visual C++)

#include

"CImg.h"

using namespace

cimg_library;

int

main()

{

CImg<

unsigned char

> image(

"lena.pgm"

);

CImgDisplay orginal_disp(image,

"Oryginał"

);

for

(

int

i=0; i<image.width()/2; i++)

for

(

int

j=0; j<image.height(); j++){

unsigned char

temp = image(i,j);

image(i,j) = image(image.width()-i,j);

image(image.width()-i,j) = temp;

}

CImgDisplay transf_disp(image,

"Odbicie lustrzane"

,3);

while

(!orginal_disp.is_closed() || !transf_disp.is_closed())

{}

return

0;

}

background image

PRZETWARZANIE OBRAZÓW : Techniki programowania przy użyciu biblioteki CImg

I.

© P.Ślusarczyk

Strona 3 z 3

Wydruk 5a. (Gradient - dla wersji 1.2.7. + Dev C++ )

#include "CImg.h"
using namespace cimg_library;

int main()
{

CImg<unsigned char> obraz(256,256,1); // monochromatyczny

for(unsigned int i=0; i<obraz.dimx(); i++)

for(unsigned int j=0; j<obraz.dimy(); j++)

obraz(i,j) = i;

CImgDisplay im_display(obraz,"Gradient",3);
while (!im_display.is_closed())

{}

return 0;

}

Wydruk 5b. (Gradient - dla wersji 1.4.9 + Visual C++))

#include

"CImg.h"

using namespace

cimg_library;

int

main()

{

CImg<

unsigned char

> obraz(256,256,1);

// monochromatyczny

for

(

int

i=0; i<obraz.width(); i++)

for

(

int

j=0; j<obraz.height(); j++)

obraz(i,j) = i;

CImgDisplay im_display(obraz,

"Gradient"

,3);

while

(!im_display.is_closed())

{}

return

0;

}

2.

Wyreguluj ustawienia obrazu monitora wykorzystując program z wydruku 5.

3.

Napisz programu generujący obraz złożony z 8,16 lub 32 pionowych pasów
o zwiększających się poziomach jasności od 0 do 255 (pasma Macha).

4.

Napisz program prezentujący zjawisko jednoczesnego kontrastu.