C# 图像处理技术-直接操作目标图像还是虚拟化?
我需要将一系列在地理坐标系中被引用的ariel图像重新投影到UTM投影中。我曾读到,使用getPixel和setPixel可能会很慢-应该设置一系列二维数组进行中间访问,然后在完成后将值刷新到目标图像C# 图像处理技术-直接操作目标图像还是虚拟化?,c#,image-processing,gdi+,C#,Image Processing,Gdi+,我需要将一系列在地理坐标系中被引用的ariel图像重新投影到UTM投影中。我曾读到,使用getPixel和setPixel可能会很慢-应该设置一系列二维数组进行中间访问,然后在完成后将值刷新到目标图像 这通常是由专业人员完成的图像处理吗?大多数图像处理是特征检测、场景分割、故障查找、分类和跟踪 你可能想看看这本书: C语言的图像处理(也适用于其他语言) 图像处理.原理和应用 它描述了许多快速有效的图像变换方法。这两本书在我处理图像时帮助了我:) 如果我理解你的问题。。。如果要重新对齐或组合许多图
这通常是由专业人员完成的图像处理吗?大多数图像处理是特征检测、场景分割、故障查找、分类和跟踪 你可能想看看这本书:
取决于图像。如果它们的大小是固定的,那么数组可能是好的。如果它们不同,那么最好实现一个系统,使用相对采样/平均来提供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,以匹配不同分辨率的图像?祝您的图像处理之旅好运!当我在该领域工作时,我发现它在技术层面上非常令人满意:)