Intel® Integrated Performance Primitives
Deliberate problems developing high-performance vision, signal, security, and storage applications.
Announcements
The Intel sign-in experience has changed to support enhanced security controls. If you sign in, click here for more information.

FilterMinBorder/FilterMaxBorder

Cueppers__Norbert
283 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
283 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

Cueppers__Norbert
283 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

 

Hristov__Hristo
New Contributor I
283 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

 

Cueppers__Norbert
283 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

Valentin_K_Intel
Employee
283 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

Cueppers__Norbert
283 Views

Hi Valentin,

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

Best regards,
Norbert

Valentin_K_Intel
Employee
283 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

Reply