Intel® Integrated Performance Primitives
Deliberate problems developing high-performance vision, signal, security, and storage applications.

FilterMinBorder/FilterMaxBorder

Cueppers__Norbert
722 Views

Hi all,

I get different results if I use the in-place flavor of the ippiFilterMinBorder/ippiFilterMaxBorder functions (pSrc is equal to pDst) compared to the not-in-place variants.

I observe some "artifacts" especially near the border. Can someone confirm this?

I'm using IPP 2017 Update 2.

Many thanks and best regards,

Norbert

0 Kudos
7 Replies
Valentin_K_Intel
Employee
722 Views

Hi Norbert,

What function flavor do you use? Could you please provide the machine parameters and the code example that reproduces the issue?

Best regards,
​Valentin

0 Kudos
Cueppers__Norbert
722 Views

Hi Valentin,

I use the x64 single-threaded static libraries on Win 7. Processor is Core i5 -2400.

Below is a short example compiled with VS 2015. I create a white-black image and apply the max. filter, first not-in-place and then in-place. At the end I count the # of white pixels in both result images. The counters are different:

#include <stdio.h>
#include "ipp.h"

#define WIDTH 128
#define HEIGHT 128

int main()
{
 IppStatus status = ippStsNoErr;
 Ipp8u* pSrc = nullptr, *pDst = nullptr;
 int srcStep = 0, dstStep = 0;
 IppiSize fullRoiSize = {WIDTH, HEIGHT};
 IppiSize halfRoiSize = {WIDTH, HEIGHT / 2};
 Ipp8u *pBuffer = nullptr;
 int iTmpBufSize = 0;
 IppiBorderType borderType = ippBorderRepl; // replicate border
 Ipp8u borderValue = 0;
 IppiSize maskSize = {3, 3};

 pSrc = ippiMalloc_8u_C1 (fullRoiSize.width, fullRoiSize.height, &srcStep);
 pDst = ippiMalloc_8u_C1 (fullRoiSize.width, fullRoiSize.height, &dstStep);

 // Set top half of image to white
 ippiSet_8u_C1R (255, pSrc, srcStep, halfRoiSize);
 // Set bottom half of image to black
 ippiSet_8u_C1R (0, pSrc + halfRoiSize.height * srcStep, srcStep, halfRoiSize);

 status = ippiFilterMaxBorderGetBufferSize (fullRoiSize, maskSize, ipp8u, 1, &iTmpBufSize);

 pBuffer = ippsMalloc_8u (iTmpBufSize);

 // Not-in-place
 status = ippiFilterMaxBorder_8u_C1R (pSrc, srcStep, pDst, dstStep, fullRoiSize, maskSize, borderType, borderValue, pBuffer);
 // In-place
 status = ippiFilterMaxBorder_8u_C1R (pSrc, srcStep, pSrc, srcStep, fullRoiSize, maskSize, borderType, borderValue, pBuffer);

 // Count white pixels
 int cntNIP = 0; // # pixels of not-in-place flavor
 int cntIP = 0; // # pixels of in-place flavor
 ippiCountInRange_8u_C1R (pDst, dstStep, fullRoiSize, &cntNIP, 254, 255);
 ippiCountInRange_8u_C1R (pSrc, srcStep, fullRoiSize, &cntIP, 254, 255);

 ippsFree (pBuffer);
 ippiFree (pSrc);
 ippiFree (pDst);

 printf ("# pixels not-in-place: %d\n", cntNIP);
 printf ("# pixels in-place: %d\n", cntIP);

 getchar ();

 return status;
}

 

Output:
# pixels not-in-place: 8320
# pixels in-place: 8322

Best regards,
Norbert

 

0 Kudos
Hristov__Hristo
New Contributor I
722 Views

On Linux x64 dynamically linked, version 9.0.3 , processor i7-X980 , I have exactly the same behaviour:

# pixels not-in-place: 8320
# pixels in-place: 8322

 

0 Kudos
Cueppers__Norbert
722 Views

I get the same behaviour if I replace ippiFilterMaxBorder_8u_C1R by ippiDilateBorder_8u_C1R in the above example with all values of the structuring element (mask) set to 1. The mask is passed to ippiMorphologyBorderInit before calling the dilate function.

Best regards,

Norbert

0 Kudos
Valentin_K_Intel
Employee
722 Views

Hi Norbert,

Thank you for the information! You used the function without the descriptor "I" for in-place operation. It is not guaranteed that a function without "I" descriptor works correctly for in-place operation, IPP function is intended to work in not-in-place mode by default. So I do not recommend using a function without "I" descriptor for in-place operations.

Best regards,
​Valentin

0 Kudos
Cueppers__Norbert
722 Views

Hi Valentin,

thanks for your reply. But I cannot find the appropriate function "ippiFilterMaxBorder_8u_C1IR" in the header files.

Best regards,
Norbert

0 Kudos
Valentin_K_Intel
Employee
722 Views

The in-place variant of the functions ippiFilterMaxBorder_8u_C1R is absent in IPP 2017 Update 2. You can submit an application via Intel(R) Premier Support to request this functionality.

Best regards,
​Valentin

0 Kudos
Reply