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;
}
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;
}
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.