gpt4 book ai didi

c# - 正确执行双三次重采样

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:42:19 26 4
gpt4 key购买 nike

我一直在试验 AForge 框架中的图像双三次重采样算法,希望在我的图像处理解决方案中引入类似的东西。见算法原here和插值内核 here

不幸的是我碰壁了。在我看来,我似乎以某种方式错误地计算了样本目标位置,这可能是由于算法是为 Format24bppRgb 图像设计的,而我使用的是 Format32bppPArgb 格式。

这是我的代码:

public Bitmap Resize(Bitmap source, int width, int height)
{
int sourceWidth = source.Width;
int sourceHeight = source.Height;

Bitmap destination = new Bitmap(width, height, PixelFormat.Format32bppPArgb);
destination.SetResolution(source.HorizontalResolution, source.VerticalResolution);

using (FastBitmap sourceBitmap = new FastBitmap(source))
{
using (FastBitmap destinationBitmap = new FastBitmap(destination))
{
double heightFactor = sourceWidth / (double)width;
double widthFactor = sourceHeight / (double)height;

// Coordinates of source points
double ox, oy, dx, dy, k1, k2;
int ox1, oy1, ox2, oy2;

// Width and height decreased by 1
int maxHeight = height - 1;
int maxWidth = width - 1;

for (int y = 0; y < height; y++)
{
// Y coordinates
oy = (y * widthFactor) - 0.5;

oy1 = (int)oy;
dy = oy - oy1;

for (int x = 0; x < width; x++)
{
// X coordinates
ox = (x * heightFactor) - 0.5f;
ox1 = (int)ox;
dx = ox - ox1;

// Destination color components
double r = 0;
double g = 0;
double b = 0;
double a = 0;

for (int n = -1; n < 3; n++)
{
// Get Y cooefficient
k1 = Interpolation.BiCubicKernel(dy - n);

oy2 = oy1 + n;
if (oy2 < 0)
{
oy2 = 0;
}

if (oy2 > maxHeight)
{
oy2 = maxHeight;
}

for (int m = -1; m < 3; m++)
{
// Get X cooefficient
k2 = k1 * Interpolation.BiCubicKernel(m - dx);

ox2 = ox1 + m;
if (ox2 < 0)
{
ox2 = 0;
}

if (ox2 > maxWidth)
{
ox2 = maxWidth;
}

Color color = sourceBitmap.GetPixel(ox2, oy2);

r += k2 * color.R;
g += k2 * color.G;
b += k2 * color.B;
a += k2 * color.A;
}
}

destinationBitmap.SetPixel(
x,
y,
Color.FromArgb(a.ToByte(), r.ToByte(), g.ToByte(), b.ToByte()));
}
}

}
}

source.Dispose();
return destination;
}

内核应表示 Wikipedia 上的给定方程式

public static double BiCubicKernel(double x)
{
if (x < 0)
{
x = -x;
}

double bicubicCoef = 0;

if (x <= 1)
{
bicubicCoef = (1.5 * x - 2.5) * x * x + 1;
}
else if (x < 2)
{
bicubicCoef = ((-0.5 * x + 2.5) * x - 4) * x + 2;
}

return bicubicCoef;
}

这是 500 像素 x 667 像素的原始图像。

picture of a tree

并将图像调整为 400px x 543px。

tree with bicubic algorithm applied

从视觉上看,图像似乎被过度缩小,然后一旦我们击中特定点,就会重复应用相同的像素。

谁能给我一些建议来解决这个问题?

注意 FastBitmap 是位图的包装器,它使用 LockBits 来操作内存中的像素。它适用于 everything else我将它应用到。

编辑

根据要求,这是ToByte

中涉及的方法
public static byte ToByte(this double value)
{
return Convert.ToByte(ImageMaths.Clamp(value, 0, 255));
}

public static T Clamp<T>(T value, T min, T max) where T : IComparable<T>
{
if (value.CompareTo(min) < 0)
{
return min;
}

if (value.CompareTo(max) > 0)
{
return max;
}

return value;
}

最佳答案

您将ox2oy2 限制为目标 图像尺寸,而不是源尺寸。

改变这个:

// Width and height decreased by 1
int maxHeight = height - 1;
int maxWidth = width - 1;

为此:

// Width and height decreased by 1
int maxHeight = sourceHeight - 1;
int maxWidth = sourceWidth - 1;

关于c# - 正确执行双三次重采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32089277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com