Я пишу оболочку 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;
}

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;
}

Источник: https://stackoverflow.com/questions/781 ... mage-doesn