问题描述
我正在将我的 ByteImage 输入缩小为[1/1,1/2上至1/10]。它对于1 / 10、1 / 2等偶数数字仍能正常工作,但对于奇数,例如1 / 3、1 / 7等。随着奇数的缩小,右上角保持不变,因此右下角会向右移,从而向右创建角度。
我将目标宽度,高度作为处理的输入
int width = Math.Max(image.Image.Width / reductionFactor,1); //target width
int height = Math.Max(image.Image.Height / reductionFactor,1); //target height
从用户界面输入 reductionFactor 的地方,该数字可以为1 / [1至10] 和 image 对象是自定义图像类的引用,它们具有自己的width和height属性。 我在下面这样称呼主要的图像处理方法。 srcWidth 是图像的原始宽度或原始宽度。
var byteImage = new ByteImage(width,height,image.Image.PixelFormat,resizePixels(image.Image.Data,image.Image.Width,width,reductionFactor,image.Image.PixelFormat),null);
我的缩减方法如下所示
public ImmutableArray<byte> resizePixels(ImmutableArray<byte> data,int srcWidth,int width,int height,int downscalingFactor,ByteImagePixelFormat pixelFormat)
{
var builder = ImmutableArray.CreateBuilder<byte>(width * height * pixelFormat.GetBytesPerPixel());
builder.Count = builder.Capacity;
int srcIndex = 0;
int dstIndex = 0;
int incPixel = (downscalingFactor - 1) * pixelFormat.GetBytesPerPixel() + 1;
int incLine = (downscalingFactor - 1) * srcWidth * pixelFormat.GetBytesPerPixel();
switch (pixelFormat)
{
case ByteImagePixelFormat.Rgb:
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
builder[dstIndex++] = data[srcIndex++];
builder[dstIndex++] = data[srcIndex++];
builder[dstIndex++] = data[srcIndex];
srcIndex += incPixel;
}
srcIndex += incLine;
}
break;
case ByteImagePixelFormat.Argb:
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
builder[dstIndex++] = data[srcIndex++];
builder[dstIndex++] = data[srcIndex++];
builder[dstIndex++] = data[srcIndex++];
builder[dstIndex++] = data[srcIndex];
srcIndex += incPixel;
}
srcIndex += incLine;
}
break;
}
return builder.ToImmutable();
}
}
我发现如果我忽略下面的这一行,它将与目标图像形成更多角度
int incLine = (downscalingFactor - 1) * srcWidth * pixelFormat.GetBytesPerPixel();
在某些地方,我在计算缺失的像素时却计算出了我所相信的像素。
解决方法
我相信您是对的,并且仅在该行出现问题
alfa=0.05
sample <- rpois(100,5)
pv <- 1-ppois(5,5)
power <- 1 - exp(-alfa)
请尝试
int incLine = (downscalingFactor - 1) * srcWidth * pixelFormat.GetBytesPerPixel();