Я пишу оболочку C# для API фильтра повышения резкости IPP, чтобы улучшить 16-битное изображение в оттенках серого. Результат не такой, как ожидалось.
Поскольку ipp не предоставляет API Sharpen Filter для беззнаковых 16-битных разрядностей, я конвертирую его в плавающий.
Я попытались передать массив байтов и массив ushort. Я подозреваю, что размер шага, который я передаю, неправильный, но я не могу точно указать, где это идет не так.
public ushort[] ApplySharpenFilter(byte[] inputImage, int width, int height)
{
var uInputImage = ConvertToUshort(inputImage);
var roiSize = new IppiSize(width, height);
var status = ippiFilterSharpenBorderGetBufferSize(roiSize, IppiMaskSize.ippMskSize3x3, IppDataType.ipp32f,
IppDataType.ipp32f, 1, out var iBufSize);
var pBuffer = ippiMalloc_8u_C1(width, height, out var stepSize);
var pBuff32F = new float[width * height];
status = ippiConvert_16u32f_C1R(uInputImage, width, pBuff32F, width * 2, roiSize);
status = ippiFilterSharpenBorder_32f_C1R(pBuff32F, width * 2, pBuff32F, width * 2, roiSize,
IppiMaskSize.ippMskSize3x3, IppiBorderType.ippBorderInMem, 0, pBuffer);
status = ippiConvert_32f16u_C1R(pBuff32F, width * 2, uInputImage, width , roiSize, 16);
ippFree(pBuffer);
return uInputImage;
}
private static ushort[] ConvertToUshort(byte[] inputImage)
{
var output = new ushort[inputImage.Length / 2]; // every ushort is 2 bytes
Buffer.BlockCopy(inputImage, 0, output, 0, inputImage.Length);
return output;
}
As you can see, the filter is being applied only to the top half of the image and it's distorted probably due to step size.
I have modified the stepsize for float as below:
public ushort[] ApplySharpenFilter(byte[] inputImage, int width, int height)
{
var uInputImage = ConvertToUshort(inputImage);
var roiSize = new IppiSize(width, height);
var status = ippiFilterSharpenBorderGetBufferSize(roiSize, IppiMaskSize.ippMskSize3x3, IppDataType.ipp32f,
IppDataType.ipp32f, 1, out var iBufSize);
var pBuffer = ippiMalloc_8u_C1(width, height, out var stepSize);
var pBuff32F = new float[width * height];
status = ippiConvert_16u32f_C1R(uInputImage, width * 2, pBuff32F, width * 4, roiSize);
status = ippiFilterSharpenBorder_32f_C1R(pBuff32F, width * 4, pBuff32F, width * 4, roiSize,
IppiMaskSize.ippMskSize3x3, IppiBorderType.ippBorderInMem, 0, pBuffer);
var result = new ushort[1024 * 1024];
status = ippiConvert_32f16u_C1R(pBuff32F, width * 4, result, width * 2, roiSize, 16);
ippFree(pBuffer);
return result;
}
Я пишу оболочку C# для API фильтра повышения резкости IPP, чтобы улучшить 16-битное изображение в оттенках серого. Результат не такой, как ожидалось. Поскольку ipp не предоставляет API Sharpen Filter для беззнаковых 16-битных разрядностей, я конвертирую его в плавающий. Я попытались передать массив байтов и массив ushort. Я подозреваю, что размер шага, который я передаю, неправильный, но я не могу точно указать, где это идет не так. [code]public ushort[] ApplySharpenFilter(byte[] inputImage, int width, int height) { var uInputImage = ConvertToUshort(inputImage); var roiSize = new IppiSize(width, height);
var status = ippiFilterSharpenBorderGetBufferSize(roiSize, IppiMaskSize.ippMskSize3x3, IppDataType.ipp32f, IppDataType.ipp32f, 1, out var iBufSize); var pBuffer = ippiMalloc_8u_C1(width, height, out var stepSize);
var pBuff32F = new float[width * height]; status = ippiConvert_16u32f_C1R(uInputImage, width, pBuff32F, width * 2, roiSize);
private static ushort[] ConvertToUshort(byte[] inputImage) { var output = new ushort[inputImage.Length / 2]; // every ushort is 2 bytes Buffer.BlockCopy(inputImage, 0, output, 0, inputImage.Length);
return output; } [/code] As you can see, the filter is being applied only to the top half of the image and it's distorted probably due to step size. [img]https://i.stack.imgur.com/5Zgtt.png[/img] I have modified the stepsize for float as below: [code]public ushort[] ApplySharpenFilter(byte[] inputImage, int width, int height) { var uInputImage = ConvertToUshort(inputImage); var roiSize = new IppiSize(width, height);
var status = ippiFilterSharpenBorderGetBufferSize(roiSize, IppiMaskSize.ippMskSize3x3, IppDataType.ipp32f, IppDataType.ipp32f, 1, out var iBufSize); var pBuffer = ippiMalloc_8u_C1(width, height, out var stepSize);
var pBuff32F = new float[width * height]; status = ippiConvert_16u32f_C1R(uInputImage, width * 2, pBuff32F, width * 4, roiSize);