sometimes you need not only to calculate the summary difference between two images, but also get (visualize) this difference.
Here is a ready SSE2 code snippet for the following transform:
byte out[8] = word image[8] - word previousImage[8] + fixed_offset
The difference can be small or even negative, so a fixed offset value is added. All calculation is done in 16-bit unsigned word values, saturated back to 8-bit unsigned result.
__m128i ofs = _mm_set1_epi16(offset);
__m128i zero = _mm_set1_epi8(0);
for each 16 bytes in line:
__m128i v1a = _mm_loadu_si128(image_line);
__m128i v1b = _mm_unpacklo_epi8(v1a, zero); // 16-bit high and low parts
v1a = _mm_unpackhi_epi8(v1a, zero);
__m128i v2a = _mm_loadu_si128(previousImage_line); // Same for another image line
__m128i v2b = _mm_unpacklo_epi8(v2a, zero);
v2a = _mm_unpackhi_epi8(v2a, zero);
It would be better if you add this code yourself. Join to the development of Simd Library at GitHub. If you have the wish I will give more information how to do this.
Ihar.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hello Ihar,
sometimes you need not only to calculate the summary difference between two images, but also get (visualize) this difference.
Here is a ready SSE2 code snippet for the following transform:
byte out[8] = word image[8] - word previousImage[8] + fixed_offset
The difference can be small or even negative, so a fixed offset value is added. All calculation is done in 16-bit unsigned word values, saturated back to 8-bit unsigned result.
__m128i ofs = _mm_set1_epi16(offset);
__m128i zero = _mm_set1_epi8(0);
for each 16 bytes in line:
__m128i v1a = _mm_loadu_si128(image_line);
__m128i v1b = _mm_unpacklo_epi8(v1a, zero); // 16-bit high and low parts
v1a = _mm_unpackhi_epi8(v1a, zero);
__m128i v2a = _mm_loadu_si128(previousImage_line); // Same for another image line
__m128i v2b = _mm_unpacklo_epi8(v2a, zero);
v2a = _mm_unpackhi_epi8(v2a, zero);
v1b = _mm_sub_epi16(_mm_add_epi16(v1b, ofs), v2b); // Add offset first, subtract ref.image
v1a = _mm_sub_epi16(_mm_add_epi16(v1a, ofs), v2a);
v1a = _mm_packus_epi16(v1b, v1a); // Contert to 8-bit with saturation
_mm_storeu_si128(result_line, v1a);
Feel free to use it if you decide to add that kind of algo to your lib.
Nikolai
Hello, Nikolai!
It would be better if you add this code yourself. Join to the development of Simd Library at GitHub. If you have the wish I will give more information how to do this.
Ihar.