Image JPEG质量问题

Image JPEG质量问题,image,ffmpeg,jpeg,mjpeg,Image,Ffmpeg,Jpeg,Mjpeg,我目前正在使用C#从内视镜中检索帧(通过FFMPEG库)。然而,几周前我遇到了一个问题,我无法解决它 图像以JPEG格式返回(因为内视镜流是MJPEG) 有些图像没有质量问题,但有些图像中间有一条奇怪的线。 然后随机染色。(在问题的末尾有一个正常图像和一个有问题的图像的例子) 通过分析文件的结构,我意识到其中存在一些差异,但我并不完全理解JPEG的二进制结构,我也不知道是什么损坏了 了解图像中损坏的内容(最终导致质量问题)对我来说非常重要,因为通过这一点,我可以使用C#丢弃帧。然而,如果不理解这

我目前正在使用C#从内视镜中检索帧(通过FFMPEG库)。然而,几周前我遇到了一个问题,我无法解决它

图像以JPEG格式返回(因为内视镜流是MJPEG)

有些图像没有质量问题,但有些图像中间有一条奇怪的线。 然后随机染色。(在问题的末尾有一个正常图像和一个有问题的图像的例子)

通过分析文件的结构,我意识到其中存在一些差异,但我并不完全理解JPEG的二进制结构,我也不知道是什么损坏了

了解图像中损坏的内容(最终导致质量问题)对我来说非常重要,因为通过这一点,我可以使用C#丢弃帧。然而,如果不理解这个问题,我甚至不能丢弃框架,更不用说修复它了

那么,以没有质量问题的图像为参考,有质量问题的图像的二值结构有什么问题

示例:

JPEG 1:

(为了查看质量,不要从这里下载)

JPEG 2:

(为了查看质量,不要从这里下载)

可以通过在线十六进制编辑器(如:、或)查看图像的二进制结构


感谢您的阅读,祝您度过愉快的一天

该文件至少有两个问题


通过运行以下命令,我可以使用ImageMagick检测到的第一个:

magick identify -verbose image.jpg
exiftool -v -v -v outExemplo0169.jpeg 

  ExifToolVersion = 11.11
  FileName = outExemplo0169.jpeg
  Directory = .
  FileSize = 66214
  FileModifyDate = 1582743337
  FileAccessDate = 1582743559
  FileInodeChangeDate = 1582743337
  FilePermissions = 33188
  FileType = JPEG
  FileTypeExtension = JPG
  MIMEType = image/jpeg
JPEG APP0 (14 bytes):
    0006: 4a 46 49 46 00 01 01 00 00 01 00 01 00 00       [JFIF..........]
  + [BinaryData directory, 9 bytes]
  | JFIFVersion = 1 1
  | - Tag 0x0000 (2 bytes, int8u[2]):
  |     000b: 01 01                                           [..]
  | ResolutionUnit = 0
  | - Tag 0x0002 (1 bytes, int8u[1]):
  |     000d: 00                                              [.]
  | XResolution = 1
  | - Tag 0x0003 (2 bytes, int16u[1]):
  |     000e: 00 01                                           [..]
  | YResolution = 1
  | - Tag 0x0005 (2 bytes, int16u[1]):
  |     0010: 00 01                                           [..]
  | ThumbnailWidth = 0
  | - Tag 0x0007 (1 bytes, int8u[1]):
  |     0012: 00                                              [.]
  | ThumbnailHeight = 0
  | - Tag 0x0008 (1 bytes, int8u[1]):
  |     0013: 00                                              [.]
JPEG SOF0 (15 bytes):
    0018: 08 01 e0 02 80 03 01 21 00 02 11 01 03 11 01    [.......!.......]
  ImageWidth = 640
  ImageHeight = 480
  EncodingProcess = 0
  BitsPerSample = 8
  ColorComponents = 3
JPEG DQT (130 bytes):
    002b: 00 03 03 03 03 03 03 04 03 03 03 04 04 04 05 06 [................]
    003b: 09 06 06 05 05 06 0c 08 09 07 09 0e 0c 0e 0e 0d [................]
    004b: 0c 0d 0d 0f 11 15 12 0f 10 14 10 0d 0d 13 19 13 [................]
    005b: 14 16 17 18 18 18 0f 12 1a 1c 1a 17 1c 15 17 18 [................]
    006b: 17 01 04 04 04 06 05 06 0b 06 06 0b 17 0f 0d 0f [................]
    007b: 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 [................]
    008b: 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 [................]
    [snip 18 bytes]
JPEG DHT (416 bytes):
    00b1: 00 00 01 05 01 01 01 01 01 01 00 00 00 00 00 00 [................]
    00c1: 00 00 01 02 03 04 05 06 07 08 09 0a 0b 10 00 02 [................]
    00d1: 01 03 03 02 04 03 05 05 04 04 00 00 01 7d 01 02 [.............}..]
    00e1: 03 00 04 11 05 12 21 31 41 06 13 51 61 07 22 71 [......!1A..Qa."q]
    00f1: 14 32 81 91 a1 08 23 42 b1 c1 15 52 d1 f0 24 33 [.2....#B...R..$3]
    0101: 62 72 82 09 0a 16 17 18 19 1a 25 26 27 28 29 2a [br........%&'()*]
    0111: 34 35 36 37 38 39 3a 43 44 45 46 47 48 49 4a 53 [456789:CDEFGHIJS]
    [snip 304 bytes]
JPEG SOS
JPEG EOI
Unknown trailer (50 bytes at offset 0x10274):
   10274: 42 6f 75 6e 64 61 72 79 45 42 6f 75 6e 64 61 72 [BoundaryEBoundar]
   10284: 79 53 00 00 01 00 90 08 01 00 fb 4b db 6a 2a 22 [yS.........K.j*"]
   10294: 00 00 2a 22 00 00 01 00 01 00 80 02 00 00 e0 01 [..*"............]
   102a4: 00 00        
它告诉我数据段过早结束

Image: outExemplo0169.jpeg
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Mime type: image/jpeg
  Class: DirectClass
  Geometry: 640x480+0+0
  Units: Undefined
  Colorspace: sRGB
  Type: TrueColor
  Base type: Undefined
  Endianess: Undefined
  Depth: 8-bit
  Channel depth:
    Red: 8-bit
    Green: 8-bit
    Blue: 8-bit
  Channel statistics:
    Pixels: 307200
    Red:
      min: 0  (0)
      max: 255 (1)
      mean: 107.234 (0.420527)
      standard deviation: 66.7721 (0.261851)
      kurtosis: -0.67934
      skewness: 0.577494
      entropy: 0.92876
    Green:
      min: 0  (0)
:2020-02-26T18:59:19+00:00 0:00.057 0.070u 7.0.9 Resource identify[80956]: resource.c/RelinquishMagickResource/1067/Resource
  Memory: 3686400B/0B/32GiB
identify: Corrupt JPEG data: premature end of data segment `outExemplo0169.jpeg' @ warning/jpeg.c/JPEGWarningHandler/399.

运行此命令时,使用exiftool可以看到的第二个问题是:

magick identify -verbose image.jpg
exiftool -v -v -v outExemplo0169.jpeg 

  ExifToolVersion = 11.11
  FileName = outExemplo0169.jpeg
  Directory = .
  FileSize = 66214
  FileModifyDate = 1582743337
  FileAccessDate = 1582743559
  FileInodeChangeDate = 1582743337
  FilePermissions = 33188
  FileType = JPEG
  FileTypeExtension = JPG
  MIMEType = image/jpeg
JPEG APP0 (14 bytes):
    0006: 4a 46 49 46 00 01 01 00 00 01 00 01 00 00       [JFIF..........]
  + [BinaryData directory, 9 bytes]
  | JFIFVersion = 1 1
  | - Tag 0x0000 (2 bytes, int8u[2]):
  |     000b: 01 01                                           [..]
  | ResolutionUnit = 0
  | - Tag 0x0002 (1 bytes, int8u[1]):
  |     000d: 00                                              [.]
  | XResolution = 1
  | - Tag 0x0003 (2 bytes, int16u[1]):
  |     000e: 00 01                                           [..]
  | YResolution = 1
  | - Tag 0x0005 (2 bytes, int16u[1]):
  |     0010: 00 01                                           [..]
  | ThumbnailWidth = 0
  | - Tag 0x0007 (1 bytes, int8u[1]):
  |     0012: 00                                              [.]
  | ThumbnailHeight = 0
  | - Tag 0x0008 (1 bytes, int8u[1]):
  |     0013: 00                                              [.]
JPEG SOF0 (15 bytes):
    0018: 08 01 e0 02 80 03 01 21 00 02 11 01 03 11 01    [.......!.......]
  ImageWidth = 640
  ImageHeight = 480
  EncodingProcess = 0
  BitsPerSample = 8
  ColorComponents = 3
JPEG DQT (130 bytes):
    002b: 00 03 03 03 03 03 03 04 03 03 03 04 04 04 05 06 [................]
    003b: 09 06 06 05 05 06 0c 08 09 07 09 0e 0c 0e 0e 0d [................]
    004b: 0c 0d 0d 0f 11 15 12 0f 10 14 10 0d 0d 13 19 13 [................]
    005b: 14 16 17 18 18 18 0f 12 1a 1c 1a 17 1c 15 17 18 [................]
    006b: 17 01 04 04 04 06 05 06 0b 06 06 0b 17 0f 0d 0f [................]
    007b: 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 [................]
    008b: 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 [................]
    [snip 18 bytes]
JPEG DHT (416 bytes):
    00b1: 00 00 01 05 01 01 01 01 01 01 00 00 00 00 00 00 [................]
    00c1: 00 00 01 02 03 04 05 06 07 08 09 0a 0b 10 00 02 [................]
    00d1: 01 03 03 02 04 03 05 05 04 04 00 00 01 7d 01 02 [.............}..]
    00e1: 03 00 04 11 05 12 21 31 41 06 13 51 61 07 22 71 [......!1A..Qa."q]
    00f1: 14 32 81 91 a1 08 23 42 b1 c1 15 52 d1 f0 24 33 [.2....#B...R..$3]
    0101: 62 72 82 09 0a 16 17 18 19 1a 25 26 27 28 29 2a [br........%&'()*]
    0111: 34 35 36 37 38 39 3a 43 44 45 46 47 48 49 4a 53 [456789:CDEFGHIJS]
    [snip 304 bytes]
JPEG SOS
JPEG EOI
Unknown trailer (50 bytes at offset 0x10274):
   10274: 42 6f 75 6e 64 61 72 79 45 42 6f 75 6e 64 61 72 [BoundaryEBoundar]
   10284: 79 53 00 00 01 00 90 08 01 00 fb 4b db 6a 2a 22 [yS.........K.j*"]
   10294: 00 00 2a 22 00 00 01 00 01 00 80 02 00 00 e0 01 [..*"............]
   102a4: 00 00        
因此,末尾有50个无关字节,包括文本字符串“BoundaryEBoundaryS”,您可以识别它来自处理链中的其他地方

您可以对JPEG质量进行的一个测试是检查最后2个字节是否是有效的EOI,这意味着它应该以
FF D9
结尾-请参见。

因此,正如我提到的这个C#app从boroscope获取帧一样,我有很多帧,有些有问题,有些没有问题。为了验证您分析的内容,我编写了另一个代码,该代码只接受最终字节为0xFF和0xD9(或D8)的图像。然而,发生的情况是,好的图像和坏的图像都没有正确的EOI(实际上,它们出现了,但只是在这50字节的垃圾之前)。所以,我认为,质量问题不是来自EOI问题。