c# - 在 C# 中将每个像素 2 个字节的 MONO-16 位图像转换为每个像素 1 个字节的 MONO-16 位

标签 c# .net image-processing emgucv

我在 C# 中工作,我有一个单色相机返回给我两个连续的图像。我想减去这些图像。

相机设置为 MONO-16,分辨率为 1980x960。

相机返回给我一个包含 2457600 个元素的向量,因为每个像素由两个字节表示,所以 {1980x960 = 1228800} * 2 字节/像素 = 2457600

问题是我必须将两个 2457600 元素向量转换为两个 1228800 向量才能进行减法。

所以我需要将 2457600 的两个连续元素组合成一个元素,这样我最终得到一个包含 1228800 个元素的向量,其中它的元素具有 16 位范围 (0-65536)。

我可能必须创建一个循环来迭代 1228800 次,并且在每次迭代中从 2457600 向量中取出两个元素:

  for(int i = 0 ; i < 2457600 ; i = i + 2)
  {
     byte BYTE1 = newGrabResultInternal2.ImageData.Buffer[i];
     byte BYTE2 = newGrabResultInternal2.ImageData.Buffer[i+1];        
     // What to do next to combine the 2 bytes into one???
  }

当我有代表 1 个像素的两个字节时,如何将它们组合在一起以获得 16 位深度 (0-65536) 的强度值?

此外,如果您能提出不同的方法,那将会很有帮助。

最佳答案

您可以为此使用位操作:

for(int i=0;i<2457600;i=i+2)
{
  byte BYTE1 = newGrabResultInternal2.ImageData.Buffer[i];
  byte BYTE2 = newGrabResultInternal2.ImageData.Buffer[i+1];        

   int pixel = ((int)BYTE1 << 8) | ((int)BYTE2);
 }

这会将 BYTE1 左移 8 位,然后将其与 BYTE2 组合。

这将使 BYTE1 成为高字节,而 BYTE2 成为低字节。如果您想要相反的方式,则需要交换它们。

关于c# - 在 C# 中将每个像素 2 个字节的 MONO-16 位图像转换为每个像素 1 个字节的 MONO-16 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31916476/

相关文章:

c# - 如何测试线程是否持有 C# 中的对象锁?

.net - 如何从 Web 服务 JSON 数组或对象反序列化?

android - 如何使用 OpenCV 校正 RotatedRect 偏斜?

python - 给定 OpenCV/Python 中 'S' 形状边缘的轮廓,可以使用什么方法沿着形状的中心追踪曲线?

c# - 正则表达式匹配除

c# - 如何在 .Net 核心控制台应用程序中使用依赖注入(inject)

c# - 为什么 IList<T> 不提供 List<T> 提供的所有方法?我应该使用哪个?

.net - 如何在 .NET 2 中同时迭代两个 IEnumerable

c++ - 如何正确使用opencv在图像上使用傅里叶变换对?

c# - RsaSecurityKey 不将 RSAParameters 作为参数