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: 𝑱𝒘 (𝒙, 𝒚) = |𝑱(𝒙, 𝒚) − 𝑱(𝒙 + 𝟏, 𝒚 + 𝟏)| + |𝑱(𝒙 + 𝟏, 𝒚) − 𝑱(𝒙, 𝒚 + 𝟏)|