C# Wrapper для IPP (примитив производительности Intel) для повышения резкости изображения не работаетC#

Место общения программистов C#
Ответить
Гость
 C# Wrapper для IPP (примитив производительности Intel) для повышения резкости изображения не работает

Сообщение Гость »


Я пишу оболочку 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;
}
Изображение



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

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»