Przetwarzanie obrazów

Transkrypt

Przetwarzanie obrazów
Przetwarzanie obrazów
W oparciu o przykładowy projekt (MMX8) opracować program realizujący podstawowe operacje
przetwarzania obrazu (inwersja kolorów, zmiana jasności, progowanie, wykrywanie krawędzi).
Na ocenę 3
 Poprawić funkcję void TestFeatures(bool* pbMMX, bool* pbSSE, bool* pbSSE2 )
tak, aby sprawdzała czy procesor wspiera zestaw instrukcji SSE2 (MMX_SSESupport.h).
 Napisać następujące funkcje umożliwiające inwersję koloru (Img8Operations.cpp):
• W „czystym” C++:
void CImg8Operations::InvertImageCPlusPlus(
•
BYTE* pSource,
BYTE* pDest,
int nNumberOfPixels)
Z wykorzystaniem instrukcji MMX:
void CImg8Operations::InvertImageC_MMX( BYTE* pSource,
BYTE* pDest,
int nNumberOfPixels)
•
Z wykorzystaniem instrukcji SSE2:
void CImg8Operations::InvertImageC_SSE2( BYTE* pSource,
BYTE* pDest,
int nNumberOfPixels)
Inwersja koloru piksela realizowana jest według wzoru:
𝑱𝒘 (𝒙, 𝒚) = 𝟐𝟓𝟓 − 𝑱(𝒙, 𝒚)
gdzie Jw(x,y) – nowa wartość piksela, J(x,y) – początkowa wartość piksela.
 Napisać następujące funkcje umożliwiające zmianę jasności obrazu (Img8Operations.cpp):
• W „czystym” C++:
void CImg8Operations::ChangeBrightnessCPlusPlus(BYTE* pSource,
BYTE* pDest,
int nNumberOfPixels,
int nChange)
•
Z wykorzystaniem instrukcji MMX:
void CImg8Operations::ChangeBrightnessC_MMX(
•
BYTE* pSource,
BYTE* pDest,
int nNumberOfPixels,
int nChange)
Z wykorzystaniem instrukcji SSE2:
void CImg8Operations::ChangeBrightnessC_SSE2( BYTE* pSource,
BYTE* pDest,
int nNumberOfPixels,
int nChange)
Zmiana jasności piksela realizowana jest według wzoru:
𝑱𝒘 (𝒙, 𝒚) = 𝑱(𝒙, 𝒚) + 𝒃
gdzie Jw(x,y) – nowa wartość piksela, J(x,y) – początkowa wartość piksela, b – wartość o którą
zmieniamy jasność obrazu.
Na ocenę 4
 Napisać następujące funkcje realizujące operację progowania obrazu (Img8Operations.cpp):
• W „czystym” C++:
void CImg8Operations::PerformThresholdingCPlusPlus(BYTE* pSource,
BYTE* pDest,
int nNumberOfPixels,
int nThreshold)
•
Z wykorzystaniem instrukcji MMX:
void CImg8Operations::PerformThresholdingC_MMX(BYTE* pSource,
BYTE* pDest,
int nNumberOfPixels,
int nThreshold)
•
Z wykorzystaniem instrukcji SSE2:
void CImg8Operations::PerformThresholdingC_SSE2(BYTE* pSource,
BYTE* pDest,
int nNumberOfPixels,
int nThreshold)
Operacja progowania realizowana jest według wzoru:
𝟐𝟓𝟓,
𝑱(𝒙, 𝒚) ≥ 𝒕
𝑱𝒘 (𝒙, 𝒚) = �
𝟎,
𝑱(𝒙, 𝒚) < 𝑡
gdzie Jw(x,y) – nowa wartość piksela, J(x,y) – początkowa wartość piksela, t – próg.
Na ocenę 5
 Rozszerzyć program poprzez dodanie 3 dodatkowych opcji menu umożliwiających wykrywanie
krawędzi za pomocą operatora Robertsa (napisane w „czystym” C++, z wykorzystanie instrukcji
MMX i SSE2).
Wartość piksela po zastosowaniu operatora Robertsa wyraża się wzorem:
𝑱𝒘 (𝒙, 𝒚) = |𝑱(𝒙, 𝒚) − 𝑱(𝒙 + 𝟏, 𝒚 + 𝟏)| + |𝑱(𝒙 + 𝟏, 𝒚) − 𝑱(𝒙, 𝒚 + 𝟏)|