C# 图像处理技术-直接操作目标图像还是虚拟化?

C# 图像处理技术-直接操作目标图像还是虚拟化?,c#,image-processing,gdi+,C#,Image Processing,Gdi+,我需要将一系列在地理坐标系中被引用的ariel图像重新投影到UTM投影中。我曾读到,使用getPixel和setPixel可能会很慢-应该设置一系列二维数组进行中间访问,然后在完成后将值刷新到目标图像 这通常是由专业人员完成的图像处理吗?大多数图像处理是特征检测、场景分割、故障查找、分类和跟踪 你可能想看看这本书: C语言的图像处理(也适用于其他语言) 图像处理.原理和应用 它描述了许多快速有效的图像变换方法。这两本书在我处理图像时帮助了我:) 如果我理解你的问题。。。如果要重新对齐或组合许多图

我需要将一系列在地理坐标系中被引用的ariel图像重新投影到UTM投影中。我曾读到,使用getPixel和setPixel可能会很慢-应该设置一系列二维数组进行中间访问,然后在完成后将值刷新到目标图像


这通常是由专业人员完成的图像处理吗?

大多数图像处理是特征检测、场景分割、故障查找、分类和跟踪

你可能想看看这本书:

  • C语言的图像处理(也适用于其他语言)
  • 图像处理.原理和应用
  • 它描述了许多快速有效的图像变换方法。这两本书在我处理图像时帮助了我:)

    如果我理解你的问题。。。如果要重新对齐或组合许多图像,但没有方向和位置,则可以使用这些算法重新对齐边缘和常见特征。如果您是按位置缝合,则这些算法将有助于重新采样/调整图像大小,以实现更高效的装配。也有一些开放源码库用于这些类型的东西。(脑海中浮现出OpenCV)

    编辑:如果我根据位置转换(是动态的,不是静态的)将大图像重新投影到新的投影中,我会考虑构建一个按需应用程序,该应用程序将根据所需的分辨率和所需的位置重构图像。然后,应用程序可以提取相关邻域图像的最近分辨率,并以所需分辨率提供结果

    没有更多的背景,我希望这有帮助

    编辑2: 以下答案的评论:
    取决于图像。如果它们的大小是固定的,那么数组可能是好的。如果它们不同,那么最好实现一个系统,使用相对采样/平均来提供get/setpixel,以匹配不同分辨率的图像

    我不知道你正在处理的图像的细节,以及你在做什么,但通常提取“像素”是什么而不是访问数组中的值是有用的。通过这种方式,您可以在后端实现转换、采样、旋转和校正算法。例如getvpix()或setvpix()。这在处理多个不同分辨率/格式的图像时可能更有用。像

    SetVPixel(img1, coord1, GetVPixel(img2, coord2))
    

    显然是以OOP/C的方式。img1和img2可以在大小、分辨率、地理位置、对齐方式或其他方面有所不同,前提是您的后端能够理解这两者。

    AFAIK GetPixel/SetPixel的开销是对它的调用,当访问阵列时没有调用,因此开销较小


    您应该从GetPixel/SetPixel开始,以后您可以随时覆盖这些调用以使用直接数据访问

    如果您不介意使用不安全的代码,可以将位图的位图数据包装到一个对象中,这样可以有效地获取和设置像素。下面的代码主要是从中摘取的,我自己也做了一些修改。如果位图格式不同,这不是最灵活的代码,但我希望它能说明如何更有效地操作位图

    public unsafe class RawBitmap : IDisposable
    {
        private BitmapData _bitmapData;
        private byte* _begin;
    
        public RawBitmap(Bitmap originBitmap)
        {
            OriginBitmap = originBitmap;
            _bitmapData = OriginBitmap.LockBits(new Rectangle(0, 0, OriginBitmap.Width, OriginBitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            _begin = (byte*)(void*)_bitmapData.Scan0;
        }
    
        #region IDisposable Members
    
        public void Dispose()
        {
            OriginBitmap.UnlockBits(_bitmapData);
        }
    
        #endregion
    
        public unsafe byte* Begin
        {
            get { return _begin; }
        }
    
        public unsafe byte* this[int x, int y]
        {
            get
            {
                return _begin + y * (_bitmapData.Stride) + x * 3;
            }
        }
    
        public unsafe byte* this[int x, int y, int offset]
        {
            get
            {
                return _begin + y * (_bitmapData.Stride) + x * 3 + offset;
            }
        }
    
        public unsafe void SetColor(int x, int y, Color color)
        {
            byte* p = this[x, y];
            p[0] = color.B;
            p[1] = color.G;
            p[2] = color.R;
        }
    
        public unsafe Color GetColor(int x, int y)
        {
            byte* p = this[x, y];
    
            return new Color
            (
                p[2],
                p[1],
                p[0]
            );
        }
    
        public int Stride
        {
            get { return _bitmapData.Stride; }
        }
    
        public int Width
        {
            get { return _bitmapData.Width; }
        }
    
        public int Height
        {
            get { return _bitmapData.Height; }
        }
    
        public int GetOffset()
        {
            return _bitmapData.Stride - _bitmapData.Width * 3;
        }
    
        public Bitmap OriginBitmap { get; private set; }
    }
    

    FreeImage库速度非常快,提供了一种可能有用的剪切粘贴功能。发行版附带了一个C#包装。

    取决于图像。如果它们的大小是固定的,那么数组可能是好的。如果它们不同,那么最好实现一个系统,使用相对采样/平均来提供get/setpixel,以匹配不同分辨率的图像?祝您的图像处理之旅好运!当我在该领域工作时,我发现它在技术层面上非常令人满意:)