使用最近邻居算法C#图像缩小存在奇数收缩的问题

时间:2020-11-03 08:37:05

标签: c# algorithm image-processing image-resizing nearest-neighbor

我正在将我的 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, height, 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();

在某些地方,我在计算缺失的像素时却计算出了我所相信的像素。

1 个答案:

答案 0 :(得分:1)

我相信您是对的,并且仅在该行出现问题

alfa=0.05
sample <- rpois(100,5)
pv <- 1-ppois(5,5)
power <- 1 - exp(-alfa)

请尝试

 int incLine = (downscalingFactor - 1) * srcWidth * pixelFormat.GetBytesPerPixel();
相关问题